docker-compose搭建xxl-job、mysql
- 1、搭建docker以及docker-compose
- 2、下载xxl-job需要数据库脚本
- 3、创建文件夹以及docker-compose文件
- 4、坑来了
- 5、正确配置
- 6、验证-运行成功
1、搭建docker以及docker-compose
略
2、下载xxl-job需要数据库脚本
下载地址:https://gitee.com/xuxueli0323/xxl-job/blob/2.3.0/doc/db/tables_xxl_job.sql
3、创建文件夹以及docker-compose文件
tables_xxl_job.sql放到docker-entrypoint-initdb.d文件夹中
并且添加文件给创建的用户赋予权限
GRANT ALL PRIVILEGES ON xxl_job.* TO 'admin'@'%';
FLUSH PRIVILEGES;
.env文件
BASE_DIR=/mnt/docker/demo-xxljob
MYSQL_CONTAINER_NAME= xxl-job-mysql
XXLJOB_CONTAINER_NAME= xxl-job-admin
XXLJOB_MYSQL_PORT=3306
XXLJOB_MYSQL_DATABASE=xxl_job
XXLJOB_MYSQL_USERNAME=root
XXLJOB_MYSQL_PASSWORD=123456
.env文件可以使变量写入到docker-compose文件,这样之后修改的话,可以只修改env文件中的值
docker-compose文件
version: "3.8"
networks:xxljob:driver: bridge
services:mysql:image: mysql:8.0container_name: ${MYSQL_CONTAINER_NAME} # 容器名为'xxl-job-mysql'restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录- ${BASE_DIR}/mysql/data:/var/lib/mysql- ${BASE_DIR}/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf- ${BASE_DIR}/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d # 可执行初始化sql脚本的目录 -- tips:`/var/lib/mysql`目录下无数据的时候才会执行(即第一次启动的时候才会执行)environment: # 设置环境变量,相当于docker run命令中的-eTZ: Asia/ShanghaiLANG: en_US.UTF-8MYSQL_ROOT_PASSWORD: 123456 # 设置root用户密码MYSQL_USER: ${XXLJOB_MYSQL_USERNAME}MYSQL_PASSWORD: ${XXLJOB_MYSQL_PASSWORD}MYSQL_ROOT_HOST: '%'MYSQL_USER_HOST: '%'ports: # 映射端口- "3306:3306"networks:- xxljobxxl-job-admin:image: xuxueli/xxl-job-admin:2.3.0 # 原镜像`xuxueli/xxl-job-admin:2.3.0`container_name: ${XXLJOB_CONTAINER_NAME}environment:# TODO 根据自己的配置修改,配置项参考源码文件:/xxl-job/xxl-job-admin/src/main/resources/application.propertiesPARAMS: >---spring.datasource.url=jdbc:mysql://${MYSQL_CONTAINER_NAME}:${XXLJOB_MYSQL_PORT}/xxl_job?useUnicode=true&useSSL=false&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai--spring.datasource.username=${XXLJOB_MYSQL_USERNAME}--spring.datasource.password=${XXLJOB_MYSQL_PASSWORD}--server.servlet.context-path=/xxl-job-admin--spring.mail.host=smtp.qq.com--spring.mail.port=25--spring.mail.username=xxx@qq.com--spring.mail.from=xxx@qq.com--spring.mail.password=xxx--xxl.job.accessToken=ports:- "8080:8080"depends_on:- mysqlrestart: alwaysprivileged: true #为容器赋予更多权限,避免某些受限操作失败。volumes:- ${BASE_DIR}/xxl-job/logs:/data/applogsnetworks:- xxljob
4、坑来了
2024-11-27 22:59:09,218 ERROR [xxl-job, admin JobLogReportHelper] com.zaxxer.hikari.pool.HikariPool [HikariPool.java : 593] HikariCP - Exception during pool initialization.
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:903)at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828)at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560)at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80)at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67)at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:337)at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)at com.sun.proxy.$Proxy70.selectOne(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)at com.sun.proxy.$Proxy71.findLogReport(Unknown Source)at com.xxl.job.admin.core.thread.JobLogReportHelper$1.run(JobLogReportHelper.java:71)at java.lang.Thread.run(Thread.java:748)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89)at com.mysql.cj.NativeSession.connect(NativeSession.java:144)at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:847)... 39 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)at java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:607)at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)... 41 common frames omitted
2024-11-27 22:59:09,220 INFO [xxl-job, admin JobScheduleHelper#scheduleThread] com.zaxxer.hikari.HikariDataSource [HikariDataSource.java : 110] HikariCP - Starting...
2024-11-27 22:59:09,234 ERROR [xxl-job, admin JobLogReportHelper] c.x.j.a.c.thread.JobLogReportHelper [JobLogReportHelper.java : 92] >>>>>>>>>>> xxl-job, job log report thread error:{}
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
### The error may exist in class path resource [mybatis-mapper/XxlJobLogMapper.xml]
### The error may involve com.xxl.job.admin.dao.XxlJobLogDao.findLogReport
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)at com.sun.proxy.$Proxy70.selectOne(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)at com.sun.proxy.$Proxy71.findLogReport(Unknown Source)at com.xxl.job.admin.core.thread.JobLogReportHelper$1.run(JobLogReportHelper.java:71)at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
### The error may exist in class path resource [mybatis-mapper/XxlJobLogMapper.xml]
### The error may involve com.xxl.job.admin.dao.XxlJobLogDao.findLogReport
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)... 8 common frames omitted
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80)at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67)at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:337)at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)... 15 common frames omitted
Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
大概意思是无法连接,在你的 JDBC 连接字符串中添加 allowPublicKeyRetrieval=true 参数。这允许 JDBC 驱动程序检索公钥
5、正确配置
version: "3.8"
networks:xxljob:driver: bridge
services:mysql:image: mysql:8.0container_name: ${MYSQL_CONTAINER_NAME} # 容器名为'xxl-job-mysql'restart: unless-stopped # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录- ${BASE_DIR}/mysql/data:/var/lib/mysql- ${BASE_DIR}/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf- ${BASE_DIR}/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d # 可执行初始化sql脚本的目录 -- tips:`/var/lib/mysql`目录下无数据的时候才会执行(即第一次启动的时候才会执行)environment: # 设置环境变量,相当于docker run命令中的-eTZ: Asia/ShanghaiLANG: en_US.UTF-8MYSQL_ROOT_PASSWORD: 123456 # 设置root用户密码MYSQL_USER: ${XXLJOB_MYSQL_USERNAME}MYSQL_PASSWORD: ${XXLJOB_MYSQL_PASSWORD}MYSQL_ROOT_HOST: '%'MYSQL_USER_HOST: '%'ports: # 映射端口- "3306:3306"networks:- xxljobxxl-job-admin:image: xuxueli/xxl-job-admin:2.3.0 # 原镜像`xuxueli/xxl-job-admin:2.3.0`container_name: ${XXLJOB_CONTAINER_NAME}environment:# TODO 根据自己的配置修改,配置项参考源码文件:/xxl-job/xxl-job-admin/src/main/resources/application.propertiesPARAMS: >---spring.datasource.url=jdbc:mysql://${MYSQL_CONTAINER_NAME}:${XXLJOB_MYSQL_PORT}/xxl_job?useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai--spring.datasource.username=${XXLJOB_MYSQL_USERNAME}--spring.datasource.password=${XXLJOB_MYSQL_PASSWORD}--server.servlet.context-path=/xxl-job-admin--spring.mail.host=smtp.qq.com--spring.mail.port=25--spring.mail.username=xxx@qq.com--spring.mail.from=xxx@qq.com--spring.mail.password=xxx--xxl.job.accessToken=ports:- "8080:8080"depends_on:- mysqlrestart: alwaysprivileged: true #为容器赋予更多权限,避免某些受限操作失败。volumes:- ${BASE_DIR}/xxl-job/logs:/data/applogsnetworks:- xxljob
6、验证-运行成功
本人最近在使用docker尝试配置各种容器,有兴趣的小伙伴可以一起研究。