CentOS GitLab 与 Docker 集成教程
一 环境准备与安装
- 系统建议:CentOS 7.x,推荐内存≥4GB(生产建议8GB+),磁盘≥50GB,CPU≥4核。
- 安装 Docker(CE):
- 卸载旧版本(如有):sudo yum remove -y docker* containerd.io
- 安装依赖:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加仓库:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装并启动:sudo yum install -y docker-ce docker-ce-cli containerd.io && sudo systemctl enable --now docker
- 验证:docker version 或 docker run --rm hello-world
- 安装 Docker Compose(可选但推荐):
- 下载二进制:sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
- 赋权:sudo chmod +x /usr/local/bin/docker-compose
- 验证:docker-compose --version
- 防火墙放行(如启用 firewalld):sudo firewall-cmd --permanent --add-service=http --add-service=https && sudo firewall-cmd --reload。
二 使用 Docker Compose 部署 GitLab 与 Registry
- 目录与持久化:
- 建议目录:/data/gitlab/{config,logs,data}(权限 755,属主可设为 997:997 以匹配容器内 git 用户)
- 示例 docker-compose.yml(同时启用内置 Container Registry):
- 端口说明:80/443 为 GitLab Web,5000 为 Registry,2222 为容器内 SSH(宿主机 22 常被占用)
- 如需使用域名与证书,将 external_url 与 registry_external_url 改为 https:// 并配置证书路径
version: “3.6”
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: unless-stopped
hostname: ‘gitlab.example.com’
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url ‘http://gitlab.example.com’
gitlab_rails[‘gitlab_shell_ssh_port’] = 2222
registry_external_url ‘http://gitlab.example.com:5000’
registry[‘enable’] = true
ports:
- “80:80”
- “443:443”
- “5000:5000”
- “2222:22”
volumes:
- /data/gitlab/config:/etc/gitlab
- /data/gitlab/logs:/var/log/gitlab
- /data/gitlab/data:/var/opt/gitlab
- 启动与初始化:
- 启动:docker-compose up -d
- 首次访问:http://服务器IP 或域名,设置 root 初始密码
- 进入 Admin Area → Settings → General → Container Registry,勾选 Enable Container Registry
- 如需域名与证书,改为 https 并在 GitLab 管理界面或配置中设置证书路径后执行:docker exec -it gitlab gitlab-ctl reconfigure
三 登录与推送镜像到内置 Registry
- 登录 Registry(使用 GitLab 用户名 + 密码,或个人访问令牌):
- docker login gitlab.example.com:5000
- 构建并推送镜像(项目路径格式:<域名:端口>/<命名空间>/<仓库>:<标签>):
- docker build -t gitlab.example.com:5000/your-group/your-app:latest .
- docker push gitlab.example.com:5000/your-group/your-app:latest
- 拉取镜像:
- docker pull gitlab.example.com:5000/your-group/your-app:latest
- 常见问题排查:
- 登录失败:确认 Registry 已启用、端口开放、凭据正确(令牌需在 GitLab 个人设置中生成)
- 推送被拒:项目 Container Registry 权限是否允许(项目设置 → Repository → Container Registry)
- 证书问题:HTTP 仅用于测试;生产请启用 HTTPS/TLS
四 在 GitLab CI/CD 中使用 Docker
-
安装并注册 Runner(在 CentOS 上以 Docker 执行器为例):
- 安装 Runner(示例):curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
sudo yum install -y gitlab-runner
- 注册 Runner:sudo gitlab-runner register(按提示填写 GitLab 地址、项目注册令牌、执行器选 docker)
- 配置 Runner 使用 Docker(示例 /etc/gitlab-runner/config.toml 片段):
[[runners]]
name = “docker-runner”
url = “https://gitlab.example.com/”
token = “TOKEN”
executor = “docker”
[runner.docker]
tls_verify = false
image = “docker:stable”
privileged = true
disable_cache = false
volumes = [“/cache”, “/var/run/docker.sock:/var/run/docker.sock”]
-
示例 .gitlab-ci.yml(构建并推送到内置 Registry):
stages:
variables:
REGISTRY: gitlab.example.com:5000
IMAGE: $REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_SHA
build:
stage: build
image: docker:stable
services:
- docker:dind
script:
- docker build -t $IMAGE .
test:
stage: test
image: docker:stable
script:
- docker run --rm $IMAGE ./run-tests.sh
push:
stage: push
image: docker:stable
services:
- docker:dind
script:
- echo “$CI_REGISTRY_PASSWORD” | docker login -u “$CI_REGISTRY_USER” --password-stdin $REGISTRY
- docker push $IMAGE
only:
- main
-
说明:
- 使用 docker:dind(Docker-in-Docker)需要在 Runner 配置中开启 privileged,并确保内核开启 overlay2(生产建议)
- CI 变量 CI_REGISTRY_USER/CI_REGISTRY_PASSWORD 可在项目设置 → CI/CD → Variables 中配置(推荐)
五 安全加固与运维要点
- HTTPS/TLS:
- 为 GitLab 与 Registry 配置有效证书(如 Let’s Encrypt),或在前置 Nginx/Ingress 终止 TLS
- 证书变更后执行:docker exec -it gitlab gitlab-ctl reconfigure
- 访问控制:
- 利用 GitLab 项目/组的 权限模型 控制 Registry 推送/拉取
- 可在反向代理层增加 IP 白名单 与 速率限制
- 镜像安全:
- 启用 Docker Content Trust(DCT) 进行镜像签名与验证
- 存储与性能:
- 测试环境可用本地存储;生产建议对接 S3 等对象存储(registry[‘storage’] 配置)
- 备份与恢复:
- 定期备份数据卷(/data/gitlab),可使用脚本或编排工具实现一致性快照
- 升级与维护:
- 遵循“先备份、后升级”的流程;变更前在测试环境验证
- 升级 GitLab 容器:docker-compose pull && docker-compose up -d(注意版本兼容与数据卷迁移)