Docker 部署禅道:从零搭建到生产级配置详解
1. 引言
禅道(ZenTao)作为国内领先的开源项目管理软件,集成了产品管理、项目管理、质量管理、文档管理和DevOps等核心模块,完整覆盖了软件研发项目的整个生命周期,广泛应用于中小型研发团队及传统IT企业。然而,传统手动部署方式需要配置PHP环境、MySQL数据库、Nginx/Apache服务器等一系列依赖,光是环境搭建就能让初学者花费大量时间解决各类兼容性问题。
Docker容器化部署彻底改变了这一局面------它将禅道及其运行环境打包成一个标准容器,真正实现"一次配置,处处运行"。根据实测,从零开始到完整运行只需10分钟,相比传统部署方式效率提升5-8倍,维护成本降低60%以上。
本文将从零开始,手把手带你完成禅道在Docker环境中的部署全过程,涵盖:
- ✅ Docker运行环境安装与配置
- ✅ 禅道官方镜像的获取与理解
- ✅
docker run与docker-compose两种部署方案 - ✅ 数据持久化与权限配置的避坑指南
- ✅ HTTPS反向代理配置方法
- ✅ 备份恢复与生产环境优化
无论你是运维新手还是资深工程师,都能通过本文轻松掌握禅道的容器化部署技能。
2. Docker部署禅道的核心架构
在动手部署之前,先理解禅道Docker镜像的工作原理。禅道官方从开源版18.5开始对Docker镜像进行了全面改版升级,大幅简化了部署和使用流程。
宿主机
容器内部
Apache Web Server
用户访问
http://IP:端口
Docker Engine
禅道容器
hub.zentao.net/app/zentao
PHP 运行时
内置 MySQL
端口 3306
数据持久化卷
/data或/www/zentaopms
禅道官方镜像采用一体化设计,容器内已集成了Apache、PHP和MySQL环境,无需额外安装,一条命令即可启动完整服务。其核心结构如下:
| 组件 | 说明 | 容器内路径 |
|---|---|---|
| Web服务 | Apache HTTP Server | /usr/local/zbox/run/apache/ |
| PHP运行环境 | 包含禅道所需的全部扩展 | 内置 |
| 内置MySQL | 方便快速体验,适合开发/小规模团队 | 内置,监听端口3306 |
| 应用代码与数据 | 禅道源码、附件、配置文件 | /www/zentaopms 或 /data |
3. 环境准备
3.1 硬件与系统要求
| 项目 | 最低配置 | 推荐配置 | 说明 |
|---|---|---|---|
| 操作系统 | CentOS 7+ / Ubuntu 18.04+ | Ubuntu 22.04 / CentOS 8 | Linux稳定性最佳 |
| Docker版本 | 20.x | 24.x+ | 新版Docker更稳定 |
| CPU | 1核心 | 2核心+ | 根据用户数调整 |
| 内存 | 1GB | 4GB+ | 内存不足易导致OOM |
| 硬盘 | 10GB | 50GB+ | 随项目数据增长 |
生产环境建议运行在Linux系统上(CentOS 7+或Ubuntu 18.04+),以获得最佳的稳定性和安全性;Windows系统建议使用WSL2而非Docker Desktop,后者在文件权限处理上容易出问题。
3.2 安装Docker
bash
# CentOS 系统
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
sudo systemctl enable docker --now
# Ubuntu 系统
sudo apt update
sudo apt install -y docker.io docker-compose
sudo systemctl enable docker --now
验证安装:
bash
docker --version # Docker version 24.x, build xxx
docker-compose --version # 如未安装,另行安装
3.3 配置国内镜像加速(可选)
创建或编辑 /etc/docker/daemon.json,添加镜像加速源:
json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
]
}
重启Docker使配置生效:
bash
sudo systemctl daemon-reload && sudo systemctl restart docker
3.4 规划数据持久化目录
容器内的数据默认存储于容器内部,容器删除后数据即丢失。因此,必须将关键数据目录挂载到宿主机,实现持久化存储。
bash
# 创建数据目录(路径可根据实际情况调整)
sudo mkdir -p /data/zentao/data
sudo mkdir -p /data/zentao/backup
# 设置目录权限(避坑关键!)
sudo chmod 777 -R /data/zentao/
⚠️ 为什么需要777权限? 容器内应用通常以
www-data(UID 1000)等特定用户运行,而该用户在宿主机上可能没有对应账号,给予宽松权限可有效避免因权限不足导致的各类问题。
4. 两种部署方案对比
在开始具体部署之前,先了解两种方案的适用场景,以便选择最适合自己的方式:
| 对比维度 | docker run(命令式) | docker-compose(声明式) |
|---|---|---|
| 配置方式 | 命令行逐个参数指定 | YAML文件集中管理 |
| 适用场景 | 快速测试、单次部署 | 生产环境、需要版本化配置 |
| 容器管理 | 手动管理 | 自动管理网络、依赖 |
| 配置重现性 | 低(依赖命令行记忆) | 高(配置文件可版本控制) |
| 推荐等级 | 开发测试环境 | 生产环境推荐 |
5. 方案一:docker run 快速部署(一体化镜像)
此方案使用禅道一体化镜像(内置Apache + MySQL),无需单独配置数据库,适合快速搭建开发和测试环境。
5.1 拉取禅道镜像
禅道官方维护的镜像仓库在hub.zentao.net,比Docker Hub上的社区版更可靠,建议优先使用:
bash
# 拉取最新开源版
docker pull hub.zentao.net/app/zentao:latest
# 拉取指定版本(如20.5)
docker pull hub.zentao.net/app/zentao:20.5
镜像命名规则:
- 开源版:以数字开头,如
18.5、20.5、21.2 - 专业版:以
biz开头,如biz8.5 - 企业版:以
max开头,如max4.5 - IPD版:以
ipd开头,如ipd1.0.1
镜像大小约500MB,下载速度取决于网络环境,如遇缓慢建议配置国内镜像加速源。
5.2 创建专用网络(可选但推荐)
为禅道创建独立的网络环境,方便后续扩展和隔离:
bash
docker network create --subnet=172.172.172.0/24 zentaonet
5.3 启动容器
bash
docker run -d \
--name zentao \
-p 80:80 \
--network=zentaonet \
--ip 172.172.172.10 \
-e MYSQL_INTERNAL=true \
-v /data/zentao/data:/data \
hub.zentao.net/app/zentao:latest
参数说明:
| 参数 | 作用 | 说明 |
|---|---|---|
-d |
后台运行 | 容器在后台持续运行 |
--name zentao |
指定容器名称 | 便于后续管理操作 |
-p 80:80 |
端口映射 | 将容器80端口映射到宿主机80端口 |
--network zentaonet |
指定网络 | 使用前面创建的专用网络 |
--ip 172.172.172.10 |
固定IP | 避免IP变化影响其他服务 |
-e MYSQL_INTERNAL=true |
必设 | 启用容器内置MySQL |
-v /data/zentao/data:/data |
数据挂载 | 将数据持久化到宿主机 |
5.4 验证容器运行状态
bash
# 查看容器状态
docker ps | grep zentao
# 查看实时日志(如果启动出现问题)
docker logs -f zentao
# 进入容器内部
docker exec -it zentao /bin/bash
6. 方案二:docker-compose 优雅部署(生产推荐)
当需要长期运维、版本控制或与其他服务(如Nginx反代、Redis等)集成时,推荐使用docker-compose方式。
6.1 创建项目目录与Compose文件
bash
mkdir -p ~/zentao && cd ~/zentao
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
zentao:
image: hub.zentao.net/app/zentao:latest
container_name: zentao
restart: always
ports:
- "8080:80" # 网页访问端口,可按需修改
# - "3307:3306" # 可选:暴露MySQL端口用于外部管理
volumes:
- ./data:/data # 禅道数据目录
# - ./mysql:/var/lib/mysql # 一体化镜像可选,分离部署必需
environment:
- MYSQL_INTERNAL=true # 使用内置MySQL
# - MYSQL_ROOT_PASSWORD=123456 # 设置MySQL root密码
networks:
- zentao-network
networks:
zentao-network:
driver: bridge
EOF
注意 :一体化镜像方式(内置MySQL)无需单独配置MySQL容器,上述配置即可满足大部分需求。如需要外部数据库,可将
MYSQL_INTERNAL改为false并配置ZT_MYSQL_*系列变量。
6.2 启动服务
bash
# 创建数据目录(Compose会自动创建)
mkdir -p ./data
# 后台启动
docker-compose up -d
# 查看启动日志
docker-compose logs -f
6.3 分离部署方案(禅道 + MySQL独立容器)
对于需要独立管理数据库、或希望连接远程MySQL的场景,可采用禅道与MySQL分离部署:
yaml
version: '3.8'
services:
mysql:
image: mysql:5.7
container_name: zentao-mysql
restart: always
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=zentao
volumes:
- ./mysql:/var/lib/mysql
command: --character-set-server=utf8 --collation-server=utf8_general_ci
networks:
- zentao-network
zentao:
image: hub.zentao.net/app/zentao:latest
container_name: zentao
restart: always
ports:
- "8080:80"
volumes:
- ./zentao:/www/zentaopms
environment:
- MYSQL_INTERNAL=false
- ZT_MYSQL_HOST=mysql
- ZT_MYSQL_PORT=3306
- ZT_MYSQL_USER=root
- ZT_MYSQL_PASSWORD=123456
- ZT_MYSQL_DB=zentao
depends_on:
- mysql
networks:
- zentao-network
networks:
zentao-network:
driver: bridge
7. 禅道Web安装向导
容器启动成功后,打开浏览器访问 http://<服务器IP>:8080(如使用docker run方式且映射为80端口,则直接访问http://<服务器IP>)。
安装流程如下:
- 阅读协议:点击"开始安装"→ 同意禅道使用协议 → 点击"下一步"。
- 环境检查:系统自动检查PHP扩展、目录权限等环境配置。
- 数据库配置 :
- 一体化镜像方式:主机填
127.0.0.1,密码填环境变量中设置的密码(默认123456) - 分离部署方式:主机填
mysql(服务名),密码填123456
- 一体化镜像方式:主机填
- 设置管理员:设置公司名称、管理员账号和密码。
- 选择管理模式:可选择产品-项目-测试分立模式,或简单项目模式。
💡 若安装过程中出现一直跳回第一步的情况,可在
./zentao/data/config/config.php中添加配置:$config->framework->filterCSRF = false;,然后重启容器。
8. 生产环境优化与安全加固
8.1 使用Nginx反向代理配置HTTPS
对于生产环境,建议使用独立的Nginx容器做HTTPS反向代理,因为直接在禅道容器内配置HTTPS在重启后会被还原,而通过独立Nginx代理则配置稳定,可在不侵入禅道容器的情况下实现SSL加密和域名绑定,也便于后续证书更新和版本升级,同时还能统一管理多个后端服务的流量入口。
步骤1 :创建Nginx配置文件 /etc/nginx/conf.d/zentao.conf
nginx
server {
listen 80;
server_name zentao.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name zentao.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
location / {
proxy_pass http://172.17.0.2:80; # 替换为禅道容器IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REFERER $http_referer;
}
}
关键 :反向代理配置中必须包含
proxy_set_header Host $host、X-Forwarded-Proto等头信息,否则会导致登录后跳转异常。
步骤2:启动Nginx容器
bash
docker run -d --name nginx-proxy \
-p 80:80 -p 443:443 \
-v /etc/nginx/conf.d:/etc/nginx/conf.d \
-v /etc/nginx/ssl:/etc/nginx/ssl \
nginx:latest
8.2 资源限制
bash
# docker run 方式
docker run ... --cpus="2" --memory="4g" ...
# docker-compose 方式
services:
zentao:
deploy:
resources:
limits:
cpus: '2'
memory: 4096M
8.3 安全加固清单
| 配置项 | 推荐操作 | 目的 |
|---|---|---|
| 数据库 | 不使用root用户连接禅道,修改默认端口 | 降低被攻击风险 |
| 系统权限 | 禅道运行用户禁止root权限 | 权限最小化 |
| 网络 | 配置HTTPS、隐藏真实IP、使用CDN | 数据加密传输 |
| 备份 | 每日自动备份+远程同步 | 数据灾难恢复 |
8.4 启用PHP性能优化
在环境变量中调整PHP参数:
yaml
environment:
- PHP_MAX_EXECUTION_TIME=120
- PHP_MEMORY_LIMIT=512M
- PHP_POST_MAX_SIZE=128M
- PHP_UPLOAD_MAX_FILESIZE=128M
9. 备份与恢复
9.1 数据备份
禅道的数据包含两部分:应用文件(附件、配置)和数据库。下面分别给出docker run和docker-compose方式的备份命令。
一体化的docker run方式备份:
bash
# 停止服务(可选)
docker stop zentao
# 备份数据目录
tar -czf /backup/zentao_data_$(date +%Y%m%d).tar.gz /data/zentao/
# 如果使用内置MySQL,启动容器后手动导出数据库
docker start zentao
docker exec zentao /usr/bin/mysqldump -u root -p123456 zentao > /backup/zentao_db_$(date +%Y%m%d).sql
docker-compose分离部署方式备份:
bash
cd ~/zentao
# 备份应用数据
tar -czf /backup/zentao_app_$(date +%Y%m%d).tar.gz ./zentao/
# 备份MySQL数据
docker exec zentao-mysql mysqldump -u root -p123456 zentao > /backup/zentao_db_$(date +%Y%m%d).sql
9.2 设置定时自动备份(crontab)
bash
# 编辑定时任务
crontab -e
# 添加以下内容(每日凌晨2点备份)
0 2 * * * /bin/bash /opt/scripts/backup_zentao.sh
创建备份脚本 /opt/scripts/backup_zentao.sh:
bash
#!/bin/bash
BACKUP_DIR=/backup/zentao
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p $BACKUP_DIR
# 备份数据库
docker exec zentao mysqldump -u root -p123456 zentao > $BACKUP_DIR/zentao_db_$DATE.sql
# 备份附件
tar -czf $BACKUP_DIR/zentao_data_$DATE.tar.gz /data/zentao/
# 保留最近30天的备份
find $BACKUP_DIR -type f -mtime +30 -delete
9.3 数据恢复
恢复时注意版本一致性:备份文件和恢复环境的禅道版本必须相同,否则可能因数据库结构不兼容导致恢复失败。建议先创建与备份版本相同版本号的禅道容器,确认可正常访问后,再进行数据覆盖和导入。
bash
# 恢复应用数据
tar -xzf /backup/zentao_app_20250101.tar.gz -C /
# 恢复数据库
docker exec -i zentao mysql -u root -p123456 zentao < /backup/zentao_db_20250101.sql
# 重启服务
docker-compose restart
10. 常见问题与排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法访问Web界面 | 防火墙未放行端口 | firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload |
| 容器启动后很快退出 | 挂载目录权限不足 | chmod 777 -R /data/zentao/ |
| 数据库连接失败 | MYSQL_INTERNAL=true未设置 |
确保容器启动命令中包含-e MYSQL_INTERNAL=true |
| 文件上传失败 | 数据目录权限不正确 | 检查/data/zentao目录及其子目录权限 |
| Nginx反向代理后无法登录 | proxy_set_header配置缺失 | 确保配置中包含Host和X-Forwarded-Proto |
| 初始化时一直跳回第一步 | CSRF校验问题 | 在config/config.php中添加$config->framework->filterCSRF = false; |
| 外部无法连接内置MySQL | MySQL绑定地址限制 | 修改容器内MySQL配置,注释bind-address = 127.0.0.1 |
11. 部署流程全景图
生产环境配置
docker run
docker-compose
环境准备
Docker安装与配置
创建数据目录并授权777
选择部署方式
拉取禅道官方镜像
编写docker-compose.yml
创建专用网络
执行docker run命令
配置端口映射与挂载
验证容器状态
创建项目目录
执行docker-compose up -d
浏览器访问Web界面
禅道安装向导完成
生产环境配置
HTTPS反向代理
资源限制
定时自动备份
PHP性能调优
12. 总结与最佳实践
通过本文,你已经掌握了禅道Docker部署的完整流程:
- ✅ 两种部署方式 :
docker run适用于快速测试,docker-compose适用于生产环境 - ✅ 数据持久化 :务必挂载
/data或/www/zentaopms目录到宿主机 - ✅ 权限设置 :数据目录必须设置
777权限,这是新手最容易忽略的坑 - ✅ 镜像源 :优先使用官方仓库
hub.zentao.net,稳定性最佳 - ✅ 反向代理HTTPS:使用独立Nginx容器代理,而非修改禅道容器内部配置
- ✅ 备份策略:同时备份应用数据和数据库,并设置定时任务自动执行
最终检查清单:
- ✅ 数据目录已创建且权限为
777 - ✅ 容器启动命令中包含
-e MYSQL_INTERNAL=true - ✅ 防火墙已放行对应端口
- ✅ 容器日志无报错(
docker logs查看) - ✅ Web安装向导已成功完成
希望本文能帮助你顺利完成禅道的容器化部署,让团队协作效率大幅提升!
下期预告:使用GitLab CI实现禅道自动化部署流水线。