GitLab Docker映像
GitLab Docker映像是在单个容器中运行所有必需服务的GitLab的整体映像。
GitLab CE和EE都在Docker Hub中:
- GitLab CE Docker映像
- GitLab EE Docker映像
注意: 要在Kubernetes上安装GitLab,请查看 GitLab Helm Charts。
在以下示例中,我们使用的是GitLab CE的图像。要使用GitLab EE而不是GitLab CE,请将图像名称替换为gitlab/gitlab-ee:latest
。
需要Docker安装,请参阅官方安装文档。
设置卷挂载位置
在设置其他所有内容之前,请配置一个新的环境变量$GITLAB_HOME
,该变量指向配置,日志和数据文件将驻留的目录。确保目录存在并且已授予适当的权限。
对于Linux用户,将路径设置为/opt/gitlab
:
export GITLAB_HOME=/opt/gitlab
对于macOS用户,请使用用户$HOME/gitlab
目录:
export GITLAB_HOME=$HOME/gitlab
GitLab容器使用主机安装的卷来存储持久数据:
当地位置 | 货柜位置 | 用法 |
|
| 用于存储应用程序数据 |
|
| 用于存储日志 |
|
| 用于存储GitLab配置文件 |
安装
GitLab Docker镜像可以多种方式运行:
使用Docker Engine安装GitLab
您可以微调这些目录以满足您的要求。设置GITLAB_HOME
变量后,即可运行图像:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 2222:22 \
--name gitlab \
--restart always \
--volume /etc/localtime:/etc/localtime \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
这将下载并启动一个GitLab CE容器,并发布访问SSH,HTTP和HTTPS所需的端口。所有的GitLab数据都将存储为的子目录 $GITLAB_HOME
。restart
系统重启后,容器将自动运行。
如果您使用的是SELinux,请改为运行以下命令:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 2222:22 \
--name gitlab \
--restart always \
--volume /etc/localtime:/etc/localtime:z \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:latest
这将确保Docker进程具有足够的权限在已安装的卷中创建配置文件。
注意:--publish 8443:8443
如果您正在使用Kerberos集成 ,则还需要发布Kerberos端口(例如)。 。否则,将阻止通过Kerberos进行Git操作。
初始化过程可能需要很长时间。您可以使用以下方法跟踪此过程:
sudo docker logs -f gitlab
启动容器后,您可以访问gitlab.example.com
(或者 http://192.168.59.103
如果您在macOS上使用了boot2docker)。Docker容器开始响应查询可能需要一段时间。首次访问GitLab时,系统会要求您设置管理员密码。更改后,可以使用用户名root
和设置的密码登录。
使用Docker Compose安装GitLab
使用Docker Compose,您可以轻松配置,安装和升级基于Docker的GitLab安装:
- 安装Docker Compose。
- 创建一个
docker-compose.yml
文件(或下载一个示例):
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
# Add any other gitlab.rb configuration here, each on its own line
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- '/etc/localtime:/etc/localtime'
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
- 确保您与以下目录位于同一目录中,
docker-compose.yml
然后启动GitLab:
docker-compose up -d
提示: 阅读“预配置Docker容器”部分以查看GITLAB_OMNIBUS_CONFIG
变量的工作方式。
以下是docker-compose.yml
在自定义HTTP和SSH端口上运行GitLab的另一个示例。注意GITLAB_OMNIBUS_CONFIG
变量如何匹配该 ports
部分:
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '8929:8929'
- '2224:22'
volumes:
- '/etc/localtime:/etc/localtime'
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
这与使用相同--publish 8929:8929 --publish 2224:22
。
使用Docker群模式安装GitLab
使用Docker群集模式,您可以轻松地在群集集群中配置和部署基于Docker的GitLab安装。
在集群模式下,您可以利用Docker机密 和Docker配置有效而安全地部署您的GitLab实例。机密信息可用于安全地传递您的初始root密码,而无需将其暴露为环境变量。配置可以帮助您保持GitLab映像尽可能通用。
这是一个使用秘密和配置将GitLab与四个跑步者作为一个堆栈部署的示例:
- 设置Docker集群。
- 创建一个
docker-compose.yml
文件:
version: "3.6"
services:
gitlab:
image: gitlab/gitlab-ce:latest
ports:
- "22:22"
- "80:80"
- "443:443"
volumes:
- '/etc/localtime:/etc/localtime'
- $GITLAB_HOME/data:/var/opt/gitlab
- $GITLAB_HOME/logs:/var/log/gitlab
- $GITLAB_HOME/config:/etc/gitlab
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')
- 创建一个
root_password.txt
文件:
MySuperSecretAndSecurePass0rd!
- 确保您与以下目录位于同一目录
docker-compose.yml
并运行:
docker stack deploy --compose-file docker-compose.yml mystack
组态
该容器使用官方的Omnibus GitLab软件包,因此所有配置都在唯一的配置文件中完成/etc/gitlab/gitlab.rb
。
要访问GitLab的配置文件,可以在运行容器的上下文中启动Shell会话。这将允许您浏览所有目录并使用喜欢的文本编辑器:
sudo docker exec -it gitlab /bin/bash
您也可以编辑/etc/gitlab/gitlab.rb
:
sudo docker exec -it gitlab editor /etc/gitlab/gitlab.rb
打开后,请/etc/gitlab/gitlab.rb
确保将设置external_url
为指向有效的URL。
要从GitLab接收电子邮件,您必须配置 SMTP设置,因为GitLab Docker映像未安装SMTP服务器。您可能还对启用HTTPS感兴趣 。
完成所需的所有更改后,您将需要重新启动容器以重新配置GitLab:
sudo docker restart gitlab
注意: 每当容器启动时,GitLab都会重新配置自身。
有关配置GitLab的更多选项,请参阅 配置文档。
预配置Docker容器
您可以通过将环境变量添加GITLAB_OMNIBUS_CONFIG
到Docker run命令中来预先配置GitLab Docker映像。该变量可以包含任何gitlab.rb
设置,并且将在加载容器的gitlab.rb
文件之前进行评估。这样,您可以轻松配置GitLab的外部URL,从Omnibus GitLab模板进行任何数据库配置或任何其他选项 。
注意: 其中包含的设置GITLAB_OMNIBUS_CONFIG
不会写入 gitlab.rb
配置文件,它们会在加载时进行评估。
这是一个在启动容器时设置外部URL并启用LFS的示例:
sudo docker run --detach \
--hostname gitlab.example.com \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /etc/localtime:/etc/localtime \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
请注意,每次执行docker run
命令时,都需要提供该GITLAB_OMNIBUS_CONFIG
选项。的内容GITLAB_OMNIBUS_CONFIG
是 不保留后续运行之间。
使用标记版本的GitLab
还提供了GitLab Docker映像的标记版本。要查看所有可用标签,请参阅:
要使用特定的标记版本,请替换gitlab/gitlab-ce:latest
为要运行的GitLab版本gitlab/gitlab-ce:12.1.3-ce.0
。
在公共IP地址上运行GitLab
您可以通过修改--publish
标志使Docker使用您的IP地址并将所有流量转发到GitLab容器。
要在IP上公开GitLab CE 198.51.100.1
:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 198.51.100.1:443:443 \
--publish 198.51.100.1:80:80 \
--publish 198.51.100.1:22:22 \
--name gitlab \
--restart always \
--volume /etc/localtime:/etc/localtime \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
然后,您可以在http://198.51.100.1/
和访问您的GitLab实例https://198.51.100.1/
。
在不同的端口上暴露GitLab
GitLab将占用 容器内的某些端口。
如果要使用与80
(HTTP)或443
(HTTPS)不同的主机端口,则需要--publish
在docker run
命令中添加单独的指令。
例如,在主机的port上公开Web界面,在port上公开8929
SSH服务2289
:
- 使用以下
docker run
命令:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 8929:8929 --publish 2289:22 \
--name gitlab \
--restart always \
--volume /etc/localtime:/etc/localtime \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
注意: 发布端口的格式为hostPort:containerPort
。在Docker的文档中了解更多有关 公开传入端口的信息。
- 输入正在运行的容器:
sudo docker exec -it gitlab /bin/bash
/etc/gitlab/gitlab.rb
用您的编辑器打开并设置external_url
:
# For HTTP
external_url "http://gitlab.example.com:8929"
or
# For HTTPS (notice the https)
external_url "https://gitlab.example.com:8929"
注意: 此URL中指定的端口必须与Docker发布到主机的端口匹配。此外,如果未显式设置NGINX侦听端口 nginx['listen_port']
,它将从中拉出external_url
。有关更多信息,请参见NGINX文档。
- 设置
gitlab_shell_ssh_port及时区
:
gitlab_rails['gitlab_shell_ssh_port'] = 2289
gitlab_rails['time_zone'] = 'Asia/Shanghai'
- 最后,重新配置GitLab:
gitlab-ctl reconfigure
按照上面的示例,您将能够从Web浏览器下访问GitLab,<hostIP>:8929
并在port下使用SSH进行推送2289
。
甲docker-compose.yml
使用不同的端口的例子可以在找到 多克尔撰写部分。
更新资料
在大多数情况下,更新GitLab就像下载最新的Docker image标签一样容易 。
使用Docker Engine更新GitLab
要更新使用Docker Engine安装的 GitLab :
- 进行备份。
- 停止正在运行的容器:
sudo docker stop gitlab
- 删除现有容器:
sudo docker rm gitlab
- 拉新图像。例如,最新的GitLab CE映像:
sudo docker pull gitlab/gitlab-ce:latest
- 使用先前指定的选项再次创建容器 :
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /etc/localtime:/etc/localtime \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
在第一次运行时,GitLab将重新配置并自我更新。
注意: 在主要版本之间升级时, 请参考GitLab 升级建议。
使用Docker compose更新GitLab
要更新使用Docker Compose安装的 GitLab :
- 进行备份。
- 下载最新版本并更新您的GitLab实例:
docker-compose pull
docker-compose up -d
注意: 如果您改用标记,则需要先进行编辑docker-compose.yml
。
备份GitLab
您可以使用以下方法创建一个GitLab备份:
docker exec -t <container name> gitlab-backup create
阅读更多有关如何备份和还原GitLab的信息。
故障排除
如果您在使用Omnibus GitLab和Docker时遇到问题,以下信息将有所帮助。
诊断潜在问题
读取容器日志:
sudo docker logs gitlab
输入运行容器:
sudo docker exec -it gitlab /bin/bash
从容器内部,您可以像通常管理Omnibus安装一样管理GitLab容器
500内部错误
更新Docker映像时,您可能会遇到一个问题,即所有路径都显示一个500
页面。如果发生这种情况,请重新启动容器以尝试解决此问题:
sudo docker restart gitlab
权限问题
从较早的GitLab Docker映像进行更新时,您可能会遇到权限问题。如果以前的图像中的用户没有正确保留,则会发生这种情况。有用于修复所有文件权限的脚本。
要修复容器,请update-permissions
随后执行并重新启动容器:
sudo docker exec gitlab update-permissions
sudo docker restart gitlab
Windows / Mac: Error executing action run on resource ruby_block[directory resource: /data/GitLab]
在Windows或Mac上将Docker Toolbox与VirtualBox一起使用并利用Docker卷时,会发生此错误。该/c/Users
卷作为VirtualBox共享文件夹安装,并且不支持所有POSIX文件系统功能。不重新安装就无法更改目录所有权和权限,并且GitLab失败。
我们的建议是切换到使用适用于您的平台的本地Docker安装,而不是使用Docker Toolbox。
如果您不能使用本机Docker安装(Windows 10家庭版或Windows 7/8),则另一种解决方案是为Docker Toolbox的boot2docker设置NFS挂载而不是VirtualBox共享。
Linux ACL问题
如果您在Docker主机上使用文件ACL,则该docker
组需要对卷具有完全访问权限才能使GitLab正常工作:
getfacl $GITLAB_HOME
# file: $GITLAB_HOME
# owner: XXXX
# group: XXXX
user::rwx
group::rwx
group:docker:rwx
mask::rwx
default:user::rwx
default:group::rwx
default:group:docker:rwx
default:mask::rwx
default:other::r-x
如果这些都不正确,请使用以下命令进行设置:
sudo setfacl -mR default:group:docker:rwx $GITLAB_HOME
注意: docker
是默认组,如果您更改了此组,请相应地更新命令。