1. 为什么选择Docker部署Atlassian全家桶?
在软件开发团队中,Jira、Confluence、Bitbucket和Bamboo的组合堪称黄金搭档。Jira负责项目管理,Confluence专注知识沉淀,Bitbucket管理代码仓库,Bamboo实现持续集成。但传统部署方式需要分别在服务器上安装配置,不仅耗时耗力,还容易遇到环境冲突问题。
Docker容器化部署正好解决了这些痛点。通过容器隔离,每个应用都有独立的运行环境,不会互相干扰。使用Docker Compose编排,只需一个命令就能启动所有服务。我在实际项目中测试过,从零开始到全套环境就绪,传统方式需要2天,而Docker部署只需30分钟。
更重要的是,Docker部署具有以下优势:
- 环境一致性:开发、测试、生产环境完全一致,告别"在我机器上是好的"这类问题
- 快速迁移:整个环境可以打包迁移到任何支持Docker的主机
- 资源隔离:每个服务有独立的内存、CPU限制,避免资源抢占
- 版本管理:可以精确控制每个工具的版本,方便升级和回滚
2. 部署前的准备工作
2.1 硬件与系统要求
建议使用配置不低于4核CPU、8GB内存的Linux服务器。我测试过在2核4GB的机器上也能运行,但性能会比较紧张。操作系统推荐Ubuntu 22.04 LTS或CentOS 8,内核版本需要5.x以上。
需要预先安装的软件:
- Docker 20.10+
- Docker Compose 2.0+
- 至少50GB的磁盘空间(数据会持续增长)
安装Docker和Docker Compose的命令:
# Ubuntu系统 sudo apt-get update sudo apt-get install -y docker.io docker-compose sudo systemctl enable --now docker # CentOS系统 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl enable --now docker sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose2.2 网络与存储规划
建议为每个服务分配独立的端口:
- Jira: 8080
- Confluence: 8090
- Bitbucket: 7990
- Bamboo: 8085
数据存储方面,建议为每个服务创建独立的卷目录:
/atlassian/ ├── jira/ │ ├── data/ │ └── logs/ ├── confluence/ │ ├── data/ │ └── logs/ ├── bitbucket/ │ └── data/ └── bamboo/ ├── data/ └── logs/3. Docker Compose编排文件详解
3.1 基础架构设计
我们使用PostgreSQL作为所有Atlassian产品的统一数据库。虽然每个产品可以使用独立数据库实例,但统一管理更方便。数据库容器会暴露5432端口,其他服务通过容器网络连接。
完整docker-compose.yml文件:
version: '3.8' x-common-config: &common-config environment: TZ: Asia/Shanghai LANG: en_US.UTF-8 services: postgres: image: postgres:14.10 container_name: atlassian_db restart: unless-stopped environment: POSTGRES_USER: root POSTGRES_PASSWORD: root POSTGRES_DB: postgres POSTGRES_INITDB_ARGS: '--encoding=UTF8 --lc-collate=C --lc-ctype=C' volumes: - ./postgres/data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U root"] interval: 10s timeout: 5s retries: 5 jira: <<: *common-config image: atlassian/jira-software:9.4.11 container_name: jira depends_on: postgres: condition: service_healthy ports: - "8080:8080" environment: - JVM_MINIMUM_MEMORY=1024m - JVM_MAXIMUM_MEMORY=2048m - ATL_JDBC_URL=jdbc:postgresql://postgres:5432/jiradb - ATL_JDBC_USER=jira - ATL_JDBC_PASSWORD=jira - ATL_DB_TYPE=postgresql volumes: - ./jira/data:/var/atlassian/application-data/jira - ./jira/logs:/opt/atlassian/jira/logs confluence: <<: *common-config image: atlassian/confluence-server:8.5.4 container_name: confluence depends_on: postgres: condition: service_healthy ports: - "8090:8090" environment: - JVM_MINIMUM_MEMORY=1024m - JVM_MAXIMUM_MEMORY=2048m - ATL_JDBC_URL=jdbc:postgresql://postgres:5432/confluencedb - ATL_JDBC_USER=confluence - ATL_JDBC_PASSWORD=confluence - ATL_DB_TYPE=postgresql volumes: - ./confluence/data:/var/atlassian/application-data/confluence - ./confluence/logs:/opt/atlassian/confluence/logs bitbucket: <<: *common-config image: atlassian/bitbucket-server:8.9.1 container_name: bitbucket depends_on: postgres: condition: service_healthy ports: - "7990:7990" - "7999:7999" environment: - JVM_MINIMUM_MEMORY=1024m - JVM_MAXIMUM_MEMORY=2048m - JDBC_URL=jdbc:postgresql://postgres:5432/bitbucketdb - JDBC_USER=bitbucket - JDBC_PASSWORD=bitbucket - JDBC_DRIVER=org.postgresql.Driver volumes: - ./bitbucket/data:/var/atlassian/application-data/bitbucket bamboo: <<: *common-config image: atlassian/bamboo-server:9.2.3 container_name: bamboo depends_on: postgres: condition: service_healthy ports: - "8085:8085" - "54663:54663" # Remote agent port environment: - JVM_MINIMUM_MEMORY=1024m - JVM_MAXIMUM_MEMORY=2048m - BAMBOO_JDBC_URL=jdbc:postgresql://postgres:5432/bamboodb - BAMBOO_JDBC_USER=bamboo - BAMBOO_JDBC_PASSWORD=bamboo - BAMBOO_JDBC_DRIVER=org.postgresql.Driver volumes: - ./bamboo/data:/var/atlassian/application-data/bamboo - ./bamboo/logs:/opt/atlassian/bamboo/logs3.2 关键配置说明
数据库配置:
- 使用PostgreSQL 14.10,这是Atlassian官方推荐的版本
- 设置了正确的编码和排序规则,避免中文乱码问题
- 配置了健康检查,确保服务只在数据库就绪后启动
JVM内存设置:
- 为每个服务分配了1-2GB内存,这是中小型团队的推荐配置
- 生产环境可以根据负载调整,但不要超过容器可用内存的70%
卷映射:
- 将数据目录映射到宿主机,确保容器重建后数据不丢失
- 日志目录单独映射,方便问题排查
网络配置:
- 服务间通过Docker内部DNS名称通信(如postgres)
- 外部端口避免冲突,使用标准Atlassian产品端口
4. 初始化数据库与启动服务
4.1 数据库初始化
在启动服务前,需要先创建数据库和用户。可以通过以下SQL脚本初始化:
# 进入PostgreSQL容器 docker exec -it atlassian_db psql -U root # 在PostgreSQL交互终端执行以下SQL CREATE DATABASE jiradb WITH ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0; CREATE USER jira WITH PASSWORD 'jira'; GRANT ALL PRIVILEGES ON DATABASE jiradb TO jira; CREATE DATABASE confluencedb WITH ENCODING 'UTF8' OWNER confluence CONNECTION LIMIT=-1; CREATE USER confluence WITH PASSWORD 'confluence'; GRANT ALL PRIVILEGES ON DATABASE confluencedb TO confluence; CREATE DATABASE bitbucketdb WITH ENCODING 'UTF8' OWNER bitbucket CONNECTION LIMIT=-1; CREATE USER bitbucket WITH PASSWORD 'bitbucket'; GRANT ALL PRIVILEGES ON DATABASE bitbucketdb TO bitbucket; CREATE DATABASE bamboodb WITH ENCODING 'UTF8' OWNER bamboo CONNECTION LIMIT=-1; CREATE USER bamboo WITH PASSWORD 'bamboo'; GRANT ALL PRIVILEGES ON DATABASE bamboodb TO bamboo;4.2 启动与验证服务
执行以下命令启动所有服务:
docker-compose up -d启动后,可以通过以下命令检查服务状态:
docker-compose ps正常情况应该看到所有服务状态为"running"。如果某个服务启动失败,可以查看日志:
docker-compose logs -f 服务名服务就绪后,可以通过浏览器访问:
- Jira: http://服务器IP:8080
- Confluence: http://服务器IP:8090
- Bitbucket: http://服务器IP:7990
- Bamboo: http://服务器IP:8085
5. 常见问题与解决方案
5.1 Bitbucket启动失败问题
这是部署过程中最常见的问题,通常表现为Bitbucket容器不断重启。根据我的经验,90%的情况是版本兼容性问题。
解决方案:
- 检查日志确认具体错误
- 如果是内核兼容性问题,可以尝试降级Bitbucket版本
- 确保挂载的数据目录权限正确
# 查看Bitbucket日志 docker-compose logs -f bitbucket # 如果出现内核不兼容警告,修改docker-compose.yml bitbucket: image: atlassian/bitbucket-server:7.21.20 # 使用更稳定的旧版本5.2 数据库连接问题
如果服务启动后无法连接数据库,可以按以下步骤排查:
- 检查数据库容器是否正常运行
- 验证网络连接:
docker exec -it jira ping postgres - 检查数据库用户权限
- 查看数据库日志:
docker-compose logs -f postgres
5.3 性能优化建议
对于生产环境,建议进行以下优化:
- 增加JVM内存参数:
environment: - JVM_MINIMUM_MEMORY=2048m - JVM_MAXIMUM_MEMORY=4096m - 配置数据库性能参数:
postgres: environment: - POSTGRES_SHARED_BUFFERS=1GB - POSTGRES_EFFECTIVE_CACHE_SIZE=3GB - 使用Nginx反向代理,添加缓存和压缩
6. 维护与升级
6.1 日常维护
建议的维护操作:
- 定期备份数据目录和数据库
- 监控磁盘空间使用情况
- 定期检查服务日志
备份数据库的命令:
docker exec -t atlassian_db pg_dumpall -U root > atlassian_backup.sql6.2 版本升级
升级步骤:
- 备份所有数据和数据库
- 修改docker-compose.yml中的镜像版本
- 停止并删除旧容器:
docker-compose down - 拉取新镜像并启动:
docker-compose pull docker-compose up -d
特别注意:
- 升级前查看Atlassian官方升级文档
- 按顺序升级:数据库 → Jira → Confluence → Bitbucket → Bamboo
- 每次只升级一个服务,验证正常后再继续
我在实际升级过程中发现,跨大版本升级时(如Jira 8 → 9),最好先升级到中间的过渡版本,避免直接跳过大版本导致兼容性问题。