在 Docker 容器中安装极狐GitLab
所有级别
私有化部署

在 Docker 容器中安装极狐GitLab,使用 Docker Compose、Docker Engine 或 Docker Swarm 模式。

先决条件:

  • 你必须有可用的 Docker 安装,且不是在 Windows 的 Docker 上。官方并不支持在 Windows 的 Docker 中进行安装,因为一些已知的兼容性问题。
  • 你必须有一个邮件传输代理(MTA),例如 Postfix 或 Sendmail。极狐GitLab 镜像不包含 MTA。你可以在单独的容器中安装 MTA。虽然你可以在同一个容器中安装 MTA,但你可能需要在每次升级或重新启动后重新安装 MTA。
  • 你不应该计划在 Kubernetes 上部署极狐GitLab Docker 镜像,因为这会有单点故障风险。如果你想在 Kubernetes 上部署,使用极狐GitLab Helm ChartGitLab Operator
  • 你必须有一个有效的、外部可访问的主机名。不要使用 localhost

配置 SSH 端口

默认情况下,极狐GitLab 使用端口 22 来使用 Git SSH 功能。要使用端口 22,跳过此部分。

要使用不同的端口,你可以:

  • 修改服务器的 SSH 端口(推荐)。SSH 克隆 URL 不需要新的端口号:

    ssh://git@gitlab.example.com/user/project.git
    
  • 安装之后,修改极狐GitLab Shell SSH 端口。然后 SSH 克隆 URL 会包含配置的端口号:

    ssh://git@gitlab.example.com:<portNumber>/user/project.git
    

要修改服务器的 SSH 端口:

  1. 用编辑器打开 /etc/ssh/sshd_config,并更改 SSH 端口:

    Port = 2424
    
  2. 保存文件并重启 SSH 服务:

    sudo systemctl restart ssh
    
  3. 验证你可以通过 SSH 进行连接。打开一个新的会话窗口并 SSH 到使用此新端口的服务器上。

为卷创建目录

为配置文件、日志和数据文件创建一个目录。目录可以在你用户的主目录下(比如 ~/gitlab-docker),或者在类似 /srv/gitlab 的目录中。

  1. 创建目录:

    sudo mkdir -p /srv/gitlab
    
  2. 如果你在用非 root 用户运行 Docker,为新目录授予适当的权限:

  3. 配置新的环境变量 $GITLAB_HOME,设置为新目录的路径:

    export GITLAB_HOME=/srv/gitlab
    
  4. 可选地,你可以将 GITLAB_HOME 环境变量添加到你的 Shell 的配置文件中,以便在所有未来的终端会话中应用它:

    • Bash: ~/.bash_profile
    • ZSH: ~/.zshrc

极狐GitLab 容器使用主机挂载卷来存储持久数据:

本地位置 容器位置 使用目的
$GITLAB_HOME/data /var/opt/gitlab 存储应用数据。
$GITLAB_HOME/logs /var/log/gitlab 存储日志。
$GITLAB_HOME/config /etc/gitlab 存储配置文件。

查找使用的极狐GitLab 版本

在生产环境中,你应该将你的部署固定在特定的极狐GitLab 版本上。可以在极狐GitLab 容器镜像 Tag 的 2 种方式找到你所需要的极狐GitLab 容器镜像版本。

安装

你可以使用如下方式在 Docker 中安装极狐GitLab:

使用 Docker Compose 安装极狐GitLab

使用 Docker Compose,你可以在 Docker 容器中配置、安装和升级狐GitLab:

  1. 安装 Docker Compose
  2. 创建一个 docker-compose.yml 文件。比如:

    version: '3.6'
    services:
      gitlab:
        image: gitlab/gitlab-ee:<version>-ee.0
        container_name: gitlab
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            # Add any other gitlab.rb configuration here, each on its own line
            external_url 'https://gitlab.example.com'
        ports:
          - '80:80'
          - '443:443'
          - '22:22'
        volumes:
          - '$GITLAB_HOME/config:/etc/gitlab'
          - '$GITLAB_HOME/logs:/var/log/gitlab'
          - '$GITLAB_HOME/data:/var/opt/gitlab'
        shm_size: '256m'
    
    note 阅读预配置 Docker 容器以了解 GITLAB_OMNIBUS_CONFIG 变量是如何工作的。

    这还有一个使用自定义 HTTP 和 SSH 端口的 docker-compose.yml 示例。注意 GITLAB_OMNIBUS_CONFIG 变量与 ports 部分匹配:

    version: '3.6'
    services:
      gitlab:
        image: gitlab/gitlab-ee:<version>-ee.0
        container_name: gitlab
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            external_url 'http://gitlab.example.com:8929'
            gitlab_rails['gitlab_shell_ssh_port'] = 2424
        ports:
          - '8929:8929'
          - '443:443'
          - '2424:22'
        volumes:
          - '$GITLAB_HOME/config:/etc/gitlab'
          - '$GITLAB_HOME/logs:/var/log/gitlab'
          - '$GITLAB_HOME/data:/var/opt/gitlab'
        shm_size: '256m'
    

    此配置与使用 --publish 8929:8929 --publish 2424:22 相同。

  3. docker-compose.yml 相同的目录下,启动 GitLab:

    docker compose up -d
    

使用 Docker Engine 安装极狐GitLab

你还可以使用 Docker Engine 来安装极狐GitLab。

  1. 如果你已经设置了 GITLAB_HOME 变量,请调整目录以满足你的要求并运行镜像:

    • 如果你不在 SELinux 上,请运行此命令:

       sudo docker run --detach \
         --hostname gitlab.example.com \
         --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com'" \
         --publish 443:443 --publish 80:80 --publish 22:22 \
         --name gitlab \
         --restart always \
         --volume $GITLAB_HOME/config:/etc/gitlab \
         --volume $GITLAB_HOME/logs:/var/log/gitlab \
         --volume $GITLAB_HOME/data:/var/opt/gitlab \
         --shm-size 256m \
         registry.gitlab.cn/omnibus/gitlab-jh:latest
      

      此命令会下载镜像并启动一个极狐GitLab 容器,并发布访问 SSH、HTTP 和 HTTPS 所需的端口。所有极狐GitLab 数据都存储为 $GITLAB_HOME 的子目录。容器在系统重新启动后自动重启。

    • 如果你在 SELinux 上,则运行以下命令:

       sudo docker run --detach \
         --hostname gitlab.example.com \
         --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com'" \
         --publish 443:443 --publish 80:80 --publish 22:22 \
         --name gitlab \
         --restart always \
         --volume $GITLAB_HOME/config:/etc/gitlab:Z \
         --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
         --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
         --shm-size 256m \
         registry.gitlab.cn/omnibus/gitlab-jh:latest
      

      此命名确保了 Docker 进程有足够的权限来在挂载的卷中创建配置文件。

  2. 如果你在使用 Kerberos integration,你必须要发布你的 Kerberos 端口(例如,--publish 8443:8443)。如果失败则会阻止 Kerberos 的 Git 操作。此初始化进程可能需要一点时间。你可以使用以下命令来跟踪此过程:

    sudo docker logs -f gitlab
    

    在容器启动后,你可以访问 gitlab.example.com。在容器启动之前,它可能不会响应查询。

  3. 访问极狐GitLab URL,使用 root 用户名和从如下命令中获取的密码登陆:

    sudo docker exec -it gitlab grep 'Password:'
    /etc/gitlab/initial_root_password
    
note 密码文件会在第一次容器重启后 24 小时内自动删除。

使用 Docker Swarm 模式安装极狐GitLab

有了 Docker Swarm 模式,你就可以在此模式下安装和部署极狐GitLab 了。

在 swarm 模式中,你可以利用 Docker 密钥Docker 配置来高效并安全的部署你的极狐GitLab 实例。密钥可以被用来安全地传递初始化的 root 密钥,而不是将其暴露为环境变量。配置操作可以帮助你尽可能让你的 GitLab 镜像保持通用性。

以下示例使用密钥信息和配置,以栈的形式部署带有四个 runner 的极狐GitLab:

  1. 设置 Docker swarm.
  2. 创建 docker-compose.yml 文件:

    version: "3.6"
    services:
      gitlab:
        image: gitlab/gitlab-ee:<version>-ee.0
        container_name: gitlab
        restart: always
        hostname: 'gitlab.example.com'
        ports:
          - "22:22"
          - "80:80"
          - "443:443"
        volumes:
          - $GITLAB_HOME/data:/var/opt/gitlab
          - $GITLAB_HOME/logs:/var/log/gitlab
          - $GITLAB_HOME/config:/etc/gitlab
        shm_size: '256m'
        environment:
          GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
        configs:
          - source: gitlab
            target: /omnibus_config.rb
        secrets:
          - gitlab_root_password
      gitlab-runner:
        image: gitlab/gitlab-runner:alpine
        deploy:
          mode: replicated
          replicas: 4
    configs:
      gitlab:
        file: ./gitlab.rb
    secrets:
      gitlab_root_password:
        file: ./root_password.txt
    

    要降低复杂性,上面的示例排除了 network 配置。你可以在官方的 Compose 文件参考中找到更多信息。

  3. 创建一个 gitlab.rb 文件:

    external_url 'https://my.domain.com/'
    gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password').gsub("\n", "")
    
  4. 创建一个包含密码的 root_password.txt

    MySuperSecretAndSecurePassw0rd!
    
  5. 确保你位于 docker-compose.yml 文件所在的目录中,然后运行:

    docker stack deploy --compose-file docker-compose.yml mystack
    

在安装完成后,你需要配置你的极狐GitLab 实例