Docker运行Gitlab与Host共享22端口

需求

之前团队从 SVN 已经转到 Git 管理代码了,但是但是大家还是非常不熟悉怎么管理,应该也是我没有把大家带入正轨吧,关于 GitFlow 没有好好给大家讲清楚,木办法。用Gogs 管理感觉不是太好,代码多了,团队项目多之后管理不是太方便。于是把目标转向了 Gitlab。但是发现服务器直接装 Gitlab 很不爽,要装一大垞东东。那就转为 Docker 吧,经过一些尝试,一段时间的运行非常不错,加上 Gitlab Runner 测试提交文件是否有问题。也可以直接用 Runner 来打包发布,但是暂时没用它,现在还是用 Jenkins 来进行发布。也比较好用了,大家代码提交合并后,一键发布代码。 :)

其中外网 IP 的 1111 端口映射到服务器的 5622 端口,但 5622 端口已用 nginx 反射代理了 nexus,所以 docker gitlab 在主要要换一个端口,暂时用了 18080。

安装 Gitlab

把 Docker 安装好,然后设置好代理,要不然的话,下载镜像实在是太太太太慢了。我用了两个代理,一个是官方的天朝代理,一个是中科大的代理。

1
2
3
4
5
6
7
{
"registry-mirrors": ["https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["x.x.x.x:8088"],
"disable-legacy-registry": true,
"log-driver": "json-file",
"log-opts": { "max-size": "5m", "max-file": "3" }
}

然后就是开始拖镜像,运行容器了。再稍微进行一点配置就 OK。

前期准备工作

  • Host 有 git 用户
  • 生成 Host git 用户与 docker git 用户通信用的 ssh 密钥与公钥, ssh-keygen。公钥保存在/opt/gitlab/authorized_keys_proxy,密钥保存在/opt/gitlab/id_rsa
  • 找一份 sshd 配置文件拷贝一份至/opt/gitlab/sshd_config,修改一处AuthorizedKeysFile,让 Host git 用户用密钥登录至 docker gitlab。参考处
1
2
3
...
AuthorizedKeysFile %h/.ssh/authorized_keys /gitlab-data/ssh/authorized_keys ****重要****
...
  • 查看 git 用户 user id 和 group id,生成一份passwdgroup文件给 docker gitlab 使用,文件见文末,从 gitlab 中提取的。我服务器上分别是 1006 和 1008。为了保证 Host 和 docker gitlab 中的数据文件不会因为权限问题而无法使用。主要是 gitlab 中的用户 SSH Key 文件与 Host git 用户共享。
  • 在 Host 写个 bash 脚本,用于转发 Host 22 端口接收到 git 用户时转到 docker gitlab 去。
1
2
3
su - git
mkdir -p /opt/gitlab/data/.ssh
ln -sf /opt/gitlab/data/.ssh /home/git/.ssh
  • gitlab 用户用 SSH Key 进行 git 操作时,先连接到 Host,读取/home/git/.ssh/authorized_keys信息并验证,其中authorized_keys第一行告诉用户强制运行一条命令/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell,正好用此命令转发 git 命令至 docker gitlab。这点与gogs中的配置类似。
/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell
1
2
3
#!/bin/sh

ssh -i /opt/gitlab/id_rsa -p 12222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"

运行 gitlab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker pull gitlab/gitlab-ce:latest # 拉镜像文件
docker run -d -e -p 18080:5622 -p 12222:22 \
--name gitlab --restart always \ # restart always保证Docker服务启动时gitlab容器运行
-v /opt/gitlab/config:/etc/gitlab \ # 配置文件保存到Host,也可以用volume
-v /opt/gitlab/logs:/var/log/gitlab \ # 日志
-v /opt/gitlab/data:/var/opt/gitlab \ # 数据
-v /opt/gitlab/sshd_config:/etc/ssh/sshd_config:ro \ # 配置Host用密钥与docker gitlab通信
-v /opt/gitlab/authorized_keys_proxy:/gitlab-data/ssh/authorized_keys:ro \ # Host git用户密钥
-v /opt/gitlab/passwd:/etc/passwd:ro \ # git用户信息
-v /opt/gitlab/group:/etc/group:ro \ # git用户group信息
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro \ # 时区
--ulimit sigpending=62793 --ulimit nproc=131072 \ # 优化参数
--ulimit nofile=60000 --ulimit core=0 \
gitlab/gitlab-ce:latest

配置 gitlab

docker ps查看 gitlab 容器运行成功后,停止容器运行,对 gitlab 进行配置。我的配置项如下。详细各配置项可见 gitlab.rb 的注释说明,或参照gitlab 官网说明

/opt/gitlab/config/gitlab.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
external_url 'http://10.17.65.22:5622/gitlab'
gitlab_rails['gitlab_ssh_host'] = '10.17.65.22'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'admin@guoliangwu.com'
gitlab_rails['gitlab_email_display_name'] = 'Admin'
gitlab_rails['gitlab_email_reply_to'] = 'no_reply@guoliangwu.com'
gitlab_rails['gitlab_username_changing_enabled'] = false
gitlab_rails['gitlab_default_theme'] = 4
gitlab_rails['gitlab_default_projects_features_snippets'] = false
gitlab_rails['gitlab_default_projects_features_builds'] = false
gitlab_rails['gitlab_default_projects_features_container_registry'] = false
gitlab_rails['incoming_email_enabled'] = false
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.guoliangwu.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "admin@guoliangwu.com"
gitlab_rails['smtp_password'] = "xxxx"
gitlab_rails['smtp_domain'] = "guoliangwu.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['registry_enabled'] = false
unicorn['worker_processes'] = 4
sidekiq['concurrency'] = 15
postgresql['shared_buffers'] = "2GB"
prometheus['enable'] = false

end

至此,Gitlab 应该能欢快地跑起来了。后面我在其它服务器配了 gitlab runner 来检查上传的代码是否有问题,不知道有没有时间深入了解 runner,先把.gitlab-ci.yml传上来,以备以后使用吧。PS:因为以后打包发布什么的都要用 maven,就用了 maven 镜像。

.gitlab.yml
1
2
3
4
5
6
7
8
9
10
image: maven:latest

test:
stage: test
script:
- test $(find shanghai/service -name "*.properties" -path "*/properties/*" | wc -l) -eq 0
- test $(find shanghai/web -name "index.js" -path "*/config/*" | wc -l) -eq 0
- test $(find shanghai/web -name "*.vue" -type f -exec grep -E 'debugger|console\.log' {} \; | wc -l) -eq 0
tags:
- common

passwd

/etc/gitlab/passwd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
sshd:x:105:65534::/var/run/sshd:/usr/sbin/nologin
git:x:1006:1008::/var/opt/gitlab:/bin/sh ****注意****
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh

group

/opt/gitlab/group
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
audio:x:29:
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
systemd-journal:x:101:
systemd-timesync:x:102:
systemd-network:x:103:
systemd-resolve:x:104:
systemd-bus-proxy:x:105:
ssh:x:106:
git:x:1008: ****注意****
gitlab-www:x:999:
gitlab-redis:x:997:
gitlab-psql:x:996:
mattermost:x:994:
registry:x:993:
gitlab-prometheus:x:99