把 Jira 和 Confluence 从传统虚拟机迁移到 Docker 容器中运行,是不少团队在做 DevOps 标准化时的常见选择。容器化之后,环境一致性、升级回滚、批量部署都会变得简单许多。不过 Atlassian 的这两款产品对内存、数据库连接和反向代理都有一定要求,直接照搬普通 Web 应用的部署方式很容易翻车。本文结合实际生产经验,从镜像选择到数据持久化,再到反向代理与备份,完整梳理容器化部署的关键步骤。

一、镜像选择与部署前的准备工作
部署 Jira 与 Confluence 时,镜像的选择直接影响后续维护成本。官方渠道有两个方向:一个是 Atlassian 官方发布的 atlassian/jira-software、atlassian/confluence 镜像(托管在 Docker Hub 和 Atlassian 自己的容器仓库),另一个是社区维护的 atlassian-data-center 系列镜像。官方镜像的更新最及时,安全性有保障,生产环境优先选官方版本。
镜像选择之外,部署前还要确认两件事:数据库和内存规划。Jira 和 Confluence 官方推荐使用外部数据库,PostgreSQL 是兼容性最好的选择之一,MySQL 和 Oracle 也可以,但 H2 内置数据库只适合试用,正式环境绝对不要用,否则后续迁移数据会非常痛苦。内存方面,Jira Software 一般建议堆内存 2GB 以上,Confluence 建议 1.5GB 以上,宿主机至少准备 8GB 内存才能保证两个应用加数据库流畅运行。
下面是一个基础的环境变量配置示例,通过环境变量可以直接设置 JVM 堆内存和反向代理参数,避免进入容器手动修改:
docker run -d --name jira \ -p 8080:8080 \ -v jira-data:/var/atlassian/application-data/jira \ -e JVM_MINIMUM_MEMORY=1g \ -e JVM_MAXIMUM_MEMORY=2g \ atlassian/jira-software:latest
注意 -v jira-data:/var/atlassian/application-data/jira 这一行,数据目录必须挂载出来。Jira 的附件、索引、配置文件全部存放在这个目录下,如果不做持久化,容器删除后所有数据都会丢失,这是容器化部署中最致命的一个坑。
二、使用 docker-compose 编排完整环境
单独用 docker run 启动容器管理起来很混乱,实际部署推荐用 docker-compose 把 PostgreSQL、Jira、Confluence 统一编排。compose 的好处是服务依赖关系明确,网络互通,一条命令即可拉起整套环境。
下面是一份经过验证的编排文件,包含了数据库、Jira 和 Confluence 三个服务,并配置了健康检查和固定的容器网络:
version: "3.8"
services:
postgresql:
image: postgres:15
container_name: atlassian-db
environment:
POSTGRES_USER: atlassian
POSTGRES_PASSWORD: your_secure_password
POSTGRES_DB: postgres
volumes:
- pg-data:/var/lib/postgresql/data
restart: unless-stopped
jira:
image: atlassian/jira-software:latest
container_name: jira
depends_on:
- postgresql
environment:
ATL_JDBC_URL: jdbc:postgresql://postgresql:5432/jiradb
ATL_JDBC_USER: jira
ATL_JDBC_PASSWORD: jira_password
ATL_DB_TYPE: postgres72
JVM_MINIMUM_MEMORY: 1g
JVM_MAXIMUM_MEMORY: 2g
volumes:
- jira-data:/var/atlassian/application-data/jira
ports:
- "8080:8080"
restart: unless-stopped
confluence:
image: atlassian/confluence:latest
container_name: confluence
depends_on:
- postgresql
environment:
ATL_JDBC_URL: jdbc:postgresql://postgresql:5432/confluencedb
ATL_JDBC_USER: confluence
ATL_JDBC_PASSWORD: confluence_password
ATL_DB_TYPE: postgresql
JVM_MINIMUM_MEMORY: 1g
JVM_MAXIMUM_MEMORY: 2g
volumes:
- confluence-data:/var/atlassian/application-data/confluence
ports:
- "8090:8090"
restart: unless-stopped
volumes:
pg-data:
jira-data:
confluence-data:
这份配置里有一个容易被忽略的细节:Jira 和 Confluence 需要各自独立的数据库和数据库账号。需要在 PostgreSQL 初始化后手动创建 jiradb 和 confluencedb,并分别为它们创建授权用户。可以通过进入数据库容器执行 SQL 完成:
-- 创建 Jira 数据库与账号 CREATE DATABASE jiradb WITH ENCODING 'UNICODE' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0; CREATE USER jira WITH PASSWORD 'jira_password'; GRANT ALL PRIVILEGES ON DATABASE jiradb TO jira; -- 创建 Confluence 数据库与账号 CREATE DATABASE confluencedb WITH ENCODING 'UNICODE' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0; CREATE USER confluence WITH PASSWORD 'confluence_password'; GRANT ALL PRIVILEGES ON DATABASE confluencedb TO confluence;
执行完成后,通过 docker compose up -d 启动整套服务,浏览器访问宿主机的 8080 端口即可进入 Jira 的安装向导,8090 端口对应 Confluence。安装向导中选择手动配置数据库,填入 compose 文件中的连接信息即可完成初始化。
三、反向代理与 HTTPS 配置
生产环境几乎不可能让用户直接通过 IP 加端口访问,通常前面会挂一层 Nginx 做反向代理并终结 SSL。这里的关键点是告知 Jira 和 Confluence 它们运行在代理之后,否则会出现回调地址错误、附件下载异常、登录后跳转错误等问题。
Atlassian 官方镜像提供了专门的环境变量来处理代理场景,核心配置如下:
environment: ATL_PROXY_NAME: wiki.example-domain.com ATL_PROXY_PORT: 443 ATL_TOMCAT_SCHEME: https ATL_TOMCAT_SECURE: "true"
Nginx 侧的配置同样重要,需要正确传递 Host 头和真实客户端 IP,同时处理 WebSocket 连接,Confluence 在线编辑功能依赖 WebSocket:
server {
listen 443 ssl;
server_name wiki.example-domain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
proxy_pass http://confluence:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 200m;
}
}
其中 client_max_body_size 200m 不要遗漏,Confluence 上传大附件、Jira 导入备份文件时,默认的 1MB 限制会直接报 413 错误,很多人排查半天发现是 Nginx 拦截了请求。
四、数据备份、恢复与版本升级
容器化之后备份策略反而更清晰了。Jira 和 Confluence 的完整备份包含两部分:数据卷目录(附件、配置、索引)和数据库内容。只备份数据库是不够的,附件全部存在数据卷里,丢了这个目录等于丢了所有上传的文件。
一个简单可靠的方案是定时备份数据卷加数据库导出,示例脚本如下:
#!/bin/bash BACKUP_DIR=/backup/atlassian/$(date +%Y%m%d) mkdir -p $BACKUP_DIR # 备份数据库 docker exec atlassian-db pg_dump -U atlassian jiradb > $BACKUP_DIR/jiradb.sql docker exec atlassian-db pg_dump -U atlassian confluencedb > $BACKUP_DIR/confluencedb.sql # 备份数据卷 docker run --rm \ -v jira-data:/data:ro \ -v $BACKUP_DIR:/backup \ alpine tar czf /backup/jira-data.tar.gz -C /data . docker run --rm \ -v confluence-data:/data:ro \ -v $BACKUP_DIR:/backup \ alpine tar czf /backup/confluence-data.tar.gz -C /data .
升级版本时要遵守固定流程:先完整备份,再修改 compose 文件中的镜像版本号,然后重建容器。注意不要用 latest 标签在生产环境,跨大版本升级需要逐步进行,例如从 8.x 升到 9.x 之前,先查看官方的升级说明,确认插件兼容性。升级后首次启动会比较慢,因为需要重建索引和执行数据库迁移脚本,耐心等待启动完成,不要中途强制重启容器。
总体来看,容器化 Jira 与 Confluence 的核心就三点:数据卷必须持久化、数据库必须外置且独立、代理参数必须配对。把这三件事处理好,剩下的镜像版本调整、扩容内存都只是修改配置文件的工作。配合 docker-compose 和定时备份脚本,整套环境可以长期稳定运行,升级回滚也只需要几分钟时间。
Jira容器化部署Docker部署ConfluenceAtlassian运维修改时间:2026-09-16 19:42:49