在 Ubuntu 上用 Docker 部署 GitLab 并启用 CI/CD 运行 Docker 镜像
一 环境准备与安装
- 安装 Docker(Ubuntu 20.04/22.04/24.04 通用)
- 更新索引并安装依赖
- sudo apt-get update
- sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- 添加 Docker 官方 GPG 与仓库
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- echo “deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装并启动
- sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io
- sudo systemctl enable --now docker
- sudo usermod -aG docker $USER && newgrp docker
- 安装 Docker Compose(v2 推荐,若系统仓库版本过旧可按需使用独立二进制)
- sudo apt-get install -y docker-compose-plugin
- 验证:docker compose version
- 创建持久化目录
- sudo mkdir -p /srv/gitlab/{config,logs,data}
- sudo chown -R 1000:1000 /srv/gitlab # GitLab 容器内运行用户通常为 UID 1000
二 使用 Docker Compose 部署 GitLab
- 示例 docker-compose.yml(社区版 CE;如需企业版将镜像改为 gitlab/gitlab-ee:latest)
- version: “3.8”
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: ‘gitlab.example.com’ # 替换为你的域名或服务器 IP
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url ‘http://gitlab.example.com’ # 如启用 HTTPS 改为 https://…
gitlab_rails[‘time_zone’] = ‘Asia/Shanghai’
# 如需使用已有反向代理或非 22 端口,可调整:
# gitlab_rails[‘gitlab_shell_ssh_port’] = 2222
ports:
- “80:80”
- “443:443”
- “22:22”
volumes:
- /srv/gitlab/config:/etc/gitlab
- /srv/gitlab/logs:/var/log/gitlab
- /srv/gitlab/data:/var/opt/gitlab
shm_size: “256m”
- 启动与初始化
- cd /srv/gitlab && docker compose up -d
- 首次启动需等待数分钟,查看日志:docker compose logs -f
- 访问:http://gitlab.example.com(首次设置管理员密码)
- 常用运维
- 进入容器:docker compose exec -it gitlab bash
- 重新配置:docker compose exec gitlab gitlab-ctl reconfigure
- 备份:docker compose exec gitlab gitlab-rake gitlab:backup:create
- 恢复:docker compose exec gitlab gitlab-rake gitlab:backup:restore BACKUP=YYYY-MM-DD-HH-MM-SS
三 在 GitLab CI/CD 中使用 Docker
- 安装并注册 GitLab Runner(在 Ubuntu 宿主机)
- 安装 Runner(示例仓库方式,按提示选择执行器为 Docker)
- curl -s https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
- sudo apt-get install -y gitlab-runner
- 注册 Runner(需 GitLab 实例 URL 与 Registration Token)
- sudo gitlab-runner register
- Runner 配置要点(/etc/gitlab-runner/config.toml 片段)
- [[runners]]
- name = “docker-runner”
- url = “https://gitlab.example.com/”
- token = “TOKEN”
- executor = “docker”
- [runner.docker]
- image = “alpine:latest”
- privileged = false
- volumes = [“/cache”, “/var/run/docker.sock:/var/run/docker.sock”] # 如需在作业内调用宿主机 Docker 守护进程
- 示例 .gitlab-ci.yml(使用 Docker-in-Docker,dind)
- stages:
- build
- test
variables:
DOCKER_DRIVER: overlay2
IMAGE_TAG: $CI_REGISTRY/$CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG
services:
- docker:dind
before_script:
- docker info
build:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
test:
stage: test
script:
- docker run --rm $IMAGE_TAG ./run-tests.sh
四 安全与网络建议
- 启用 HTTPS:为 external_url 配置 https:// 域名,放置有效证书(如 Let’s Encrypt),并开放 443 端口;如仅在内网可保留 HTTP 并配合反向代理或内网 CA。
- SSH 端口规划:若宿主机已有 22 端口占用,可将 GitLab SSH 改为 2222 并在 GitLab 配置中同步设置 gitlab_rails[‘gitlab_shell_ssh_port’],同时防火墙放行 2222。
- Runner 与 Docker 权限:
- 需要作业内构建/推送镜像时,优先使用 dind 服务容器(更安全);若必须共享宿主机 Docker 守护进程,挂载 /var/run/docker.sock 并谨慎控制权限。
- 资源与稳定性:为 GitLab 容器设置合适的 shm_size(如 256MB 起步),并监控内存/CPU 使用;生产环境建议使用独立数据盘与备份策略。