Docker Compose 一键部署 XXL-Job:从零搭建企业级任务调度中心

📅 发布时间:2026/7/8 21:51:50 👁️ 浏览次数:
Docker Compose 一键部署 XXL-Job:从零搭建企业级任务调度中心
1. 为什么你需要一个“企业级”的任务调度中心如果你正在开发一个稍微有点规模的系统比如一个电商网站、一个内容管理后台或者一个需要定时处理数据的分析平台那你肯定遇到过这样的问题那个用来发促销短信的定时任务怎么又没执行那个每天凌晨要跑的报表生成脚本为什么今天卡住了没人知道手动在服务器上写个 crontab 虽然简单但任务一多管理起来就是一团乱麻。哪个任务成功了哪个失败了日志在哪里完全靠“人肉运维”出了问题只能抓瞎。这时候一个集中式的任务调度平台就显得至关重要了。它就像是你所有后台任务的“总指挥中心”。而XXL-Job就是国内开发者圈子里非常流行的一个选择。它设计轻量学习成本低但功能却相当齐全支持动态添加任务、丰富的任务执行策略如 Cron 表达式、完整的执行日志和报警机制。简单说有了它你就能在一个漂亮的 Web 界面上清晰地管理、监控和操作你所有的定时任务再也不用去服务器上翻日志文件了。那么怎么把这个“总指挥中心”搭建起来呢传统方式可能需要你下载源码、配置 Java 环境、搞个 MySQL、修改一堆配置文件、打包部署……步骤繁琐而且一旦换台机器或者想搞个测试环境又得重来一遍非常容易出“在我机器上是好的”这种问题。这就是Docker Compose出场的时候了。你可以把它理解为一个“一键部署”的脚本。我们把 XXL-Job 调度中心、它依赖的 MySQL 数据库甚至将来可能用到的 Redis 缓存都打包成一个个独立的容器Container然后用一个docker-compose.yml文件定义它们之间的关系和配置。最后你只需要一条命令docker-compose up -d所有服务就会按照既定的顺序和配置自动启动、连接形成一个完整可用的系统。这种方式最大的好处就是环境一致性无论是在你本地 Mac 电脑上开发测试还是在公司的 Linux 测试服务器或者最终的云端生产环境只要 Docker 能跑你的 XXL-Job 就能以完全相同的方式跑起来彻底告别环境差异带来的部署噩梦。所以这篇文章就是带你从零开始用 Docker Compose 这个“神器”快速搭建一个开箱即用、生产就绪的 XXL-Job 企业级任务调度中心。我会把每一步的原理、配置的细节、以及我实际踩过的坑都讲清楚让你不仅能搭起来更能理解为什么这么搭。2. 动手之前搞定你的基础环境万事开头先备料。用 Docker Compose 部署前提是你的机器上得有 Docker 和 Docker Compose。别担心这一步现在非常简单。2.1 安装 Docker 引擎Docker 是容器化技术的核心它负责创建和运行容器。安装方法因操作系统而异。对于 Linux 系统以 Ubuntu 20.04 为例我推荐使用官方仓库安装这样后续更新管理都方便。打开终端依次执行下面这些命令# 1. 更新现有的软件包列表 sudo apt-get update # 2. 安装一些必要的工具让 apt 能通过 HTTPS 使用仓库 sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # 3. 添加 Docker 的官方 GPG 密钥用于验证软件包的完整性 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 4. 将官方的 Docker 仓库添加到你的系统源里 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable # 5. 再次更新源确保能获取到 Docker 仓库的信息 sudo apt-get update # 6. 安装 Docker 社区版 (Docker CE) sudo apt-get install -y docker-ce docker-ce-cli containerd.io安装完成后运行sudo docker --version应该能看到版本号。为了让普通用户也能不用sudo直接运行 Docker 命令这很重要不然每次都要输密码我们需要把当前用户加入docker用户组sudo usermod -aG docker $USER注意执行完这条命令后你需要完全退出当前终端会话并重新登录这个改动才会生效。重新登录后再运行docker --version试试应该就不需要sudo了。对于 macOS 和 Windows事情就更简单了。直接去 Docker 官网下载Docker Desktop安装包。这是一个集成了 Docker 引擎、图形化管理界面和 Docker Compose 的一体化应用。安装过程基本就是一路点击“下一步”。安装完成后在应用列表里找到 Docker Desktop 并启动它你会看到系统托盘区出现一个小鲸鱼图标等它状态稳定通常图标不再动画就说明 Docker 服务已经就绪了。你可以在终端里直接使用docker和docker-compose命令了。2.2 安装 Docker ComposeDocker Compose 是一个用来定义和运行多容器应用的工具。在 Linux 上我们需要单独安装它。虽然现在有更新的docker compose作为 Docker 插件V2 版本但为了兼容性我们暂时使用经典的独立docker-compose。# 下载特定版本的 docker-compose 二进制文件到 /usr/local/bin 目录 # 这里以 1.29.2 为例这是一个非常稳定且广泛使用的版本 sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 给这个文件加上可执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装是否成功 docker-compose --version # 如果看到类似 docker-compose version 1.29.2, build xxxxxxx 的输出就说明搞定了。对于 macOS 和 Windows 用户Docker Desktop 已经自带了 Docker Compose所以你不需要执行上述步骤直接就可以用。环境准备好后我建议先跑个简单的命令测试一下整套工具链是否工作正常比如docker run hello-world。如果能看到欢迎信息恭喜你基础舞台已经搭建完毕我们可以开始“重头戏”了。3. 编写核心剧本深入拆解 Docker Compose 文件docker-compose.yml文件就是我们整个部署方案的“总剧本”。它用 YAML 格式清晰地描述了我们要运行哪些服务、每个服务用什么镜像、如何配置、服务之间如何联系。我们来创建一个专门的项目目录比如叫做xxl-job-docker然后在这个目录里创建这个核心文件。version: 3.8 services: mysql-for-xxljob: image: mysql:8.0 container_name: xxl-job-mysql restart: unless-stopped ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: AStrongPassword123! # 生产环境务必使用强密码 MYSQL_DATABASE: xxl_job TZ: Asia/Shanghai # 设置容器内时区避免时间错乱 volumes: - ./data/mysql:/var/lib/mysql - ./config/mysql/conf.d:/etc/mysql/conf.d command: --default-authentication-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci networks: - xxl-job-network xxl-job-admin: image: xuxueli/xxl-job-admin:2.4.0 container_name: xxl-job-admin restart: unless-stopped depends_on: - mysql-for-xxljob ports: - 8080:8080 environment: PARAMS: --spring.datasource.urljdbc:mysql://mysql-for-xxljob:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai --spring.datasource.usernameroot --spring.datasource.passwordAStrongPassword123! --xxl.job.login.usernameadmin --xxl.job.login.passwordxxljobadmin456 volumes: - ./logs:/data/applogs networks: - xxl-job-network networks: xxl-job-network: driver: bridge这个文件比基础教程里的要丰富一些我们逐块来拆解看看每一部分都做了什么以及为什么这么做。3.1 网络定义让服务在内部安全通话文件最后定义的xxl-job-network是一个自定义的桥接网络。你可以把它想象成一个私有的内部局域网。mysql-for-xxljob和xxl-job-admin两个服务都加入了这个网络。在这个网络里容器之间可以通过服务名比如mysql-for-xxljob直接互相访问而不需要知道对方容器的 IP 地址IP 在容器重启时可能会变。这比使用默认的bridge网络更清晰、更隔离也避免了端口冲突。外部比如你的宿主机只能通过我们映射出来的端口3306, 8080来访问它们。3.2 MySQL 服务配置数据持久化的关键我特意将服务名从简单的mysql改为了mysql-for-xxljob这样更语义化避免与宿主机上可能已有的其他 MySQL 服务混淆。镜像与重启策略使用了mysql:8.0镜像。restart: unless-stopped意味着除非我们手动停止这个容器否则无论它因何原因退出Docker 都会自动重启它这对于数据库服务至关重要。端口映射3306:3306将容器内的 3306 端口映射到宿主机的 3306 端口。这样你本地的数据库客户端如 Navicat, DBeaver就可以直接连上去了。注意如果宿主机 3306 端口已被占用你需要修改前面的端口号比如3307:3306。环境变量除了设置 root 密码和创建数据库我增加了TZ: Asia/Shanghai。任务调度对时间非常敏感统一时区能避免很多诡异的问题。数据卷挂载这是企业级部署的核心./data/mysql:/var/lib/mysql把容器内 MySQL 的数据目录挂载到了宿主机的./data/mysql目录下。这意味着即使你删除了mysql-for-xxljob这个容器你的数据库数据依然安全地保留在宿主机硬盘上。下次启动一个新容器并挂载同一个目录数据就全回来了。./config/mysql/conf.d:/etc/mysql/conf.d则允许你放置自定义的 MySQL 配置文件如my.cnf方便调整性能参数。启动命令command部分覆盖了镜像的默认启动命令我们在这里指定了使用mysql_native_password认证插件兼容一些老客户端并设置了默认的字符集为utf8mb4以支持完整的 Unicode包括 Emoji 表情。3.3 XXL-Job Admin 服务配置调度中心本体镜像版本使用了较新的2.4.0版本你可以根据需要调整。依赖关系depends_on: - mysql-for-xxljob告诉 Docker Compose在启动xxl-job-admin之前必须先启动mysql-for-xxljob。但这只保证启动顺序不保证数据库已完全初始化就绪。好在 XXL-Job 应用本身有重连机制。环境变量 PARAMS这是向 XXL-Job 传递 Java 启动参数的关键。我用了一个 YAML 的多行字符串让配置更清晰。这里配置了数据库连接注意这里的jdbc:mysql://mysql-for-xxljob:3306/xxl_job主机名直接用了服务名mysql-for-xxljob这正是我们自定义网络带来的便利。我添加了useSSLfalse和allowPublicKeyRetrievaltrue参数避免在测试环境因 SSL 导致的连接问题生产环境请考虑启用 SSL。登录凭证--xxl.job.login.username和--xxl.job.login.password用来设置调度中心 Web 界面的管理员账号密码。请务必修改默认密码日志挂载./logs:/data/applogs将 XXL-Job 的应用日志挂载出来方便你直接在宿主机上查看和收集日志比如用tail -f logs/xxl-job-admin.log来实时监控。这个docker-compose.yml文件已经具备了生产环境部署的雏形自定义网络隔离、数据持久化、配置外部化、时区统一。理解每一行的作用你就能举一反三用它来部署其他类似的应用组合。4. 启动与初始化让调度中心跑起来剧本写好了演员镜像就位现在可以开机了。4.1 启动所有服务在你的xxl-job-docker目录下打开终端执行那条神奇的“一键部署”命令docker-compose up -d-d参数代表“detached”让服务在后台运行。你会看到 Docker 开始拉取镜像如果本地没有的话然后依次创建网络、启动 MySQL 容器、启动 XXL-Job 容器。这个过程可能需要一两分钟取决于你的网速。启动后用docker-compose ps命令查看状态。当两个服务的状态都是Up时就表示容器启动成功了。CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xxxxxxxxxxxx xuxueli/xxl-job-admin:2.4.0 java -jar /app.jar … 2 minutes ago Up 2 minutes 0.0.0.0:8080-8080/tcp xxl-job-admin xxxxxxxxxxxx mysql:8.0 docker-entrypoint.s… 2 minutes ago Up 2 minutes 0.0.0.0:3306-3306/tcp, 33060/tcp xxl-job-mysql4.2 初始化数据库表结构容器虽然起来了但 MySQL 里的xxl_job数据库还是个空壳。XXL-Job 运行需要一系列的表来存储任务、日志等信息。我们需要执行初始化 SQL 脚本。首先去 XXL-Job 的 GitHub 仓库https://github.com/xuxueli/xxl-job找到 SQL 脚本。通常它在/doc/db/tables_xxl_job.sql路径下。你可以直接下载这个 raw 文件。假设你把它下载到了当前目录。然后通过 Docker 命令将这个 SQL 文件导入到正在运行的 MySQL 容器中# 将宿主机的 tables_xxl_job.sql 文件通过管道传递给容器内的 mysql 客户端执行 docker exec -i xxl-job-mysql mysql -uroot -pAStrongPassword123! xxl_job tables_xxl_job.sql执行成功后不会有太多输出。你可以登录 MySQL 容器验证一下docker exec -it xxl-job-mysql mysql -uroot -pAStrongPassword123! # 进入 MySQL 命令行后 use xxl_job; show tables;你应该能看到一系列以xxl_job_开头的表比如xxl_job_info,xxl_job_log等。4.3 验证与登录现在打开你的浏览器访问http://localhost:8080/xxl-job-admin。如果一切顺利你将看到 XXL-Job 的登录界面。使用我们在docker-compose.yml里设置的用户名admin和密码xxljobadmin456进行登录。首次登录后我强烈建议你立即在“用户管理”里修改这个密码。登录进去后你就进入了 XXL-Job 的调度中心管理后台。在这里你可以执行器管理添加你的业务应用即真正执行定时任务的程序称为“执行器”。任务管理创建、编辑、启用/禁用定时任务并指派给特定的执行器。调度日志查看每一次任务触发的详细日志包括执行成功、失败、耗时等信息。用户管理添加其他管理员或普通用户。看到这个界面就意味着你的企业级任务调度中心已经成功搭建并运行起来了5. 进阶配置与生产环境考量一个能跑起来的系统只是第一步要用于生产环境我们还需要考虑更多。下面这些是我在真实项目中总结的经验和配置。5.1 如何管理配置文件告别硬编码把数据库密码、登录密码直接写在docker-compose.yml里不是好习惯尤其是这个文件可能会提交到代码仓库。更专业的做法是使用环境变量文件。在docker-compose.yml同级目录下创建一个名为.env的文件注意开头有个点# .env 文件 MYSQL_ROOT_PASSWORDYourSuperStrongPasswordHere! XXL_JOB_ADMIN_PASSWORDAnotherStrongPasswordForAdmin! TZAsia/Shanghai然后修改docker-compose.yml用${变量名}的方式引用environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: xxl_job TZ: ${TZ}对于 XXL-Job 的PARAMS由于它本身是一个长字符串我们可以在.env中定义部分然后在docker-compose.yml中拼接environment: PARAMS: --spring.datasource.urljdbc:mysql://mysql-for-xxljob:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezone${TZ} --spring.datasource.usernameroot --spring.datasource.password${MYSQL_ROOT_PASSWORD} --xxl.job.login.usernameadmin --xxl.job.login.password${XXL_JOB_ADMIN_PASSWORD}重要务必把.env文件添加到你的.gitignore中防止敏感信息泄露。在服务器上部署时只需创建这个.env文件并填入实际值即可。Docker Compose 会自动读取它。5.2 资源限制与健康检查保障稳定性在docker-compose.yml中我们可以为服务添加资源限制防止某个容器“吃光”所有服务器资源。services: mysql-for-xxljob: # ... 其他配置 ... deploy: # 注意在 version: 3.8 下deploy 部分在非 Swarm 模式下可能被忽略更通用的方式是使用 resources resources: limits: memory: 1G cpus: 1.0 reservations: memory: 512M cpus: 0.5 healthcheck: # 健康检查确保数据库真正就绪 test: [CMD, mysqladmin, ping, -h, localhost, -uroot, -p${MYSQL_ROOT_PASSWORD}] interval: 30s timeout: 10s retries: 3 start_period: 40s xxl-job-admin: # ... 其他配置 ... depends_on: mysql-for-xxljob: condition: service_healthy # 等待 MySQL 健康检查通过后再启动 resources: limits: memory: 512M cpus: 0.5healthcheck非常有用它让xxl-job-admin可以等待 MySQL 完全准备好而不仅仅是容器进程启动之后再启动避免了应用启动时连接数据库失败的问题。5.3 如何更新版本与日常维护更新 XXL-Job 版本非常简单。修改docker-compose.yml中xxl-job-admin的image标签比如改成xuxueli/xxl-job-admin:2.4.1然后运行docker-compose pull xxl-job-admin # 拉取新镜像 docker-compose up -d xxl-job-admin # 重新创建并启动这个服务Docker Compose 会自动停止旧容器用新镜像启动新容器查看日志# 查看 xxl-job-admin 的实时日志 docker-compose logs -f xxl-job-admin # 查看 MySQL 的日志 docker-compose logs -f mysql-for-xxljob进入容器内部排查# 进入 MySQL 容器的 bash 环境 docker-compose exec mysql-for-xxljob bash # 进入 XXL-Job 容器查看 Java 进程 docker-compose exec xxl-job-admin sh备份与恢复数据因为我们已经把 MySQL 数据挂载到了./data/mysql备份这个目录即可。更精细的备份可以使用docker exec执行mysqldump命令。完全停止并清理慎用会删除容器但保留数据卷docker-compose down如果想把数据也清理掉用于重置环境docker-compose down -v6. 对接你的业务应用让调度中心派活调度中心搭好了但它还是个光杆司令。接下来你需要让你的业务项目比如一个 Spring Boot 应用成为一个“执行器”并向这个调度中心注册接收任务指令。这里以 Spring Boot 项目为例简要说明步骤添加依赖在你的pom.xml中加入 XXL-Job 执行器客户端依赖。dependency groupIdcom.xuxueli/groupId artifactIdxxl-job-core/artifactId version2.4.0/version !-- 版本尽量与调度中心一致 -- /dependency配置执行器在application.yml中配置。xxl: job: admin: addresses: http://你的调度中心IP:8080/xxl-job-admin # 如果是 Docker 部署这里填宿主机IP或域名 executor: appname: your-app-name # 你的应用名称在调度中心添加执行器时要用到 address: ip: port: 9999 # 执行器内嵌服务端口用于接收调度中心触发请求 logpath: /data/applogs/xxl-job/jobhandler logretentiondays: 30 accessToken: # 如果调度中心配置了令牌这里需要填开发任务使用XxlJob注解来定义一个任务方法。Component public class SampleXxlJob { XxlJob(demoJobHandler) public ReturnTString demoJobHandler(String param) throws Exception { XxlJobLogger.log(XXL-JOB, Hello World!); // 你的业务逻辑 here return ReturnT.SUCCESS; } }部署与注册将你的 Spring Boot 应用打包部署。启动后它就会自动向配置的调度中心地址注册。在调度中心操作登录 XXL-Job Admin在“执行器管理”中添加一个执行器AppName 就填上面配置的your-app-name。添加成功后在“任务管理”中新建一个任务选择这个执行器并填写在代码中定义的 JobHandler 名称如demoJobHandler配置好 Cron 表达式任务就关联上了。当调度时间到达调度中心会向你的业务应用发出 HTTP 请求触发对应的XxlJob方法执行。所有的执行日志都会在调度中心的界面上展示实现了任务管理的集中化、可视化。走到这一步你已经拥有了一个功能完整、部署灵活、易于维护的企业级分布式任务调度平台。从环境准备到 Compose 文件编写从数据持久化到生产级配置再到与业务应用的联动这套基于 Docker Compose 的方案真正实现了“一次编写处处运行”极大地提升了开发和运维的效率。下次再遇到定时任务管理混乱的问题你完全可以自信地说交给我和我的 XXL-Job 调度中心吧。