1. 为什么选择Docker部署代码管理平台
在团队协作开发中,Gitlab和Gerrit是两种常见的代码管理工具。Gitlab提供完整的CI/CD解决方案,而Gerrit则以严格的代码评审机制著称。传统部署方式需要分别安装配置各种依赖环境,而Docker容器化部署能带来三个显著优势:
- 环境隔离:避免与宿主机环境冲突
- 快速部署:镜像包含所有运行时依赖
- 版本控制:可随时回滚到特定版本
我最近在团队内部署了这套组合,实测从零开始到完全可用只需2小时。下面分享具体实现过程和踩坑经验。
2. 基础环境准备
2.1 硬件资源配置建议
对于中小型团队(10-20人),推荐以下最低配置:
- CPU:4核以上
- 内存:8GB(Gitlab至少4GB)
- 存储:100GB SSD(代码仓库占用空间会持续增长)
注意:Gerrit对资源需求较低,主要压力在Gitlab服务
2.2 Docker环境配置
bash复制# 安装Docker CE版本
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 配置镜像加速(国内环境建议)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
}
EOF
# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
验证安装:
bash复制docker --version
docker run hello-world
3. Gitlab容器化部署
3.1 官方镜像选择
Gitlab提供三个官方镜像:
- gitlab/gitlab-ce:社区版(推荐)
- gitlab/gitlab-ee:企业版
- gitlab/gitlab-runner:CI专用
我们使用社区版最新稳定版:
bash复制docker pull gitlab/gitlab-ce:latest
3.2 持久化存储配置
关键数据需要挂载到宿主机:
bash复制mkdir -p /srv/gitlab/{config,logs,data}
目录作用:
- config:配置文件(包括密码等敏感信息)
- logs:运行日志
- data:代码仓库实际存储位置
3.3 启动容器实例
bash复制docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
端口说明:
- 80:HTTP访问
- 443:HTTPS访问
- 22:SSH协议代码推送
3.4 初始配置调优
首次启动约需5-10分钟,访问http://服务器IP后:
- 设置root密码(至少8位,含大小写和数字)
- 修改/etc/gitlab/gitlab.rb关键参数:
ruby复制external_url 'http://your.domain.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
nginx['listen_port'] = 80
- 重载配置:
bash复制docker exec -it gitlab gitlab-ctl reconfigure
4. Gerrit容器化部署
4.1 镜像选择与启动
Gerrit官方推荐镜像:
bash复制docker pull gerritcodereview/gerrit
启动命令:
bash复制docker run -d \
--name gerrit \
-p 8080:8080 \
-p 29418:29418 \
-v /srv/gerrit:/var/gerrit/review_site \
-e GERRIT_INIT_ARGS='--install-plugin=download-commands' \
gerritcodereview/gerrit
端口说明:
- 8080:Web界面
- 29418:SSH协议访问
4.2 初始化配置
首次访问http://服务器IP:8080会进入引导流程:
- 选择认证方式(推荐LDAP,与Gitlab统一)
- 设置管理员账号(不要与Gitlab重复)
- 配置邮件服务(用于代码评审通知)
关键配置文件位置:
/srv/gerrit/etc/gerrit.config
4.3 集成Gitlab账户
修改gerrit.config添加Gitlab OAuth:
ini复制[auth]
type = OAUTH
[plugin "gerrit-oauth-provider"]
client-id = [Gitlab应用的Application ID]
client-secret = [Gitlab应用的Secret]
root-url = https://your.gitlab.domain
5. 联合使用配置
5.1 权限同步方案
推荐两种同步方式:
-
LDAP统一认证:
- 在Gitlab配置LDAP服务
- Gerrit使用相同LDAP配置
-
API同步脚本:
python复制#!/usr/bin/env python
# 定时同步Gitlab组权限到Gerrit
import gitlab
from pygerrit2 import GerritRestAPI
gl = gitlab.Gitlab('http://gitlab.domain', private_token='xxx')
gerrit = GerritRestAPI(url='http://gerrit.domain:8080', auth='user:pass')
projects = gl.projects.list(all=True)
for p in projects:
# 实现权限映射逻辑...
5.2 工作流设计示例
典型代码提交流程:
- 开发者在Gitlab创建feature分支
- 本地开发后推送到Gitlab
- 通过
git push gerrit HEAD:refs/for/master发起评审 - Gerrit完成代码评审后合并到master
- 触发Gitlab CI/CD流水线
6. 运维管理要点
6.1 日常维护命令
Gitlab常用命令:
bash复制# 查看状态
docker exec -it gitlab gitlab-ctl status
# 备份(会生成时间戳tar包)
docker exec -it gitlab gitlab-rake gitlab:backup:create
# 恢复备份
docker exec -it gitlab gitlab-rake gitlab:backup:restore BACKUP=备份文件名
Gerrit常用命令:
bash复制# 重建索引(数据异常时使用)
docker exec -it gerrit java -jar /var/gerrit/bin/gerrit.war reindex
# 插件管理
docker exec -it gerrit ls /var/gerrit/plugins
6.2 性能监控方案
推荐监控指标:
-
Gitlab:
- Sidekiq队列长度
- 数据库连接池使用率
- 仓库存储增长趋势
-
Gerrit:
- JVM内存使用
- 索引延迟时间
- SSH连接数
可使用Prometheus+Granfana配置监控看板,Gitlab自带Prometheus exporter。
7. 常见问题排查
7.1 502错误处理
Gitlab出现502的可能原因:
- Puma worker崩溃:
bash复制docker exec -it gitlab gitlab-ctl restart puma
- 内存不足:
bash复制# 调整worker数量
vi /srv/gitlab/config/gitlab.rb
puma['worker_processes'] = 2 # 小于4GB内存建议设为2
7.2 Gerrit索引失败
症状:页面显示404但服务正常运行
解决方法:
bash复制docker exec -it gerrit java -jar /var/gerrit/bin/gerrit.war reindex --index projects
7.3 邮件服务异常
测试邮件发送:
bash复制# Gitlab测试
docker exec -it gitlab gitlab-rails console
Notify.test_email('target@example.com', 'Test', 'Body').deliver_now
# Gerrit测试
docker exec -it gerrit sendmail -v -f admin@domain.com target@example.com
检查共同配置项:
- 端口是否被防火墙阻止(通常25/465/587)
- 是否启用TLS但证书无效
- 用户名密码是否包含特殊字符
8. 安全加固建议
8.1 网络层防护
- 限制访问IP:
bash复制# Gitlab Nginx配置
vi /srv/gitlab/config/nginx/conf.d/gitlab-http.conf
allow 192.168.1.0/24;
deny all;
- 启用HTTPS:
bash复制# 申请Let's Encrypt证书
docker run -it --rm \
-v /srv/gitlab/config/ssl:/etc/letsencrypt \
-p 80:80 \
certbot/certbot certonly --standalone -d gitlab.domain.com
8.2 容器安全
- 定期更新镜像:
bash复制docker pull gitlab/gitlab-ce:latest
docker pull gerritcodereview/gerrit:latest
- 非root用户运行:
bash复制docker run --user 1000:1000 ...
- 资源限制:
bash复制docker run --memory 4g --cpus 2 ...
这套部署方案在我们团队稳定运行了8个月,支撑了30+项目的并行开发。实际使用中发现三个经验点:1) 每周定时备份不能少 2) Gitlab的Sidekiq队列需要特别关注 3) Gerrit的JVM参数需要根据项目数量调整。下一步计划尝试将Gerrit的评审数据也同步到Gitlab的Merge Request中实现双向可视。