1. 环境准备打造Jira容器化的坚实基础部署Jira 9.12.0之前我们需要确保基础环境达标。我遇到过不少因为硬件配置不足导致性能问题的案例比如团队10人同时使用时系统卡顿排查后发现是CPU核心数不够。建议选择4核8G内存的服务器配置这是经过实测能流畅运行Jira的底线配置。硬盘方面100G起步是必要的。我曾经在一个项目中只分配了50G空间结果三个月后因为附件积累导致磁盘爆满。除了系统盘特别要注意数据持久化目录的容量规划。建议将/data/jira单独挂载到高性能磁盘这个目录会存放所有上传的附件和数据库文件。操作系统推荐使用CentOS 7或Ubuntu 20.04 LTS。这两个版本我都长期使用过对Docker的兼容性最好。有个容易忽略的点是时区设置一定要在安装前用timedatectl set-timezone Asia/Shanghai同步好时区否则后续日志时间全乱套。2. Docker引擎的安装与调优安装Docker看似简单但生产环境需要特别注意安全配置。我习惯用阿里云的镜像源速度比官方源快很多。以下是经过优化的安装命令# 使用国内镜像加速安装 curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io安装完成后有三项关键配置必须调整。首先是存储驱动建议改用overlay2# 修改daemon.json配置 cat /etc/docker/daemon.json EOF { storage-driver: overlay2, log-driver: json-file, log-opts: {max-size: 100m,max-file: 3} } EOF其次是镜像加速我在多个区域实测过中科大的镜像源最稳定# 追加镜像加速配置 sed -i $a\ registry-mirrors: [https://docker.mirrors.ustc.edu.cn] /etc/docker/daemon.json最后是用户权限千万别图省事直接用root操作。应该把运维用户加入docker组usermod -aG docker your_username systemctl restart docker3. Jira镜像的定制化部署官方没有直接提供Jira的Docker镜像我们需要基于Atlassian的包自己构建。这里有个坑要注意直接拉取的最新包可能缺少中文语言包。我整理了一个包含多语言支持的DockerfileFROM atlassian/jira-software:9.12.0 # 安装中文语言包 RUN curl -L https://maven.atlassian.com/content/repositories/atlassian-public/com/atlassian/jira/jira-l10n-zh/9.12.0/jira-l10n-zh-9.12.0.jar \ -o /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/jira-l10n-zh-9.12.0.jar # 调整时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime构建镜像时建议使用分层构建减少体积docker build -t custom-jira:9.12.0 .启动容器时内存设置是重中之重。根据8G物理内存我的推荐配置是docker run -d \ --name jira \ -p 8080:8080 \ -p 8443:8443 \ -e JVM_MINIMUM_MEMORY3072m \ -e JVM_MAXIMUM_MEMORY4096m \ -e JVM_RESERVED_CODE_CACHE_SIZE512m \ -v /data/jira:/var/atlassian/jira \ -v /data/jira/logs:/opt/atlassian/jira/logs \ custom-jira:9.12.0这里有几个经验值JVM最小内存设为物理内存的40%最大内存不超过物理内存的60%额外预留512M给代码缓存4. 生产级网络与存储配置单机部署可以直接用bridge网络但集群环境需要特别规划。我设计过的一个方案是创建独立网络docker network create --subnet172.20.0.0/24 jira-net然后容器启动时加入该网络docker run ... --network jira-net --ip 172.20.0.2 ...存储方面除了基本的卷映射还需要考虑备份策略。我常用的备份方案是# 每日凌晨备份 0 2 * * * docker exec jira /bin/bash -c pg_dump -U jira -d jiradb /var/atlassian/jira/backup/$(date \%Y\%m\%d).sql数据库连接建议使用外置PostgreSQL性能比内嵌的H2好很多。这是经过验证的连接配置jira.database.typepostgresql jira.database.urljdbc:postgresql://db-host:5432/jiradb jira.database.driverorg.postgresql.Driver jira.database.userjira jira.database.passwordyour_strong_password5. 性能调优与监控Jira启动后还需要进行深度优化。首先调整Tomcat配置docker exec -it jira sed -i s/Connector port8080/Connector port8080 maxThreads200 minSpareThreads25 acceptCount200/ /opt/atlassian/jira/conf/server.xml然后配置缓存参数这是我的推荐值参数名推荐值说明plugin.resource.download.cache.size500插件缓存数量plugin.resource.download.cache.ttl86400缓存有效期(秒)jira.lf.menu.cache.size200菜单缓存大小监控方面建议配置Prometheus采集指标# prometheus.yml 配置示例 scrape_configs: - job_name: jira metrics_path: /plugins/servlet/prometheus/metrics static_configs: - targets: [jira-host:8080]6. 安全加固措施生产环境必须做好安全防护。首先配置HTTPS# 使用Lets Encrypt证书 docker run -it --rm -p 443:443 -p 80:80 \ -v /etc/letsencrypt:/etc/letsencrypt \ certbot/certbot certonly --standalone -d your-domain.com然后在Jira的server.xml中配置SSLConnector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads150 SSLEnabledtrue SSLHostConfig Certificate certificateFile/etc/letsencrypt/live/your-domain.com/cert.pem certificateKeyFile/etc/letsencrypt/live/your-domain.com/privkey.pem certificateChainFile/etc/letsencrypt/live/your-domain.com/chain.pem / /SSLHostConfig /Connector定期更新也很关键我写了个自动更新证书的脚本#!/bin/bash docker stop jira certbot renew --quiet docker start jira7. 日常维护与问题排查维护Jira最常遇到的就是内存泄漏问题。我的排查步骤是先用docker stats看实时资源占用如果内存持续增长执行docker exec jira jcmd 1 GC.heap_dump /tmp/heap.hprof用Eclipse MAT分析内存快照日志分析也有技巧推荐配置logrotate/data/jira/logs/*.log { daily missingok rotate 30 compress delaycompress notifempty copytruncate }数据库维护方面定期执行VACUUM ANALYZE能显著提升查询速度。我设置了一个每周任务-- 创建维护脚本 CREATE OR REPLACE FUNCTION jiradb_maintenance() RETURNS void AS $$ BEGIN VACUUM ANALYZE; REINDEX DATABASE jiradb; END; $$ LANGUAGE plpgsql;
基于Docker容器化部署Jira 9.12.0:从环境准备到生产级配置实战
1. 环境准备打造Jira容器化的坚实基础部署Jira 9.12.0之前我们需要确保基础环境达标。我遇到过不少因为硬件配置不足导致性能问题的案例比如团队10人同时使用时系统卡顿排查后发现是CPU核心数不够。建议选择4核8G内存的服务器配置这是经过实测能流畅运行Jira的底线配置。硬盘方面100G起步是必要的。我曾经在一个项目中只分配了50G空间结果三个月后因为附件积累导致磁盘爆满。除了系统盘特别要注意数据持久化目录的容量规划。建议将/data/jira单独挂载到高性能磁盘这个目录会存放所有上传的附件和数据库文件。操作系统推荐使用CentOS 7或Ubuntu 20.04 LTS。这两个版本我都长期使用过对Docker的兼容性最好。有个容易忽略的点是时区设置一定要在安装前用timedatectl set-timezone Asia/Shanghai同步好时区否则后续日志时间全乱套。2. Docker引擎的安装与调优安装Docker看似简单但生产环境需要特别注意安全配置。我习惯用阿里云的镜像源速度比官方源快很多。以下是经过优化的安装命令# 使用国内镜像加速安装 curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io安装完成后有三项关键配置必须调整。首先是存储驱动建议改用overlay2# 修改daemon.json配置 cat /etc/docker/daemon.json EOF { storage-driver: overlay2, log-driver: json-file, log-opts: {max-size: 100m,max-file: 3} } EOF其次是镜像加速我在多个区域实测过中科大的镜像源最稳定# 追加镜像加速配置 sed -i $a\ registry-mirrors: [https://docker.mirrors.ustc.edu.cn] /etc/docker/daemon.json最后是用户权限千万别图省事直接用root操作。应该把运维用户加入docker组usermod -aG docker your_username systemctl restart docker3. Jira镜像的定制化部署官方没有直接提供Jira的Docker镜像我们需要基于Atlassian的包自己构建。这里有个坑要注意直接拉取的最新包可能缺少中文语言包。我整理了一个包含多语言支持的DockerfileFROM atlassian/jira-software:9.12.0 # 安装中文语言包 RUN curl -L https://maven.atlassian.com/content/repositories/atlassian-public/com/atlassian/jira/jira-l10n-zh/9.12.0/jira-l10n-zh-9.12.0.jar \ -o /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/jira-l10n-zh-9.12.0.jar # 调整时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime构建镜像时建议使用分层构建减少体积docker build -t custom-jira:9.12.0 .启动容器时内存设置是重中之重。根据8G物理内存我的推荐配置是docker run -d \ --name jira \ -p 8080:8080 \ -p 8443:8443 \ -e JVM_MINIMUM_MEMORY3072m \ -e JVM_MAXIMUM_MEMORY4096m \ -e JVM_RESERVED_CODE_CACHE_SIZE512m \ -v /data/jira:/var/atlassian/jira \ -v /data/jira/logs:/opt/atlassian/jira/logs \ custom-jira:9.12.0这里有几个经验值JVM最小内存设为物理内存的40%最大内存不超过物理内存的60%额外预留512M给代码缓存4. 生产级网络与存储配置单机部署可以直接用bridge网络但集群环境需要特别规划。我设计过的一个方案是创建独立网络docker network create --subnet172.20.0.0/24 jira-net然后容器启动时加入该网络docker run ... --network jira-net --ip 172.20.0.2 ...存储方面除了基本的卷映射还需要考虑备份策略。我常用的备份方案是# 每日凌晨备份 0 2 * * * docker exec jira /bin/bash -c pg_dump -U jira -d jiradb /var/atlassian/jira/backup/$(date \%Y\%m\%d).sql数据库连接建议使用外置PostgreSQL性能比内嵌的H2好很多。这是经过验证的连接配置jira.database.typepostgresql jira.database.urljdbc:postgresql://db-host:5432/jiradb jira.database.driverorg.postgresql.Driver jira.database.userjira jira.database.passwordyour_strong_password5. 性能调优与监控Jira启动后还需要进行深度优化。首先调整Tomcat配置docker exec -it jira sed -i s/Connector port8080/Connector port8080 maxThreads200 minSpareThreads25 acceptCount200/ /opt/atlassian/jira/conf/server.xml然后配置缓存参数这是我的推荐值参数名推荐值说明plugin.resource.download.cache.size500插件缓存数量plugin.resource.download.cache.ttl86400缓存有效期(秒)jira.lf.menu.cache.size200菜单缓存大小监控方面建议配置Prometheus采集指标# prometheus.yml 配置示例 scrape_configs: - job_name: jira metrics_path: /plugins/servlet/prometheus/metrics static_configs: - targets: [jira-host:8080]6. 安全加固措施生产环境必须做好安全防护。首先配置HTTPS# 使用Lets Encrypt证书 docker run -it --rm -p 443:443 -p 80:80 \ -v /etc/letsencrypt:/etc/letsencrypt \ certbot/certbot certonly --standalone -d your-domain.com然后在Jira的server.xml中配置SSLConnector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads150 SSLEnabledtrue SSLHostConfig Certificate certificateFile/etc/letsencrypt/live/your-domain.com/cert.pem certificateKeyFile/etc/letsencrypt/live/your-domain.com/privkey.pem certificateChainFile/etc/letsencrypt/live/your-domain.com/chain.pem / /SSLHostConfig /Connector定期更新也很关键我写了个自动更新证书的脚本#!/bin/bash docker stop jira certbot renew --quiet docker start jira7. 日常维护与问题排查维护Jira最常遇到的就是内存泄漏问题。我的排查步骤是先用docker stats看实时资源占用如果内存持续增长执行docker exec jira jcmd 1 GC.heap_dump /tmp/heap.hprof用Eclipse MAT分析内存快照日志分析也有技巧推荐配置logrotate/data/jira/logs/*.log { daily missingok rotate 30 compress delaycompress notifempty copytruncate }数据库维护方面定期执行VACUUM ANALYZE能显著提升查询速度。我设置了一个每周任务-- 创建维护脚本 CREATE OR REPLACE FUNCTION jiradb_maintenance() RETURNS void AS $$ BEGIN VACUUM ANALYZE; REINDEX DATABASE jiradb; END; $$ LANGUAGE plpgsql;