Skip to main content

使用 Docker 搭建 GitLab 完整指南

GitLab 是一个功能强大的 DevOps 平台,使用 Docker 可以快速部署。以下是详细步骤:

1. 准备工作

系统要求

  • 至少 4GB RAM (推荐 8GB+)
  • 至少 4核 CPU
  • 100GB+ 磁盘空间
  • Docker 20.10+
  • Docker Compose 2.0+

2. 使用 Docker Compose 部署

创建 docker-compose.yml 文件:

version: '3.6'
services:
  gitlab:
    image: gitlab/gitlab-ee:latest  # 社区版使用 gitlab/gitlab-ce
    container_name: gitlab
    hostname: gitlab.example.com    # 替换为你的域名
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'  # 外部访问URL
        # 邮件配置
        gitlab_rails['gitlab_email_enabled'] = true
        gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
        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
        # 其他配置
        nginx['redirect_http_to_https'] = true
        letsencrypt['enable'] = true
        letsencrypt['contact_emails'] = ['admin@example.com']
    ports:
      - "80:80"
      - "443:443"
      - "22:22"  # SSH端口
    volumes:
      - ./gitlab/config:/etc/gitlab
      - ./gitlab/logs:/var/log/gitlab
      - ./gitlab/data:/var/opt/gitlab
    restart: always
    networks:
      - gitlab_net
    shm_size: '256m'

networks:
  gitlab_net:
    driver: bridge

3. 启动 GitLab

# 创建所需目录
mkdir -p gitlab/{config,logs,data}

# 启动服务
docker-compose up -d

首次启动需要几分钟时间初始化。

4. 访问与配置

获取初始密码

docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

访问 https://your-domain.com 使用用户名 root 和上面获取的密码登录。

重要配置

  1. SSH克隆配置

    • 确保 gitlab_rails['gitlab_shell_ssh_port'] = 22 与映射端口一致
  2. 备份配置

    gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
    gitlab_rails['backup_keep_time'] = 604800  # 保留7天
    
  3. 性能调优

    unicorn['worker_timeout'] = 60
    sidekiq['concurrency'] = 10
    

修改配置后需要重新加载:

docker exec -it gitlab gitlab-ctl reconfigure
docker exec -it gitlab gitlab-ctl restart

5. 日常维护

备份

docker exec -it gitlab gitlab-backup create

恢复备份

# 先停止相关服务
docker exec -it gitlab gitlab-ctl stop unicorn
docker exec -it gitlab gitlab-ctl stop sidekiq

# 恢复备份 (备份文件名如 1652353536_2022_05_12_14.0.3_gitlab_backup.tar)
docker exec -it gitlab gitlab-backup restore BACKUP=1652353536_2022_05_12_14.0.3

# 重启服务
docker exec -it gitlab gitlab-ctl restart

升级版本

# 停止当前容器
docker-compose down

# 拉取新镜像
docker-compose pull

# 重新启动
docker-compose up -d

# 在容器内执行升级
docker exec -it gitlab gitlab-ctl reconfigure
docker exec -it gitlab gitlab-ctl restart

6. 常见问题解决

性能问题

  1. 增加资源

    # 在docker-compose.yml中添加
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
    
  2. 调整Sidekiq

    sidekiq['min_concurrency'] = 2
    sidekiq['max_concurrency'] = 8
    

邮件配置测试

docker exec -it gitlab gitlab-rails console
> Notify.test_email('test@example.com', 'Test', 'Test Body').deliver_now

端口冲突

如果端口冲突,可以修改为:

ports:
  - "8080:80"
  - "8443:443"
  - "2222:22"

然后配置:

gitlab_rails['gitlab_shell_ssh_port'] = 2222

7. 安全建议

  1. 定期更新:每月检查并更新GitLab镜像
  2. 启用HTTPS:配置有效的SSL证书
  3. 备份策略:每日备份并测试恢复
  4. 监控:设置健康检查
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/-/health"]
      interval: 1m
      timeout: 10s
      retries: 3
    

8. 扩展功能

集成Runner

services:
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    container_name: gitlab-runner
    restart: always
    depends_on:
      - gitlab
    volumes:
      - ./gitlab-runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - gitlab_net

注册Runner:

docker exec -it gitlab-runner gitlab-runner register
  --url "https://gitlab.example.com"
  --registration-token "PROJECT_REGISTRATION_TOKEN"
  --executor "docker"
  --description "docker-runner"
  --docker-image "alpine:latest"

这样你就拥有了一个完整的Docker化GitLab环境,包含持续集成能力。