首先安装docker和docker-compose,然后新建doker-compose.yml并配置如下:

 1gitlab:
 2  image: 'gitlab/gitlab-ce:latest'
 3  restart: always
 4  hostname: 'git.example.com'
 5  ports:
 6    - '80:80'
 7    - '443:443'
 8    - '9922:22'
 9  volumes:
10    - '/srv/gitlab/config:/etc/gitlab'
11    - '/srv/gitlab/logs:/var/log/gitlab'
12    - '/srv/gitlab/data:/var/opt/gitlab'

然后根据需要修改 /srv/gitlab/config/gitlab.rb文件,然后重启容器或者或者进入到容器内执行 gitlab-ctl reconfigure命令使新配置生效

smtp配置成功以后可以进入容器,执行 gitlab-rails console,然后再执行 Notify.test_email('test@example.com', 'Subject', 'Text').deliver_now发送一封邮件来检查smtp配置

由于Git的SSH和系统SSH都使用22号端口,所以需要映射出来的端口需要不一样,或者服务器有多个ip,SSH和GitLab分别监听不同ip的22号端口。

如果只有一个ip,又觉得SSH clone的地址是ssh://git@git.example.com/xxx/xxx.git这样的格式不好看,需要进行一些配置:

  • 进入到容器内查看 /etc/group/etc/passwd中Git用户配置的gid和uid,这里假设都是998

  • 在宿主机上使用 groupadd -g 998 gituseradd -m -u 998 -g git -s /bin/sh -d /home/git git创建和容器内相同gid和uid

  • 同时再将 /srv/gitlab/data/.ssh/authorized_keys软链接到 /home/git/.ssh/authorized_keys,这个文件是由GitLab创建,用于Git SSH认证用的

  • 如果在网页上已经添加过SSH key会发现authorized_keys最前面有一个command,使用的命令的文件实际上是docker容器内的文件,在SSH连接的时候实际上会执行这个command,所以我们在宿主机中建立一个同名的文件 /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell,内容如下:

    1#!/bin/sh
    2ssh -i /home/git/.ssh/id_rsa -p 9922 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
    
  • 上面文件的作用就是将SSH连接转发到9922端口,这样就就交给容器了,这里实际上还是一个SSH连接做的转发,宿主机连接到容器还需要一次然认证,所以需要使用 su git命令切换为Git用户,使用 ssh-keygen -t rsa -b 4096生成SSH key

  • /home/git/.ssh/id_rsa.pub修改为 /home/git/.ssh/authorized_keys_proxy,再将这个文件映射为容器内/gitlab-data/ssh/authorized_keys文件

  • 这次提交中,添加了除了 /.ssh/authorized_keys以外的 /gitlab-data/authorized_keys文件用于SSH认证,这样就可以宿主机的Git账户就可以连接到容器了

  • 这样就可以git clone git@example.com:xxx/xxx.git的方式进行操作了,同时之前的9922端口可以限制为只监听127.0.0.1

最终配置如下:

 1gitlab:
 2  image: 'gitlab/gitlab-ce:latest'
 3  restart: always
 4  hostname: 'git.example.com'
 5  ports:
 6    - '80:80'
 7    - '443:443'
 8    - '127.0.0.1:9922:22'
 9  volumes:
10    - '/srv/gitlab/config:/etc/gitlab'
11    - '/srv/gitlab/logs:/var/log/gitlab'
12    - '/srv/gitlab/data:/var/opt/gitlab'
13    - '/home/git/.ssh/authorized_keys_proxy:/gitlab-data/ssh/authorized_keys'