在日常数据同步工作中,DataX作为阿里巴巴开源的高效数据同步工具,配合DataX-Web的可视化管理界面,能大幅提升数据迁移效率。但传统部署方式需要手动配置数据库、安装依赖、调整参数,整个过程繁琐且容易出错。我在实际项目中就遇到过因为环境变量配置错误导致服务启动失败的案例,排查了整整一个下午才发现是数据库连接字符串少了个问号。
Docker Compose的出现完美解决了这个问题。它允许我们用声明式的方式定义多容器应用,比如把DataX执行器、DataX-Web管理界面、MySQL数据库这些服务打包成一个整体。最近帮客户部署数据中台时,原本需要两天的手工部署,用Docker Compose编排后缩短到20分钟,最重要的是保证了每次部署的环境一致性。
在开始之前,建议先检查宿主机环境。我习惯用以下命令确认基础组件:
bash复制# 检查Docker版本
docker --version
# 检查Docker Compose版本
docker-compose --version
# 检查端口占用情况
netstat -tulnp | grep -E '3306|9527'
如果发现端口冲突,可以修改默认端口号。比如把MySQL的3306改为3307,DataX-Web的9527改为9528。这里有个小技巧:修改端口后一定要同步更新所有相关配置,包括docker-compose.yml和环境变量文件,否则会出现容器启动但服务不可用的情况。
官方和社区提供了多个版本的镜像,根据我的测试经验:
建议生产环境使用带具体版本号的镜像,避免自动更新导致兼容性问题。比如:
bash复制docker pull linshellfeng/datax_web:3.0.1
docker pull mysql:5.7
下面是我经过多个项目验证的配置模板,关键部分都加了注释说明:
yaml复制version: '3'
services:
datax-mysql:
image: mysql:5.7
container_name: datax-mysql
environment:
MYSQL_ROOT_PASSWORD: "DataX@123"
MYSQL_DATABASE: datax_web
MYSQL_USER: datax
MYSQL_PASSWORD: "DataX@456"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 3
datax-web:
image: linshellfeng/datax_web:3.0.1
container_name: datax-web
depends_on:
datax-mysql:
condition: service_healthy
environment:
SPRING_DATASOURCE_URL: "jdbc:mysql://datax-mysql:3306/datax_web?useSSL=false"
SPRING_DATASOURCE_USERNAME: "datax"
SPRING_DATASOURCE_PASSWORD: "DataX@456"
volumes:
- ./datax-web/conf:/home/datax/datax-web-2.1.2/modules/datax-admin/conf
- ./datax-web/logs:/home/datax/datax-web-2.1.2/modules/datax-admin/logs
ports:
- "9527:9527"
restart: unless-stopped
这个配置有几个设计亮点:
在mysql/init.sql文件中准备数据库初始化脚本:
sql复制CREATE DATABASE IF NOT EXISTS datax_web CHARACTER SET utf8mb4;
GRANT ALL PRIVILEGES ON datax_web.* TO 'datax'@'%';
FLUSH PRIVILEGES;
执行初始化命令:
bash复制docker-compose up -d datax-mysql
# 等待健康检查通过
docker-compose logs -f datax-mysql
在datax-web/conf/bootstrap.properties中配置:
properties复制# 应用端口
server.port=9527
# 数据库配置
spring.datasource.url=jdbc:mysql://datax-mysql:3306/datax_web?useSSL=false
spring.datasource.username=datax
spring.datasource.password=DataX@456
# 日志级别
logging.level.com.wugui.datax.admin=INFO
在datax-web/conf/application.properties中添加:
properties复制# DataX执行器配置
datax.executor.memory=2g
datax.executor.port=9999
# 任务限速配置
datax.job.speed.byte=1048576
datax.job.speed.record=1000
bash复制docker-compose up -d
bash复制# 检查容器状态
docker-compose ps
# 查看实时日志
docker-compose logs -f datax-web
浏览器打开http://localhost:9527,使用默认账号admin/123456登录。首次登录后务必修改密码,我遇到过因为使用默认密码导致的安全事件。
如果DataX-Web启动时报数据库连接错误,可以这样排查:
bash复制docker exec -it datax-mysql mysql -udatax -pDataX@456
bash复制docker exec datax-web ping datax-mysql
当出现"单个channel的bps值不能为空"错误时,需要在任务JSON中补充限速配置:
json复制{
"core": {
"transport": {
"channel": {
"speed": {
"byte": 2000000
}
}
}
},
"job": {
"setting": {
"speed": {
"byte": 1048576
}
}
}
}
经过多个项目的实战检验,我总结了几条生产环境部署经验:
完整的项目目录结构建议如下:
code复制/datax-deploy
├── docker-compose.yml
├── mysql
│ ├── data
│ └── init.sql
└── datax-web
├── conf
│ ├── bootstrap.properties
│ └── application.properties
└── logs