部署Gitlab-CE with Docker私有云环境

应用环境

Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64)

Docker version 28.1.1, build 4eba377

文章目录

拉取容器镜像

bash 复制代码
sudo apt-get update

## gitlab-ce:17.9.6-ce.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.9.6-ce.0

## gitlab-ce:17.10.4-ce.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0
## 添加标签名Tag
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 docker.io/gitlab/gitlab-ce:17.10.4-ce.0
## 移除标签名Tag
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0

国内镜像参考:
渡渡鸟镜像
清华大学开源软件镜像

生成Run脚本

可参考:渡渡鸟-Run助手

参数解读

powershell 复制代码
# 将镜像进实例化成容器并运行
docker run

# 【i】保持STDIN(标准输入)开放,即使没有附加任何东西。这通常用于让容器的进程保持运行,即使没有附加到终端。例如,你可以在容器内部运行一个交互式shell
# 【t】分配一个伪终端(pseudo-TTY),这对于交互式shell非常重要,比如当你想要在容器中运行bash或sh时。
# 【d】后台运行,即所谓的"detached"模式。容器会在后台启动,并且你会得到容器的ID或名称
-itd

# 容器命名
--name gitlab-ce

# 重启策略
## no:不自动重启,缺省时默认
## always:始终重启
## unless-stopped:Docker 服务重启后自动启动容器,除非容器被手动停止。可指定最大重试次数,例如 --restart=on-failure:3(最多重启3次)。
## on-failure:仅在容器非正常退出(退出状态码非0)时重启。
--restart=always \

# 【p】映射策略,<宿主端口>:<容器端口>
## 比如gitlab,22为ssh协议;80为http协议;443为https协议
-p 1022:22 \
-p 81:80 \
-p 10443:443 \

# 使用本地时区
-e TimeZone='Asia/Shanghai' \
-e TZ='Asia/Shanghai' \
-v /etc/localtime:/etc/localtime \

# Host域名映射
--add-host=gitlab.oh.com:172.10.3.200 \

# 挂载卷映射(宿主:容器)
## /etc/gitlab:配置文件
## /var/log/gitlab:日志数据
## /var/opt/gitlab:应用数据
-v /gitlab-ce/config:/etc/gitlab  \
-v /gitlab-ce/logs:/var/log/gitlab \
-v /gitlab-ce/data:/var/opt/gitlab \

# 让容器获取宿主机root权限
--privileged=true \

# 最后一行所引用的docker镜像源

实例脚本

建议http服务,不要使用默认的80端口。很容易与其它docker容器服务或宿主机其它服务冲突,比如宿主机安装的nginx、apache服务。

bash 复制代码
docker run -itd \
--name gitlab-ce \
--restart=always \
-p 1022:22 \
-p 81:80 \
-p 10443:443 \
-e TimeZone='Asia/Shanghai' \
-e TZ='Asia/Shanghai' \
-v /etc/localtime:/etc/localtime \
-v /gitlab-ce/config:/etc/gitlab  \
-v /gitlab-ce/logs:/var/log/gitlab \
-v /gitlab-ce/data:/var/opt/gitlab \
--privileged=true \
docker.io/gitlab/gitlab-ce:17.10.4-ce.0

环境配置

bash 复制代码
# 打开配置文件
sudo vim /gitlab-ce/config/gitlab.rb

编辑内容如下

ini 复制代码
## GitLab URL
external_url 'http://192.168.1.50'

## GitLab SSH
gitlab_rails['gitlab_ssh_host'] = '192.168.1.50'
gitlab_rails['time_zone'] = 'Asia/Shanghai'

### GitLab Shell settings for GitLab
gitlab_rails['gitlab_shell_ssh_port'] = 1022
# gitlab_rails['gitlab_shell_git_timeout'] = 800

输入:wq保存退出后,进入Gitlab bash控制台

bash 复制代码
sudo docker exec -it gitlab-ce bash
# 更新配置
gitlab-ctl reconfigure

#修改gitlab.yml
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

内容如下

提示

如果不在Gitlab bash控制台中打开,则在宿主机/gitlab-ce/data/gitlab-rails/etc/gitlab.yml

打开编辑
sudo vim /gitlab-ce/data/gitlab-rails/etc/gitlab.yml

重启服务
sudo docker restart gitlab-ce

输入:wq!保存退出后,重启容器

bash 复制代码
gitlab-ctl restart

执行结果如下

当成功执行后,会生成容器ID(docker后端会直接开始运行该容器)。通过portainer-ce WEB端查看,就能看到当前运行状态

当运行状态呈现绿色时,就可以直接访问容器Web端了。在访问前,需要先查看Gitlab实例化时随机生成的root密码(注意密码仅24小时内有效)

bash 复制代码
# 先退出Gitlab控制台
exit
# 查看root初始化密码
sudo cat initial_root_password

内容如下

登录到Web端后,先修改显示语言:

  • 左侧导航栏右上角头像,进入【Preferences】偏好设置。
  • 拉到最下面【Localization】本地化,将【Language】语言,设置为【Chinese, Simplified】中文。
  • 再拉到底,直接【Save changes】保存。

保存成功后,直接刷新页面或直接按F5即可。之后再进入左侧导航栏【密码】,修改root密码即可。

提示

如果宿主机是虚拟机环境(比如Ubuntu Sublinux with WSL),那仍需将GitLab私有服做物理网络穿透。否则宿主机所在局域中其它计算机仍无法访问该Gitlab服务。

管理员密码遗忘

直接进入Gitlab bash控制台

bash 复制代码
sudo docker exec -it gitlab-ce bash

--连接gitlab数据库(#号前缀是控制台提示符状态)
gitlab-rails console -e production

## 执行结果
--------------------------------------------------------------------------------
 Ruby:         ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-linux]
 GitLab:       17.6.1 (8a31863db02) FOSS
 PostgreSQL:   14.11
------------------------------------------------------------[ booted in 32.61s ]
Loading production environment (Rails 7.0.8.4)
irb(main):001:0>

--修改root密码
# 查找并指向到root账号
irb(main):005:0> user = User.find_by(username: 'root')
=> #<User id:1 @root>
# 修改root密码(注意第2遍为确认密码),user.save即为保存
irb(main):006:0> user.password = 'S87fdj@&yhkk'
irb(main):007:0> user.password_confirmation = 'S87fdj@&yhkk'
irb(main):008:0> user.save!
=> true
irb(main):009:0> exit

# 退出Gitlab bash控制台
root@2a11f26e011d:/# exit

服务邮箱配置

bash 复制代码
# 打开配置文件
sudo vim /gitlab-ce/config/gitlab.rb

追加内容如下

ini 复制代码
### 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.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "admin@smtp.com"
gitlab_rails['smtp_password'] = "S87fdj@&yhkk"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true
# gitlab_rails['smtp_pool'] = false

###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html
gitlab_rails['smtp_openssl_verify_mode'] = 'none'

# gitlab_rails['smtp_ca_path'] = "/etc/ssl/certs"
# gitlab_rails['smtp_ca_file'] = "/etc/ssl/certs/ca-certificates.crt"

### Email Settings
gitlab_rails['gitlab_email_enabled'] = true

##! If your SMTP server does not like the default 'From: gitlab@gitlab.example.com'
##! can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = 'master@gitlab.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab CE'
gitlab_rails['gitlab_email_reply_to'] = 'master@gitlab.com'
# gitlab_rails['gitlab_email_subject_suffix'] = ''
# gitlab_rails['gitlab_email_smime_enabled'] = false
# gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key'
# gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt'
# gitlab_rails['gitlab_email_smime_ca_certs_file'] = '/etc/gitlab/ssl/gitlab_smime_cas.crt'
邮件测试

输入:wq保存退出后,进入Gitlab bash控制台

bash 复制代码
sudo docker exec -it gitlab-ce bash
# 更新配置
gitlab-ctl reconfigure

# 重启gitlab-ctl服务
gitlab-ctl restart

# 邮件测试
gitlab-rails console -e production
Notify.test_email('admin@smtp.com', 'Subject', 'Body').deliver_now

邮箱有收到邮件,就表示配置成功!

运维问题集锦

(1) 端口映射关系

bash 复制代码
# 登录gitlab控制台
sudo docker exec -it gitlab-ce bash

# 查看运行进程
netstat -ltwen

# 查看宿主机运行进程
sudo netstat -tunlp
sudo netstat -aptn

##查看指定端口占用情况
sudo ps aux | grep 'xrdp*'
sudo netstat -tunlp | grep 端口号

(2) 服务日志

bash 复制代码
# 宿主机docker跟踪
## 参数:--tail 10表示实时跟踪最新的10条记录
sudo docker logs -f gitlab-ce --tail 10

# 直接进入如下路径,Gitlab容器内相关子服务进程日志都在这里,比如nginx、redis、reconfigure重载配置实例化记录等等
cd /gitlab-ce/logs/

# 将地址解析添加到hosts列表
echo "192.168.1.50 gitlab.local" | sudo tee -a /etc/hosts

# 查看配置内容, 仅输出有效的配置项
sudo cat gitlab.rb | grep -vE '^#|^$'

(3) 分支受保护

错误信息【IntelliJ Idea or WebStorm】

remote: GitLab: You are not allowed to push code to protected branches on this project.

不允许将代码推送到此项目的受保护分支。

错误信息【Visual Sutdio】

Git failed with a fatal error.Unencrypted HTTP is not recommended for Gitlab. Ensure the repository remote URL is using HTTPS.

Git失败并出现致命错误。不建议对Gitlab使用未加密的HTTP。确保存储库远程URL使用HTTPS。

该错误也是因为支分保护的问题,本身极狐官方不推荐在http协议下进行远程操作代码。推荐是采用https或SSH代码操作方案。

打开项目【设置】-【仓库】-【受保护分支】一栏

允许推送和合并 角色调整为如图(含开发角色),或者直接取消保护也可以(选项是立即生效的)。

项目操作

(1) 建立群组

(2) 创建项目

(3) 项目的版本控制

在解决方案中,经常会存在多个项目和项目目录,经常需要处理忽略对某个项目、项目里某个文件夹、文件的版本跟踪控制。

忽略某个项目 版本控制,在解决方案根下的.gitignore文件,按下图添加该目录路径即可。

忽略文件夹 版本控制(含子目录及文件),编辑项目根下的.gitignore文件,按下图添加该目录路径即可。

忽略某个文件,在上图中# Editor directories and files一切直接放入文件名就可以了。当然主文件名或扩展名是支持通配符的。

-待续-

相关推荐
Cyber4K21 分钟前
【Kubernetes专项】温故而知新,重温技术原理(2)
云原生·容器·kubernetes
雨奔3 小时前
Kubernetes 网络策略(NetworkPolicy)完全指南:声明式 Pod 通信管控
网络·容器·kubernetes
身如柳絮随风扬3 小时前
Kubernetes v1.20.9 集群搭建
云原生·容器·kubernetes
蛐蛐蛐5 小时前
在Windows 11上安装Docker的踩坑记录
运维·docker·容器
古典和浪漫5 小时前
docker file 中设置软链接和在k8s 中配置同步时区 有什么区别,各自优缺点
docker·容器·kubernetes
成为你的宁宁5 小时前
【K8s ServiceAccount 机制原理与 RBAC 权限实战应用】
云原生·容器·kubernetes
尘世壹俗人6 小时前
知识点12---k8s进阶操作方式yaml资源文件
docker·容器·kubernetes
尘世壹俗人6 小时前
知识点13---k8s存储持久化
容器·kubernetes·flask
SilentSamsara6 小时前
Kubernetes 网络模型:CNI 插件与 Pod 间通信的底层实现
网络·云原生·容器·架构·kubernetes·k8s
牛奶咖啡137 小时前
Docker容器实践——Docker常用基础镜像的解析与选择
docker·容器·docker基础镜像·docker基础镜像选择·docker基础镜像最佳实践·docker基础镜像的分类·docker基础镜像的对比