faymi / faymi.github.io

Faymi Blog ->
http://blog.eseeto.com
MIT License
0 stars 0 forks source link

Docker 搭建 Gitlab 服务 #6

Open faymi opened 4 years ago

faymi commented 4 years ago

Docker 搭建 Gitlab 服务

前置条件

拉取 Gitlab 镜像

Gitlab Docker 镜像是在单个容器上运行所有必需服务的GitLab的整体镜像。如果你想用最新的RC镜像,可以分别用gitlab/gitlab-ce:rc or gitlab/gitlab-ee:rc。 下面实例中我们主要用社区版镜像。

docker 命令拉取 gitlab 镜像

docker pull gitlab/gitlab-ce

运行 Gitlab 镜像

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

如果您使用的是SELinux,请改为运行以下命令:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab:Z \
  --volume /srv/gitlab/logs:/var/log/gitlab:Z \
  --volume /srv/gitlab/data:/var/opt/gitlab:Z \
  gitlab/gitlab-ce:latest

启动一个GitLab CE容器,并发布访问SSH,HTTP和HTTPS所需的端口。所有的GitLab数据都将存储为/srv/gitlab/的子目录。系统重启后,容器将自动重启。

命令解释:

--detach -> -d 此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(可以通过 docker container logs [container ID or NAMES] 获取容器的输出信息)

--hostname -> -h 配置容器主机名

--publish -> -p 映射容器端口到宿主机端口 宿主机Port:容器Port

--name -> 容器名称

--restart -> 重启配置,always:系统重启时,容器也会自动重启。no:默认策略,容器退出时不重启;no-failue:n:在容器非正常退出时重启容器,最大重启n次;unless-stopped:在容器退出时总是重启容器,但不考虑在Docker守护进程启动时就已经停止了的容器。

--volume -> -v 数据卷映射 宿主机目录:容器目录

gitlab/gitlab-ce:latest -> gitlab 镜像

Gitlab 数据存储位置

本地目录

容器目录

作用

/srv/gitlab/data

/var/opt/gitlab

存储应用数据

/srv/gitlab/logs

/var/log/gitlab

存储日志数据

/srv/gitlab/config

/etc/gitlab

存储 gitlab 配置文件

Gitlab 配置

该容器使用官方的Omnibus GitLab软件包,因此所有配置都在唯一的配置文件 /etc/gitlab/gitlab.rb 中完成。

了解配置的更多信息,请查看 Omnibus GitLab documentation

访问 Gitlab 服务

升级 Gitlab 到新版本

升级新版本需要重新构建容器,所以要先停止、删除需要升级的 gitlab 容器服务

  1. 停止 gitlab 容器服务

     sudo docker stop gitlab
  2. 移除 gitlab 容器

     sudo docker rm gitlab
  3. 拉取新镜像

     sudo docker pull gitlab/gitlab-ce:latest
  4. 使用先前指定的选项再次创建容器

     sudo docker run --detach \
     --hostname gitlab.example.com \
     --publish 443:443 --publish 80:80 --publish 22:22 \
     --name gitlab \
     --restart always \
     --volume /srv/gitlab/config:/etc/gitlab \
     --volume /srv/gitlab/logs:/var/log/gitlab \
     --volume /srv/gitlab/data:/var/opt/gitlab \
     gitlab/gitlab-ce:latest

在公共IP地址上运行Gitlab CE

通过修改 --publish 标志使 Docker 使用您的IP地址并将所有流量转发到 GitLab CE 容器。

例如将 gitlab 映射到某个IP如 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 /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

容器构建完成后,可以通过 http://198.51.100.1https://198.51.100.1 访问服务了。

在不同的端口上暴露 GitLab

如果要使用与80(HTTP)或443(HTTPS)不同的主机端口,则需要向 docker run 命令添加单独的 --publish 指令。

例如要暴露 web 界面服务端口在8829,暴露SSH 服务端口到2289

  1. 首先运行 docker run 命令

     sudo docker run --detach \
     --hostname gitlab.example.com \
     --publish 8929:8929 --publish 2289:22 \
     --name gitlab \
     --restart always \
     --volume /srv/gitlab/config:/etc/gitlab \
     --volume /srv/gitlab/logs:/var/log/gitlab \
     --volume /srv/gitlab/data:/var/opt/gitlab \
     gitlab/gitlab-ce:latest
  2. 配置 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 ['listen_port'] 中显式设置了NGINX侦听端口,否则将从该URL中提取该端口。有关更多信息,请参考NGINX文档

    • 设置 gitlab_shell_ssh_port (git仓库地址显示的端口,实际还是工作于22端口):

        gitlab_rails['gitlab_shell_ssh_port'] = 2289

按照上面的示例,可以通过Web浏览器在<hostIP>:8929下访问GitLab,并在端口2289下使用SSH进行访问。

通过 docker-pompose 安装 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:
         - '/srv/gitlab/config:/etc/gitlab'
         - '/srv/gitlab/logs:/var/log/gitlab'
         - '/srv/gitlab/data:/var/opt/gitlab'
  3. 确保在 docker-compose.yml 文件目录下运行 docker-compose up -d 去构建 gitlab 容器。

通过 docker-compose 升级 Gitlab

若是通过 docker-compose 安装Gitlab,只需运行 docker-compose pulldocker-compose up -d 即可下载新版本并升级您的GitLab实例。

问题处理

500 Internal Error

更新Docker镜像时,可能会遇到所有路径都显示臭名昭著的500错误页。如果发生这种情况,请尝试运行sudo docker restart gitlab来重新启动容器并解决问题。

Permission 问题

从较早的GitLab Docker镜像进行更新时,可能会遇到权限问题。发生这种情况的原因是以前的镜像中的用户没有正确保留。该脚本可修复所有文件的权限。

要修复您的容器,只需执行更新权限,然后重启容器:

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 Home Edition或Windows < 10),那么另一种解决方案是为Docker Toolbox的boot2docker设置NFS挂载而不是VirtualBox共享。

Linux ACL问题

如果您在Docker主机上使用文件ACL,则docker组需要对卷具有完全访问权限才能使GitLab正常工作。

$ getfacl /srv/gitlab
# file: /srv/gitlab
# 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 /srv/gitlab

参考

文中内容如有错误或纰漏,请指正!有兴趣的小伙伴可以一起相互讨论交流学习!

chenjinxing116 commented 4 years ago

123