在 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 Chart 或 GitLab 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 端口:
-
用编辑器打开
/etc/ssh/sshd_config
,并更改 SSH 端口:Port = 2424
-
保存文件并重启 SSH 服务:
sudo systemctl restart ssh
-
验证你可以通过 SSH 进行连接。打开一个新的会话窗口并 SSH 到使用此新端口的服务器上。
为卷创建目录
为配置文件、日志和数据文件创建一个目录。目录可以在你用户的主目录下(比如 ~/gitlab-docker
),或者在类似 /srv/gitlab
的目录中。
-
创建目录:
sudo mkdir -p /srv/gitlab
-
如果你在用非
root
用户运行 Docker,为新目录授予适当的权限: -
配置新的环境变量
$GITLAB_HOME
,设置为新目录的路径:export GITLAB_HOME=/srv/gitlab
-
可选地,你可以将
GITLAB_HOME
环境变量添加到你的 Shell 的配置文件中,以便在所有未来的终端会话中应用它:- Bash:
~/.bash_profile
- ZSH:
~/.zshrc
- Bash:
极狐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:
- 安装 Docker Compose。
-
创建一个
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'
阅读预配置 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
相同。 -
在
docker-compose.yml
相同的目录下,启动 GitLab:docker compose up -d
使用 Docker Engine 安装极狐GitLab
你还可以使用 Docker Engine 来安装极狐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 \ --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 进程有足够的权限来在挂载的卷中创建配置文件。
-
-
如果你在使用 Kerberos integration,你必须要发布你的 Kerberos 端口(例如,
--publish 8443:8443
)。如果失败则会阻止 Kerberos 的 Git 操作。此初始化进程可能需要一点时间。你可以使用以下命令来跟踪此过程:sudo docker logs -f gitlab
在容器启动后,你可以访问
gitlab.example.com
。在容器启动之前,它可能不会响应查询。 -
访问极狐GitLab URL,使用
root
用户名和从如下命令中获取的密码登陆:sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
使用 Docker Swarm 模式安装极狐GitLab
有了 Docker Swarm 模式,你就可以在此模式下安装和部署极狐GitLab 了。
在 swarm 模式中,你可以利用 Docker 密钥和 Docker 配置来高效并安全的部署你的极狐GitLab 实例。密钥可以被用来安全地传递初始化的 root 密钥,而不是将其暴露为环境变量。配置操作可以帮助你尽可能让你的 GitLab 镜像保持通用性。
以下示例使用密钥信息和配置,以栈的形式部署带有四个 runner 的极狐GitLab:
- 设置 Docker swarm.
-
创建
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 文件参考中找到更多信息。 -
创建一个
gitlab.rb
文件:external_url 'https://my.domain.com/' gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password').gsub("\n", "")
-
创建一个包含密码的
root_password.txt
:MySuperSecretAndSecurePassw0rd!
-
确保你位于
docker-compose.yml
文件所在的目录中,然后运行:docker stack deploy --compose-file docker-compose.yml mystack
在安装完成后,你需要配置你的极狐GitLab 实例。