Docker-compose安装Gitlab

version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'git.mydomain.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://git.mydomain.com'
        gitlab_rails['gitlab_shell_ssh_port'] = 9922
    ports:
      - '18080:80'
      - '18443:443'
      - '9922:22'
    volumes:
      - '/data/docker/gitlab/config:/etc/gitlab'
      - '/data/docker/gitlab/logs:/var/log/gitlab'
      - '/data/docker/gitlab/data:/var/opt/gitlab'
    shm_size: '256m'

用下面的代码启动

docker-compose up -d

18080,18443,9922 是映射到宿主机的端口号,再用nginx代理一下绑定域名和证书就可以访问了。

首次安装时后,登录用户为root,密码用下面的方式获得:

docker exec -it gitlab_web_1 bash
cat /etc/gitlab/initial_root_password

如果有新版本发布,更新的话用下面的代码:

docker-compose down
docker-compose pull
docker-compose up -d

Gitlab与主机共用SSH端口

gitlab安装后,如果需要用类似 ssh://git@git.youdomain.com/git-group/git-project.git 这种方式访问,需要跟主机公用22端口。基本原理是:虽然gitlab上可以创建很多的用户,但当访问主机22端口的时候,其实使用的都是git这个用户,然后,gitlab会根据用户保存在gitlab中的ssh key,来判断当前请求是来自哪个gitlab用户。解决端口共用,其实主要把主机中git这个用户的操作请求,转发到gitlab中。具体操作如下。

1.检查 Gitlab 容器中 git 用户的 UID 以及 GID,如果不出意外的话,两者都已被硬编码为 998 。不过为了以防万一,我们可以通过下述指令进一步确认:

docker exec -it gitlab_web_1 cat /etc/passwd | awk -F':' '{if($1=="git") printf("uid: %s; gid: %s\n"), $3, $4}'

2.在主机上创建git用户

groupadd -g 998 git
useradd -m -u 998 -g git -s /bin/sh -d /home/git git

3. 复制容器中.ssh文件夹到主机的git用户的.ssh文件夹,其中/data/docker/gitlab/data是映射到容器中的/var/opt/gitlab的路径,也就是git用户在容器中的home:

cp -r /data/docker/gitlab/data/.ssh /home/git/.ssh
chown -R git:git /home/git/.ssh

4.在主机上生成git用户的密钥文件

su - git
ssh-keygen #然后一路回车

将git用户的公钥加到已授权key列表中

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

如果打开 authorized_keys可以看包含如下内容

command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-3", no-port-forwarding.........

这说明我们提交时原本会执行一个 /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell 脚本,那我们在主机上也放一个这个脚本让他执行,只不过这个脚本的内容是把请求内容原样转发到gitlab容器中,其中的9922端口,就是gitlab容器映射到主机上的端口:

mkdir -p /opt/gitlab/embedded/service/gitlab-shell/bin
cd /opt/gitlab/embedded/service/gitlab-shell/bin
sudo vim gitlab-shell
#!/bin/sh

ssh -i /home/git/.ssh/id_rsa -p 9922 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"

加上执行权限:

chmod +x /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell

修改docker-compose.yml,注释掉gitlab_rails[‘gitlab_shell_ssh_port’] = 4022,作用是在界面上的项目clone地址,就不会出现端口号了,使用默认端口22了。

把主机上的git用户的home映射到容器中,即在volumes部分增加

- '/home/git/.ssh/:/var/opt/gitlab/.ssh'

最终的docker-comose.yml文件如下:

version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'git.domain.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://git.domain.com'
        #gitlab_rails['gitlab_shell_ssh_port'] = 4022
    ports:
      - '18080:80'
      - '18443:443'
      - '4022:22'
    volumes:
      - '/data/docker/gitlab/config:/etc/gitlab'
      - '/data/docker/gitlab/logs:/var/log/gitlab'
      - '/data/docker/gitlab/data:/var/opt/gitlab'
      - '/home/git/.ssh/:/var/opt/gitlab/.ssh'
    shm_size: '256m'

最后再重启容器即可