在 Debian 上使用 Docker 部署 GitLab 的完整步骤
一 环境准备
- 更新系统并安装必要组件:
- sudo apt update && sudo apt upgrade -y
- sudo apt install -y curl openssh-server ca-certificates tzdata perl
- 安装 Docker(Debian 推荐包名为 docker.io):
- sudo apt install -y docker.io
- sudo systemctl start docker && sudo systemctl enable docker
- 安装 Docker Compose(可选但推荐,便于多服务编排):
- 建议方式:sudo apt install -y docker-compose-plugin
- 或二进制方式:
- curl -L “https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose
- 验证安装:
- docker --version
- docker compose version 或 docker-compose --version
- 开放防火墙端口(如使用 UFW):
- sudo ufw allow 80,443,22/tcp
- 如使用云服务器,还需在云平台安全组放行对应端口。
二 使用 Docker Compose 部署
- 创建持久化目录(示例放在 /data/gitlab,可自定义):
- sudo mkdir -p /data/gitlab/{config,logs,data}
- 新建 docker-compose.yml(示例将宿主机 5480/5443/5022 映射到容器内 80/443/22,避免与宿主机 SSH 冲突):
- version: “3.8”
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: gitlab.example.com
environment:
TZ: Asia/Shanghai
GITLAB_OMNIBUS_CONFIG: |
external_url ‘https://gitlab.example.com’
nginx[‘redirect_http_to_https’] = true
gitlab_rails[‘gitlab_shell_ssh_port’] = 5022
ports:
- “5480:80”
- “5443:443”
- “5022:22”
volumes:
- /data/gitlab/config:/etc/gitlab
- /data/gitlab/logs:/var/log/gitlab
- /data/gitlab/data:/var/opt/gitlab
- /etc/localtime:/etc/localtime:ro
shm_size: “256m”
- 启动服务:
- 在 docker-compose.yml 同目录执行:docker compose up -d
- 首次访问与初始化:
- 浏览器访问:https://gitlab.example.com(或 http://服务器IP:5480 做临时验证)
- 首次进入设置管理员 root 密码;如需查看初始密码(容器首次启动后 24 小时内有效):
- sudo docker exec -it gitlab cat /etc/gitlab/initial_root_password。
三 使用 docker run 快速部署(可选)
- 运行容器(示例将宿主机 8080/8443/2222 映射到容器内 80/443/22):
- sudo docker run --detach
–hostname gitlab.example.com
–restart always
-p 8080:80 -p 8443:443 -p 2222:22
–name gitlab
-v /opt/gitlab/config:/etc/gitlab
-v /opt/gitlab/logs:/var/log/gitlab
-v /opt/gitlab/data:/var/opt/gitlab
-v /etc/localtime:/etc/localtime:ro
gitlab/gitlab-ce:latest
- 访问方式与上文一致(注意端口对应为 8080/8443/2222)。
四 关键配置与运维
- HTTPS 与证书
- 方式 A(推荐,容器内自动申请与续期):在 docker-compose.yml 的 GITLAB_OMNIBUS_CONFIG 中设置 external_url 为 https://域名,并启用重定向;首次启动后进入容器执行:
- docker exec -it gitlab gitlab-ctl reconfigure
- 如需使用 Let’s Encrypt,确保域名可解析到服务器并开放 80/443,然后执行:
- docker exec -it gitlab gitlab-ctl renew-le-certs
- 方式 B(手动证书挂载):将证书挂载到容器内 /etc/gitlab/ssl 并在 gitlab.rb 中配置:
- external_url ‘https://gitlab.example.com’
- nginx[‘ssl_certificate’] = “/etc/gitlab/ssl/gitlab.example.com.crt”
- nginx[‘ssl_certificate_key’] = “/etc/gitlab/ssl/gitlab.example.com.key”
- 执行:docker exec -it gitlab gitlab-ctl reconfigure
- SSH 克隆端口
- 若宿主机 SSH 已占用 22,在 gitlab.rb 中设置:gitlab_rails[‘gitlab_shell_ssh_port’] = 5022,并将宿主机的 5022 映射到容器 22;客户端使用:
- git clone ssh://git@gitlab.example.com:5022/namespace/project.git
- 备份与恢复
- 手动备份(备份文件位于挂载的 data/backups 目录):
- docker exec -t gitlab gitlab-rake gitlab:backup:create
- 恢复(将 BACKUP 替换为实际备份文件名,不含 .tar):
- docker exec -it gitlab gitlab-rake gitlab:backup:restore BACKUP=YYYY_MM_DD_HHMMSS
- 常用运维
- 查看日志:docker compose logs -f 或 docker logs -f gitlab
- 进入容器:docker exec -it gitlab bash
- 重新配置(修改 gitlab.rb 后执行):docker exec -it gitlab gitlab-ctl reconfigure
- 重启服务:docker compose restart 或 docker restart gitlab。
五 常见问题与优化
- 端口冲突与端口规划
- 若宿主机已使用 80/443/22,请映射为其他端口(如 5480/5443/5022),并同步在 external_url 与 gitlab_shell_ssh_port 中调整。
- 资源与性能
- 建议为容器设置内存限制(如 docker-compose 的 deploy.resources.limits.memory),并适当调整 Omnibus 配置中的 Puma/Unicorn、Sidekiq 并发与缓存;生产环境建议启用 HTTPS。
- 邮件与通知
- 如需 SMTP,在 gitlab.rb 中配置(示例为 QQ 邮箱):
- gitlab_rails[‘smtp_enable’] = true
- gitlab_rails[‘smtp_address’] = “smtp.qq.com”
- gitlab_rails[‘smtp_port’] = 465
- gitlab_rails[‘smtp_user_name’] = “your@qq.com”
- gitlab_rails[‘smtp_password’] = “your_authorization_code”
- gitlab_rails[‘smtp_domain’] = “smtp.qq.com”
- gitlab_rails[‘smtp_authentication’] = “login”
- gitlab_rails[‘smtp_enable_starttls_auto’] = false
- gitlab_rails[‘smtp_tls’] = true
- gitlab_rails[‘gitlab_email_from’] = “your@qq.com”
- 执行:docker exec -it gitlab gitlab-ctl reconfigure
- 升级与回滚
- 升级:修改 docker-compose.yml 中的镜像标签(如从 17.4.6 升到 17.5.x),执行 docker compose pull && docker compose up -d;回滚则改回旧标签并重启。