个人亲自录制全套DevOps系列实战教程 :手把手教你玩转DevOps全栈技术
gitlab就不多说了,这个东西现在大多数公司内部都在使用,它分为社区和企业版本,社区版本ce是免费的,当然也可以选择gitee或github,但由于一些情况gitlab还是最受欢迎的。
首先在docker服务器根目录创建gitlab目录,表示将所有gitlab容器的数据都会映射到/docker/gitlab目录
网络规划
创建网络:通用同一个网段
docker network create --subnet=172.2.1.0/24 devops
目录规划
首先在docker服务器根目录创建gitlab目录表示将所有gitlab容器的数据都会映射到 /docker/gitlab 目录
cd /docker
mkdir gitlab
拉取Gitlab最新镜像
docker pull gitlab/gitlab-ce:latest
运行Gitlab容器
通过docker-compose.yml运行
我们知道docker-compose是可以编排复杂容器关系的工具,该文件中可以通过设置docker容器的多维属性并能同时创建运行多个容器,可以和kubernetes的yaml类比。
# 创建vi docker-compose.yml文件,保存到宿主机的/docker/gitlab目录。
version: '3' # docker-compose可以使用1、2、3版本,1版本已经基本弃用了,2、3分别会支持更多的指令,我们使用3即可,具体可参考官网对照表查看指令支持
services:
gitlab:
image: 'gitlab/gitlab-ce:latest' # 使用的gitlab镜像版本[其他参数见方案一解释]
restart: always
container_name: 'gitlab'
hostname: 'gitlab'
environment:
GITLAB_OMNIBUS_CONFIG: |
# Add any other gitlab.rb configuration here, each on its own line
external_url 'http://10.10.1.199:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '8929:80'
- '2224:22'
# - '9443:443' # 如果需要https访问则需要映射443端口
networks:
- 'exist-net-bloom' # 当前创建的容器加入到外部的bloom网络
volumes:
- '/docker/gitlab/config:/etc/gitlab'
- '/docker/gitlab/logs:/var/log/gitlab'
- '/docker/gitlab/data:/var/opt/gitlab'
- '/etc/timezone:/etc/timezone:ro'
- '/etc/localtime:/etc/localtime:ro'
shm_size: '256m'
networks:
exist-net-bloom: # 改名字为当前docker-compose中要引用的名字
external: # 指定已经存在的网络名字
name: devops
# 命令行执行,运行docker编排内容
docker-compose up -d
# 观察docker运行日志
docker logs -f gitlab
统一配置部分
修改docker容器内的gitlab配置, 完成gitlab容器的高级映射[避免修改宿主机映射的目录文件]
1.修改容器中vi /etc/gitlab/gitlab.rb配置,增加对外映射的ip,可以认为指定对外开放哪个ip可以访问
# 进容器内部
docker exec -it gitlab /bin/bash
# 修改gitlab.rb
vi /etc/gitlab/gitlab.rb
# 加入如下配置内容
# gitlab访问地址,可以写域名。如果端口不写的话默认为80端口,10.10.1.199是我omv(宿主机)的ip地址,大家可以根据自己的情况设置
external_url 'http://10.10.1.199'
#ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '10.10.1.199'
#ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 2224
# 让配置生效
gitlab-ctl reconfigure
2.修改容器中vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
gitlab:
host: 10.10.1.199 # 因为上面的修改生效后会自动更新到改文件,所以host不用改
port: 8929 # 这里需要改成外部映射的8929端口
https: false # 如果想通过https访问,此处设置成true
# 让配置生效
gitlab-ctl restart
3.安装完后进入容器查看默认gitlab密码,用户名: root
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
注意:
安装完后查看容器日志,可能会发现如下错误
err="create memberlist: Failed to get final advertise address: No private IP address found, and explicit IP not provided"
# 错误原因是因为alertmanager配置的监听地址是localhost,
# 此处需要指定127.0.0.1,修改vi /etc/gitlab/gitlab.rb如下:
alertmanager['flags'] = {
'cluster.advertise-address' => "127.0.0.1:9093"
}
# 指定后使配置生效即可
gitlab-ctl reconfigure
其他配置
邮箱配置:用于用户操作时推送关键性信息
# 1.修改容器中配置文件vi /etc/gitlab/gitlab.rb
### GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.126.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "smtp.126.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
user['git_user_email'] = "[email protected]"
# 2.重启配置
gitlab-ctl reconfigure
gitlab-ctl restart
# 3.测试:首先进入控制台
gitlab-rails console
# 执行测试命令
Notify.test_email("接收邮箱","标题","内容").deliver_now
# 4.输出如下内容就是成功了
root@gitlab:/# gitlab-rails console
--------------------------------------------------------------------------------
Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]
GitLab: 14.6.1 (661d663ab2b) FOSS
GitLab Shell: 13.22.1
PostgreSQL: 12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.1)
irb(main):001:0> Notify.test_email("[email protected]","ceshi","内容").deliver_now
Delivered mail [email protected] (1436.8ms)
=> #<Mail::Message:154820, Multipart: false, Headers: <Date: Wed, 02 Nov 2022 23:03:47 +0800>, <From: gitlab <[email protected]>>, <Reply-To: gitlab <[email protected]>>, <To: [email protected]>, <Message-ID: <[email protected]>>, <Subject: ceshi>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
坑和疑惑
# 按照以上方式启动docker会遇到一个坑,就是注册用户后,给新用户发邮件需要新用户点击邮件中的链接去重置密码,而链接点击后却是空白页?
# 这是因为邮件的链接是指向了10.10.1.199:80,并没有使用我们映射到宿主机的8929端口,这是因为我们在配置external_url 'http://10.10.1.199'时用的是默认的80,
# 那就简单了,直接指定external_url 'http://10.10.1.199:8929'不就行了吗?
# 这样改问题更大,直接通过http://10.10.1.199:8929都不能访问gitlab了,那怎么办?
# 其实问题出在docker创建时的端口映射,我们把容器的80->映射到了宿主的8929,而宿主内部使用的是80,而external_url 'http://10.10.1.199'对外的地址也是80,
# 所以改起来也很简单,就是让宿主机内部也是用8929,这样在external_url这里就可以使用external_url 'http://10.10.1.199:8929'了。
更正后的docker-compose.yml如下:
version: '3' services: gitlab: image: 'gitlab/gitlab-ce:latest' # 使用的gitlab镜像版本[其他参数见方案一解释] restart: always container_name: 'gitlab' hostname: 'gitlab' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://10.10.1.199:8929' gitlab_rails['gitlab_shell_ssh_port'] = 2224 alertmanager['flags'] = {'cluster.advertise-address' => "127.0.0.1:9093"} ports: - '8929:8929' - '2224:22' # - '9443:443' # 如果需要https访问则需要映射443端口 networks: - 'exist-net-bloom' # 当前创建的容器加入到外部的bloom网络 volumes: - '/docker/gitlab/config:/etc/gitlab' - '/docker/gitlab/logs:/var/log/gitlab' - '/docker/gitlab/data:/var/opt/gitlab' - '/etc/timezone:/etc/timezone:ro' - '/etc/localtime:/etc/localtime:ro' shm_size: '256m' networks: exist-net-bloom: # 改名字为当前docker-compose中要引用的名字 external: # 指定已经存在的网络名字 name: devops
疑惑:
有的小伙伴可能注意了,你的GITLAB_OMNIBUS_CONFIG环境变量中不是指定了external_url 'http://10.10.1.199:8929'吗?怎么实际设置vi /etc/gitlab/gitlab.rb的时候却使用了external_url 'http://10.10.1.199'不带端口的?
官方的解释:
GITLAB_OMNIBUS_CONFIG这个变量可以指定所有gitlab.rb配置文件中的属性,但这个不会写入到容器的gitlab.rb配置文件,所以他只是一个临时的配置,实际运行是还是使用的gitlab.rb中的配置。
疑惑:
既然不生效,为什么要在docker-compose.yml中指定呢?
其实直接说不生效并不准确,通过GITLAB_OMNIBUS_CONFIG指定的参数,在我不重新读gitlab.rb配置时确实是生效的,但是当重新执行gitlab-ctl reconfigure后就会以gitlab.rb中的配置为准了。而我们以上操作确实在启动docker容器后又改了gitlab.rb并重启加载,这样就导致GITLAB_OMNIBUS_CONFIG是失效的。
细节:
其实不知道大家有没有注意,如果按照我上边的操作,执行完docker-compose.yml启动容器后,直接访问http://10.10.1.199:8926是无响应的,就是因为这个时候GITLAB_OMNIBUS_CONFIG的设置生效了,因为这里我指定的external_url 'http://10.10.1.199:8929'是带端口的,而宿主和容器的映射却是8929->80。
最后一步:
所以按照正确的修正,修改了docker-compose.yml中的端口映射后,还需要修改一下vi /etc/gitlab/gitlab.rb才算完整:
external_url 'http://10.10.1.199:8929'
重新部署gitlab:
因为修改了docker-compose.yml,所以需要更新一下配置并构建# 关闭并移除现有gitlab容器 docker-compose down # 重构并启动:【之前的配置并不会丢失】 docker-compose up -d --build
常用命令
命令 | 描述 |
gitlab-ctl reconfigure | 重载配置 |
gitlab-ctl check-config | 检查配置并启动 |
gitlab-ctl diff-config | 将用户配置与包可用配置进行比较 |
gitlab-ctl status | 查看所有启动组件的进程和状态 |
gitlab-ctl service-list | 查看所有服务 |
gitlab-ctl stop | 停止GitLab服务 |
gitlab-ctl start | 启动GitLab服务 |
gitlab-ctl restart | 重启GitLab服务 |
gitlab-ctl once | 如服务已停止则启动,如服务已启动则重启 |
常用修改
gitlab默认的主分支是main:
# 修改路径: Menu->Admin->Settings->Repository->Default initial branch name自行设置,比如master是我们常用的主分支。
gitlab默认开启了分支保护:
# 不是owner用户需要mergerequest,测试期间可以暂时关闭,线上一般是开启的,为了安全,夜方便codereview。 # 关闭路径: Menu->Admin->Settings->General->Visibility and access controls->选中”Not protected“
以上参考官方文档:
https://docs.gitlab.cn/jh/install/docker.html