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'
最后再重启容器即可