Docker 部署禅道:从零搭建到生产级配置详解

Docker 部署禅道:从零搭建到生产级配置详解

1. 引言

禅道(ZenTao)作为国内领先的开源项目管理软件,集成了产品管理、项目管理、质量管理、文档管理和DevOps等核心模块,完整覆盖了软件研发项目的整个生命周期,广泛应用于中小型研发团队及传统IT企业。然而,传统手动部署方式需要配置PHP环境、MySQL数据库、Nginx/Apache服务器等一系列依赖,光是环境搭建就能让初学者花费大量时间解决各类兼容性问题。

Docker容器化部署彻底改变了这一局面------它将禅道及其运行环境打包成一个标准容器,真正实现"一次配置,处处运行"。根据实测,从零开始到完整运行只需10分钟,相比传统部署方式效率提升5-8倍,维护成本降低60%以上。

本文将从零开始,手把手带你完成禅道在Docker环境中的部署全过程,涵盖:

  • ✅ Docker运行环境安装与配置
  • ✅ 禅道官方镜像的获取与理解
  • docker rundocker-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.520.521.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>)。

安装流程如下:

  1. 阅读协议:点击"开始安装"→ 同意禅道使用协议 → 点击"下一步"。
  2. 环境检查:系统自动检查PHP扩展、目录权限等环境配置。
  3. 数据库配置
    • 一体化镜像方式:主机填 127.0.0.1,密码填环境变量中设置的密码(默认123456
    • 分离部署方式:主机填 mysql(服务名),密码填123456
  4. 设置管理员:设置公司名称、管理员账号和密码。
  5. 选择管理模式:可选择产品-项目-测试分立模式,或简单项目模式。

💡 若安装过程中出现一直跳回第一步的情况,可在./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 $hostX-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配置缺失 确保配置中包含HostX-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实现禅道自动化部署流水线。

相关推荐
一点事4 小时前
docker:安装oracle 19c
docker·oracle·容器
安当加密5 小时前
Kubernetes Secret不安全?External Secrets Operator接入凭据管理服务实战,自动轮转零停机
安全·容器·kubernetes
u0119608237 小时前
k8s-helm命令
linux·容器·kubernetes
qq_452396237 小时前
第四篇:《Docker 镜像:分层结构、拉取与推送》
运维·docker·容器
身如柳絮随风扬8 小时前
Docker 部署 Nginx:从入门到生产级配置实战
nginx·docker·容器
木雷坞8 小时前
dwz-server Docker 部署短链接服务:多域名、A/B 测试和统计配置
运维·docker·容器
亚空间仓鼠8 小时前
Docker容器化高可用架构部署方案(十六)
docker·容器·架构
星空8 小时前
docker
linux·运维·docker
身如柳絮随风扬8 小时前
GitLab CI 驱动禅道自动化部署:从零构建企业级 CI/CD 流水线
docker