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_HOME/data

/var/opt/gitlab

用于存储应用程序数据

$GITLAB_HOME/logs

/var/log/gitlab

用于存储日志

$GITLAB_HOME/config

/etc/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_HOMErestart系统重启后,容器将自动运行。

如果您使用的是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安装:

  1. 安装Docker Compose
  2. 创建一个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'
  1. 确保您与以下目录位于同一目录中,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与四个跑步者作为一个堆栈部署的示例:

  1. 设置Docker集群
  2. 创建一个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文件参考

  1. 创建一个gitlab.rb文件:
external_url 'https://my.domain.com/'
gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password')
  1. 创建一个root_password.txt文件:
MySuperSecretAndSecurePass0rd!
  1. 确保您与以下目录位于同一目录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)不同的主机端口,则需要--publishdocker run命令中添加单独的指令。

例如,在主机的port上公开Web界面,在port上公开8929SSH服务2289

  1. 使用以下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的文档中了解更多有关 公开传入端口的信息

  1. 输入正在运行的容器:
sudo docker exec -it gitlab /bin/bash
  1. /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文档

  1. 设置gitlab_shell_ssh_port及时区
gitlab_rails['gitlab_shell_ssh_port'] = 2289
gitlab_rails['time_zone'] = 'Asia/Shanghai'
  1. 最后,重新配置GitLab:
gitlab-ctl reconfigure

按照上面的示例,您将能够从Web浏览器下访问GitLab,<hostIP>:8929并在port下使用SSH进行推送2289

docker-compose.yml使用不同的端口的例子可以在找到 多克尔撰写部分。

更新资料

在大多数情况下,更新GitLab就像下载最新的Docker image标签一样容易 。

使用Docker Engine更新GitLab

要更新使用Docker Engine安装的 GitLab :

  1. 进行备份
  2. 停止正在运行的容器:
sudo docker stop gitlab
  1. 删除现有容器:
sudo docker rm gitlab
  1. 拉新图像。例如,最新的GitLab CE映像:
sudo docker pull gitlab/gitlab-ce:latest
  1. 使用先前指定的选项再次创建容器 :
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 :

  1. 进行备份
  2. 下载最新版本并更新您的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是默认组,如果您更改了此组,请相应地更新命令。