macos 使用 docker 镜像搭建 gitlab 代码仓库

近期学习了docker技术,一时心血来潮,想要使用 docker 搭建一个 gitlab.
网上搜索 gitlab docker镜像,找到一个汉化版的 gitlab docker 镜像 GitLab中文社区版 Docker 镜像
按照镜像页面中的说明步骤进行操作,结果发现没有将镜像的 22 号端口进行映射。在 macos 上,22号端口已经占用,所以必须将 gitlab 服务器的 22 号端口映射到宿主机的新端口上。
经过几轮试错,现将完整步骤梳理如下。

1. 启动容器

本地新建了一个gitlab文件夹,并创建了 Makefile,内容如下

init:
	mkdir -p data/{etc/gitlab,log/gitlab,opt/gitlab}
pull:
	docker pull beginor/gitlab-ce:11.3.0-ce.0
run:
	docker run \
	--detach \
	--publish 9443:443 \
	--publish 9080:80 \
	--publish 9022:22 \
	--name gitlab \
	--restart unless-stopped \
	--volume `pwd`/data/etc/gitlab:/etc/gitlab \
	--volume `pwd`/data/log/gitlab:/var/log/gitlab \
	--volume `pwd`/data/opt/gitlab:/var/opt/gitlab \
	beginor/gitlab-ce:11.3.0-ce.0

依次执行

make init #创建数据目录,这样当删除该 gitlab 容器后,数据文件得以保留;之后重新将新版本的 gitlab 镜像运行并挂载到本地数据目录后,可以直接看到原来已经上传的数据
make pull #拉取镜像
make run #创建容器

容器启动需要一段时间,可以通过如下命令查看容器log

docker logs -f gitlab

当出现如下图所示的日志时,说明容器启动成功:

==> /var/log/gitlab/gitlab-workhorse/current <==
2022-03-22_10:14:27.07794 localhost @ - - [2022/03/22:10:14:27 +0000] "GET /help HTTP/1.1" 200 37965 "" "curl/7.59.0" 0.147

==> /var/log/gitlab/nginx/gitlab_access.log <==
127.0.0.1 - - [22/Mar/2022:10:14:27 +0000] "GET /help HTTP/1.1" 200 38017 "" "curl/7.59.0"

==> /var/log/gitlab/prometheus/current <==
2022-03-22_10:14:28.39490 time="2022-03-22T10:14:28Z" level=info msg="Completed full maintenance sweep through 7315 in-memory fingerprints in 79.380846ms." source="storage.go:1400" 

此时通过 localhost:9080 地址即可访问 gitlab。

  • 初次登录时,需要设置管理员密码
  • 设置好管理员密码后,需要注册一个普通用户
  • 创建好普通用户,登录到系统中
  • 创建一个新的项目,会出现如下仓库地址乱码的问题。下面的步骤会解决该问题。

2. 修改 gitlab 配置

gitlab 容器启动后,可以看到在本地的 gitlab/data 目录下生成了许多新文件

找到 gitlab/data/etc/gitlab/gitlab.rb,可以直接进行修改;或者使用 docker exec -it gitlab bash 登录 gitlab 容器,找到 /etc/gitlab/gitlab.rb 进行修改。
修改内容如下:

external_url 'http://localhost'  #解决新建仓库地址乱码的问题
gitlab_rails['gitlab_ssh_host'] = 'localhost' 
gitlab_rails['gitlab_shell_ssh_port'] = 9022 #注意这里是映射到容器22号端口的宿主机端口

gitlab.rb 文件中已经有了上面三项相关配置,并被注释掉了;通过关键字找到配置进行修改即可。

修改完成后,登录gitlab容器,执行如下命令

#宿主机执行:登录 gitlab 容器
docker exec -it gitlab bash

#gitlab容器执行:重新加载配置,并重启gitlab服务
gitlab-ctl reconfigure
gitlab-ctl restart

刷新gitlab网页,即可看到仓库的ssh地址可用了

3. 添加本地公钥到 gitlab

  • 生成ssh公钥和秘钥

    ssh-keygen # 在 ~/.ssh/ 目录生成 id_rsa 和 id_rsa.pub
    cat ~/.ssh/id_rsa.pub | pbcopy # 将id_ras.pub 公钥内容copy到剪贴板;如果没有 pbcopy工具,直接copy文件内容即可。
    

    ssh原理可以参考: SSH原理与运用

  • 将公钥添加到 gitlab
    点击gitlab页面右上角的 "头像 -> 设置",

    然后在左侧栏找到 SSH 秘钥

    粘贴剪贴板中的 id_ras.pub,并点击 添加密钥 即可。

  • 本地配置ssh读取秘钥
    在本地机器上,修改/创建 ~/.ssh/config 文件,添加如下内容

    Host localgit
       User git
       Hostname localhost
       Port 9022
       PreferredAuthentications publickey
       IdentityFile ~/.ssh/id_rsa
    

    如此,就可以直接通过命令行使用 ssh 与 gitlab通信了。测试如下

    [18:49:15 nobody@nowhere gitlab] $ ssh -T localgit
    Welcome to GitLab, @git-Username!
    

4. 推送本地仓库到 gitlab

在 gitlab 创建仓库,可以看到其 ssh 地址是带有 ssh:// 前缀的。使用这个地址推送本地仓库时,这个前缀一定要保留。
之所以会出现这样一个前缀,是因为我们的gitlab服务对外提供的ssh接口不是默认的22号端口,而是我们映射的9022号端口,并且我们在gitlab.rb 中做了如下配置

gitlab_rails['gitlab_ssh_host'] = 'localhost' 
gitlab_rails['gitlab_shell_ssh_port'] = 9022 #注意这里是映射到容器22号端口的宿主机端口

可以对比一下,未做如上配置之前,ssh地址为
git@localhost:Poseidon/docker-lab.git
做了如上配置后,ssh地址为
ssh://git@localhost:9022/Poseidon/docker-lab.git

posted @ 2022-03-22 18:58  HorseShoe2016  阅读(691)  评论(0编辑  收藏  举报