1. 为什么选择Docker部署GitLab
GitLab作为一款开源的代码托管平台,已经成为现代软件开发团队的标准配置。相比传统的物理机或虚拟机部署方式,使用Docker容器化部署GitLab具有几个显著优势:
首先,Docker的轻量级特性让GitLab的部署和迁移变得极为便捷。一个完整的GitLab服务(包括Web界面、数据库、Redis缓存等组件)可以通过简单的docker-compose命令快速拉起,而无需手动安装和配置各种依赖。我在实际工作中曾用传统方式部署过GitLab,光是解决Ruby环境依赖就花了半天时间,而Docker部署只需要几分钟。
其次,资源隔离和版本管理更加清晰。每个GitLab实例运行在独立的容器中,不会污染宿主机环境。当需要升级GitLab版本时,只需拉取新版本的镜像并重新部署,回滚也同样简单。这对于需要维护多个GitLab实例(如开发、测试、生产环境)的团队特别有用。
2. 环境准备与前置条件
2.1 硬件资源评估
根据GitLab官方文档的建议,一个中小型团队使用的GitLab实例至少需要:
- 4核CPU
- 4GB内存(实际使用中建议8GB以上)
- 至少100GB存储空间(代码仓库会随时间增长)
在我的实践中,一个50人左右的研发团队,使用2年后的GitLab实例占用了约200GB存储空间。因此建议预留足够的磁盘空间,或者配置外部存储卷。
2.2 软件环境要求
宿主机需要:
- Linux系统(推荐Ubuntu 20.04/22.04或CentOS 7/8)
- Docker Engine 20.10.0或更高版本
- Docker Compose v2(推荐使用v2格式的compose文件)
- 至少5GB的可用内存(GitLab容器本身会占用约3GB)
注意:虽然GitLab官方也提供Windows版的Docker镜像,但在生产环境中强烈建议使用Linux主机,性能和稳定性都更优。
3. 使用Docker Compose部署GitLab
3.1 编写docker-compose.yml
以下是经过生产验证的docker-compose.yml配置示例:
yaml复制version: '3.6'
services:
gitlab:
image: gitlab/gitlab-ce:15.11.0-ce.0
container_name: gitlab
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
nginx['listen_port'] = 80
nginx['listen_https'] = false
ports:
- "80:80"
- "443:443"
- "2222:22"
volumes:
- gitlab_config:/etc/gitlab
- gitlab_logs:/var/log/gitlab
- gitlab_data:/var/opt/gitlab
restart: always
shm_size: '256m'
volumes:
gitlab_config:
gitlab_logs:
gitlab_data:
关键配置说明:
external_url:设置GitLab的访问地址,如果启用HTTPS需要对应修改gitlab_shell_ssh_port:Git SSH协议使用的端口(默认22可能被占用)- 三个持久化卷分别存储配置、日志和应用数据
shm_size:解决Sidekiq内存不足的问题
3.2 启动与初始化
保存上述配置为docker-compose.yml后,执行:
bash复制docker-compose up -d
首次启动需要较长时间(约5-10分钟)进行初始化。可以通过以下命令查看日志:
bash复制docker-compose logs -f gitlab
当看到以下日志时,表示启动完成:
code复制gitlab | GitLab is ready!
4. 基础配置与优化
4.1 管理员密码设置
首次访问Web界面(http://your-server-ip)时,会提示设置root用户密码。这个密码务必妥善保存,它是系统的超级管理员账号。
4.2 SMTP邮件配置
要让GitLab发送通知邮件(如注册确认、密码重置等),需要配置SMTP。修改gitlab.rb配置(位于容器内的/etc/gitlab/gitlab.rb):
ruby复制gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "gitlab@example.com"
gitlab_rails['smtp_password'] = "yourpassword"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
然后重新加载配置:
bash复制docker exec -it gitlab gitlab-ctl reconfigure
4.3 性能调优
对于资源有限的服务器,可以调整以下参数减少内存占用:
ruby复制unicorn['worker_processes'] = 2
sidekiq['concurrency'] = 5
postgresql['shared_buffers'] = "256MB"
5. 数据备份与恢复
5.1 定期备份
GitLab提供了完整的备份命令:
bash复制docker exec -it gitlab gitlab-backup create
备份文件默认存储在/var/opt/gitlab/backups目录下。建议将备份文件同步到外部存储:
bash复制docker exec -it gitlab tar czvf /var/opt/gitlab/backups/$(date +%s)_gitlab_backup.tar.gz /var/opt/gitlab/backups/*
5.2 恢复备份
首先停止相关服务:
bash复制docker exec -it gitlab gitlab-ctl stop unicorn
docker exec -it gitlab gitlab-ctl stop sidekiq
然后执行恢复(BACKUP_TIMESTAMP替换为实际备份时间戳):
bash复制docker exec -it gitlab gitlab-backup restore BACKUP=BACKUP_TIMESTAMP
6. 常见问题排查
6.1 502错误
通常是由于Unicorn服务未正常启动。检查日志:
bash复制docker exec -it gitlab tail -f /var/log/gitlab/unicorn/unicorn_stderr.log
常见解决方法:
- 增加服务器内存
- 调整unicorn['worker_processes']数量
6.2 SSH克隆失败
如果使用非标准SSH端口(如示例中的2222),需要在客户端~/.ssh/config中添加:
code复制Host gitlab.example.com
Port 2222
6.3 容器启动慢
GitLab容器首次启动需要执行大量初始化操作。可以通过以下命令监控进度:
bash复制docker exec -it gitlab gitlab-ctl tail
7. 安全加固建议
7.1 启用HTTPS
推荐使用Let's Encrypt免费证书:
ruby复制letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['admin@example.com']
external_url 'https://gitlab.example.com'
7.2 定期更新
保持GitLab版本更新可以获取安全补丁:
bash复制docker-compose pull
docker-compose down
docker-compose up -d
7.3 防火墙配置
仅开放必要端口:
bash复制ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 2222/tcp
ufw enable
8. 高级功能扩展
8.1 集成CI/CD Runner
在docker-compose.yml中添加:
yaml复制services:
gitlab-runner:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- gitlab-runner-config:/etc/gitlab-runner
restart: always
注册Runner时使用容器内网络:
bash复制docker exec -it gitlab-runner gitlab-runner register \
--url "http://gitlab" \
--registration-token "YOUR_PROJECT_TOKEN" \
--executor "docker" \
--docker-image alpine:latest
8.2 配置LDAP认证
在gitlab.rb中添加:
ruby复制gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main:
label: 'Company LDAP'
host: 'ldap.example.com'
port: 636
uid: 'sAMAccountName'
bind_dn: 'CN=GitLab,OU=Service Accounts,DC=example,DC=com'
password: 'yourpassword'
encryption: 'simple_tls'
verify_certificates: true
active_directory: true
allow_username_or_email_login: false
block_auto_created_users: false
base: 'OU=Users,DC=example,DC=com'
EOS
9. 监控与维护
9.1 健康检查
GitLab内置了健康检查端点:
bash复制curl -H "Accept: application/json" "http://gitlab.example.com/-/health"
9.2 日志管理
重要的日志文件位置:
- /var/log/gitlab/nginx/gitlab_access.log - 访问日志
- /var/log/gitlab/gitlab-rails/production.log - 应用日志
- /var/log/gitlab/sidekiq/current - 后台任务日志
建议使用logrotate进行日志轮转:
bash复制docker exec -it gitlab bash -c "logrotate -f /etc/logrotate.d/gitlab"
9.3 资源监控
可以使用docker stats查看容器资源使用情况:
bash复制docker stats gitlab
或者配置Prometheus监控(GitLab内置了Prometheus exporter):
ruby复制prometheus['enable'] = true
node_exporter['enable'] = true
redis_exporter['enable'] = true
postgres_exporter['enable'] = true