共计 5313 个字符,预计需要花费 14 分钟才能阅读完成。
概述
GitLab Community Edition(简称 GITLAB-CE)是一款开源的 DevOps 平台,集成了代码仓库管理、版本控制、issue 跟踪、CI/CD 流水线、Wiki 和容器仓库等功能,为软件开发团队提供一站式的协作解决方案。通过 Docker 容器化部署 GITLAB-CE,可大幅简化安装流程、提高环境一致性,并便于快速扩展和迁移。本文将详细介绍如何通过 Docker 快速部署 GITLAB-CE,并提供生产环境优化建议及故障排查方案。
环境准备
Docker 环境安装
GITLAB-CE 容器化部署依赖 Docker 引擎,推荐使用以下一键安装脚本完成 Docker 环境配置(支持 Ubuntu/Debian/CentOS 等主流 Linux 发行版):
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
脚本将自动完成 Docker 引擎、Docker Compose 的安装,并配置开机自启动。安装完成后,可通过以下命令验证 Docker 状态:
docker --version # 验证 Docker 引擎版本
docker compose version # 验证 Docker Compose 版本
systemctl status docker # 检查 Docker 服务状态
镜像准备
镜像信息说明
GITLAB-CE 官方镜像由 GitLab 团队维护,镜像详细信息及所有可用标签可参考 轩辕镜像 – GITLAB-CE 文档 及GITLAB-CE 镜像标签列表。
镜像拉取命令
# 拉取最新稳定版(推荐)docker pull xxx.xuanyuan.run/gitlab/gitlab-ce:latest
# 如需指定版本,将标签替换为具体版本号(例如 16.10.0-ce.0)# docker pull xxx.xuanyuan.run/gitlab/gitlab-ce:16.10.0-ce.0
镜像验证
拉取完成后,通过以下命令验证镜像是否成功下载:
docker images | grep gitlab/gitlab-ce
若输出类似以下内容,说明镜像拉取成功:
xxx.xuanyuan.run/gitlab/gitlab-ce latest xxxxxxxx 2 weeks ago 2.1GB
容器部署
部署前准备
GITLAB-CE 运行需持久化存储配置、日志和数据,建议在主机创建专用目录并设置权限:
# 创建数据存储目录
sudo mkdir -p /srv/gitlab/{config,logs,data}
# 设置目录权限(确保容器内进程可读写)sudo chmod -R 777 /srv/gitlab
容器运行命令
使用以下命令启动 GITLAB-CE 容器,包含端口映射、数据卷挂载及基础配置:
docker run -d \
--name gitlab-ce \
--restart always \
--hostname gitlab.example.com \ # 替换为实际主机域名或 IP
-p 80:80 \ # HTTP 端口映射(主机: 容器)-p 443:443 \ # HTTPS 端口映射
-p 2222:22 \ # SSH 端口映射(避免与主机 22 端口冲突)-v /srv/gitlab/config:/etc/gitlab \ # 配置文件持久化
-v /srv/gitlab/logs:/var/log/gitlab \ # 日志文件持久化
-v /srv/gitlab/data:/var/opt/gitlab \ # 数据文件持久化
-e GITLAB_ROOT_PASSWORD="Admin123!" \ # 初始 root 密码(替换为强密码)xxx.xuanyuan.run/gitlab/gitlab-ce:latest
参数说明:
--restart always:容器退出时自动重启-p 80:80:将主机 80 端口映射到容器 HTTP 服务端口-p 443:443:HTTPS 端口映射(后续可配置 SSL 证书)-p 2222:22:SSH 端口映射(主机 2222 对应容器 22,避免冲突)-v:挂载数据卷,确保配置、日志和数据持久化-e GITLAB_ROOT_PASSWORD:设置管理员(root)初始密码
容器状态检查
容器启动后,通过以下命令监控初始化进度(首次启动需 10-15 分钟,取决于服务器性能):
# 查看容器运行状态
docker ps | grep gitlab-ce
# 查看初始化日志(关键步骤)docker logs -f gitlab-ce
当日志中出现类似 gitlab Reconfigured! 的信息时,说明初始化完成。
功能测试
访问 Web 界面
在浏览器中输入主机 IP 或域名(如 http://192.168.1.100),首次访问将显示 GitLab 登录页面。使用用户名root 及容器启动时设置的 GITLAB_ROOT_PASSWORD 密码登录。
基本功能验证
1. 创建项目
- 登录后点击右上角 ”+” 图标,选择 ”New project”
- 输入项目名称(如 ”test-project”),选择 ”Public” 或 ”Private”
- 点击 ”Create project” 完成创建
2. 克隆项目测试
通过 HTTPS 或 SSH 方式克隆项目(以 HTTPS 为例):
# 替换为实际项目 URL
git clone http://192.168.1.100/root/test-project.git
3. 提交代码测试
在克隆的项目中创建文件并提交:
cd test-project
echo "Hello GitLab" > README.md
git add README.md
git commit -m "Initial commit"
git push origin main
返回 Web 界面刷新项目页面,若能看到提交的 README.md 文件,说明代码仓库功能正常。
4. CI/CD 功能验证(可选)
在项目根目录创建 .gitlab-ci.yml 文件,内容如下:
stages:
- test
test_job:
stage: test
script:
- echo "CI/CD pipeline test passed"
提交后进入项目 ”CI/CD > Pipelines” 页面,若显示流水线状态为 ”passed”,说明 CI/CD 功能正常。
生产环境建议
硬件资源配置
GITLAB-CE 对资源要求较高,生产环境建议配置:
- CPU:至少 2 核(推荐 4 核及以上)
- 内存:至少 4GB(推荐 8GB 及以上,内存不足会导致性能严重下降)
- 存储:SSD 硬盘,至少 50GB 可用空间(根据代码仓库大小调整)
安全加固
1. 配置 HTTPS
通过 Let’s Encrypt 获取免费 SSL 证书,并在 GitLab 中配置:
# 进入容器修改配置
docker exec -it gitlab-ce vi /etc/gitlab/gitlab.rb
# 修改以下配置(替换为实际域名)external_url 'https://gitlab.example.com'
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['[email protected]']
# 重新配置 GitLab
docker exec -it gitlab-ce gitlab-ctl reconfigure
2. 限制容器权限
运行容器时添加 --user 参数指定非 root 用户,或使用 --cap-drop=ALL 减少容器权限:
docker run -d \
--name gitlab-ce \
--user 1000:1000 \ # 使用主机普通用户 ID(需提前创建并授权目录)--cap-drop=ALL \ # 禁用所有 Linux capabilities
# 其他参数...
3. 防火墙配置
仅开放必要端口(80/443/2222),以 UFW 为例:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp
sudo ufw enable
数据备份策略
1. 自动备份配置
修改 GitLab 配置启用自动备份:
docker exec -it gitlab-ce vi /etc/gitlab/gitlab.rb
# 设置备份保留时间(7 天)和备份路径
gitlab_rails['backup_keep_time'] = 604800
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
# 配置定时备份(每天凌晨 2 点执行)echo "0 2 * * * gitlab-backup create" | docker exec -it gitlab-ce tee -a /etc/crontab
# 重新配置
docker exec -it gitlab-ce gitlab-ctl reconfigure
2. 备份文件迁移
定期将备份文件(位于/srv/gitlab/data/backups)复制到外部存储:
# 示例:同步到远程服务器
rsync -avz /srv/gitlab/data/backups/ user@backup-server:/path/to/backups/
监控与日志管理
1. 启用 Prometheus 监控
GitLab 内置 Prometheus,修改配置开启:
prometheus['enable'] = true
node_exporter['enable'] = true
通过 https://gitlab.example.com/-/metrics 访问监控指标,结合 Grafana 可实现可视化监控。
2. 日志轮转配置
修改 /etc/gitlab/gitlab.rb 配置日志轮转策略:
logging['logrotate_frequency'] = 'daily' # 每天轮转
logging['logrotate_maxsize'] = '100M' # 单个日志文件最大 100MB
logging['logrotate_rotate'] = 30 # 保留 30 天日志
故障排查
常见问题及解决方法
1. 容器启动后无法访问 Web 界面
- 检查容器状态:
docker ps | grep gitlab-ce,若状态为 ”restarting”,查看日志:docker logs gitlab-ce - 端口冲突 :使用
netstat -tuln | grep 80检查端口是否被占用,若冲突需修改端口映射(如-p 8080:80) - 内存不足:查看系统内存使用
free -m,若内存不足(剩余 <1GB),需增加内存或关闭其他服务
2. 初始密码无法登录
- 密码文件路径 :通过数据卷在主机
/srv/gitlab/config/initial_root_password查看初始密码 - 文件时效:初始密码文件会在容器启动 24 小时后自动删除,若已删除,通过以下命令重置密码:
docker exec -it gitlab-ce gitlab-rails console # 在控制台中执行(需等待加载完成)user = User.where(id: 1).first user.password = 'NewStrongPassword123!' user.save! exit
3. CI/CD 流水线执行失败
- Runner 未注册:进入 ”Settings > CI/CD > Runners”,按照指引注册 GitLab Runner
- 权限问题:确保 Runner 具有足够权限访问代码仓库,或使用共享 Runner
- 日志排查:在流水线详情页面点击失败任务,查看 ”Job log” 获取具体错误信息
4. 数据备份失败
- 磁盘空间:检查备份目录所在磁盘空间
df -h /srv/gitlab/data,确保有足够空间 - 权限问题:确认备份目录权限为 777(
chmod -R 777 /srv/gitlab/data/backups) - 手动执行备份测试:
docker exec -it gitlab-ce gitlab-backup create,查看输出错误信息
参考资源
- 轩辕镜像 – GITLAB-CE 文档
- GITLAB-CE 镜像标签列表
- GitLab 官方文档 – Docker 部署指南
- GitLab 官方文档 – 配置参考
- GitLab 官方文档 – 备份与恢复
总结
本文详细介绍了 GITLAB-CE 的 Docker 容器化部署方案,从环境准备、镜像拉取、容器运行到功能验证,提供了完整的操作流程,并针对生产环境给出了资源配置、安全加固、备份策略等优化建议,同时覆盖了常见故障的排查方法。
关键要点:
- 使用一键脚本可快速完成 Docker 环境及镜像加速配置,简化部署流程
- 镜像拉取命令为
docker pull xxx.xuanyuan.run/gitlab/gitlab-ce:latest - 数据卷挂载是持久化 GitLab 配置、日志和数据的核心,生产环境必须配置
- 初始密码需在容器启动 24 小时内获取,或通过控制台手动重置
- 生产环境需重点关注资源配置(尤其是内存)和安全加固(如 HTTPS 配置)
后续建议:
- 深入学习 GitLab CI/CD 功能,配置自动化构建、测试和部署流水线
- 根据团队规模和需求,调整 GitLab 角色权限及项目管理策略
- 建立定期备份机制,并测试备份恢复流程,确保数据安全
- 关注 GitLab 官方更新日志,及时升级镜像以获取新功能和安全补丁
通过容器化部署 GITLAB-CE,团队可快速搭建企业级 DevOps 平台,提升开发协作效率。如需进一步扩展,可结合 Docker Compose 或 Kubernetes 实现更复杂的部署架构。







很久没更新了。
大佬,不知道过了这么久这个脚本还有没有在…
被投诉下线了。
点了那个链接?
被投诉下线了。
https://idea.hacks.t…