基于Docker配置本地Gitlab
技术背景
Github和Gitee(码云)是最常见的基于git的代码托管平台,现在基于svn的代码管理仓库已经相对比较少见了,大部分还都是企业内部的代码仓。但是基于开源的Gitlab,我们在企业内网也可以立马搭建一个代码托管平台,并且自带集成有各种代码自动化测试工具,实现持续集成和持续测试。
关于Docker容器的使用,这里我们主要是为了规避不同的OS发行版所带来的安装困扰,而Gitlab官方也提供了Docker的支持。也就是说,只要本地环境中有Docker,就可以很方便的去构造一个本地的Gitlab环境。本文也是基于Docker,讲解和展示本地Gitlab的配置和使用方法。
基于Docker的Gitlab环境部署
关于更多的docker的使用和操作方法和使用案例,读者可以参考这些博客(博客1,博客2,博客3,博客4),这里我们就直接使用docker的一些功能。比如首先我们要做的是从dockerhub中拉取Gitlab官方提供的镜像:
[dechin-manjaro gitlab]# docker pull gitlab/gitlab-ce
这个下载的速度还是不错的,下载完成后可以在使用docker images查看相关镜像是否在本地仓库列表中。需要注意的是,这些基本的docker操作都需要root权限来执行。下载完镜像后,在本地找一个空的目录,创建几个文件夹用于绑定容器内的相关目录,使得容器中所生成的配置文件和日志文件数据文件等可以同步到本地的目录(而不仅仅是保存在容器内部的目录)。
[dechin-manjaro gitlab]# ll
总用量 0
[dechin-manjaro gitlab]# mkdir -p config
[dechin-manjaro gitlab]# mkdir -p logs
[dechin-manjaro gitlab]# mkdir -p data
这里创建了config、logs和data目录,分别用-v指令绑定到容器内的/etc/gitlab、/var/log/gitlab和/var/opt/gitlab目录,具体的运行指令如下所示(参考了参考链接1):
[dechin-manjaro gitlab]# docker run -d -p 5443:443 -p 82:82 -p 2222:22 --name gitlab -v /home/dechin/projects/2021-softwares/gitlab/config:/etc/gitlab -v /home/dechin/projects/2021-softwares/gitlab/logs:/var/log/gitlab -v /home/dechin/projects/2021-softwares/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
c12732a4acfb4835b8d1353b62cf85868edc2466eb0669bbabc2059f7932c309
执行之后容器开始进入后台运行,我们可以看到当前的运行状态是health: starting:
[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c12732a4acfb gitlab/gitlab-ce "/assets/wrapper" 6 seconds ago Up 5 seconds (health: starting) 80/tcp, 0.0.0.0:82->82/tcp, :::82->82/tcp, 0.0.0.0:2222->22/tcp, :::2222->22/tcp, 0.0.0.0:5443->443/tcp, :::5443->443/tcp gitlab
36fc44248800 gitlab/gitlab-ce "/assets/wrapper" 45 minutes ago Exited (137) 5 minutes ago hardcore_poitras
d9e431790dfa gitlab/gitlab-ce "--help" 45 minutes ago Created 22/tcp, 80/tcp, 443/tcp intelligent_hopper
接下来我们要做的事情就是等待,一段时间(大约2~3分钟)之后,可以重新查看刚才的容器镜像的运行状态,此时我们可以发现状态变成了healthy:
[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c12732a4acfb gitlab/gitlab-ce "/assets/wrapper" 4 minutes ago Up 4 minutes (healthy)
36fc44248800 gitlab/gitlab-ce "/assets/wrapper" 49 minutes ago Exited (137) 10 minuteitras
d9e431790dfa gitlab/gitlab-ce "--help" 49 minutes ago Created _hopper
这表示Gitlab容器的初始化已经完成了,接下来我们可以在本地的目录下(而不是容器内部的目录)找到名为gitlab.rb的配置文件,需要对其进行修改:
[dechin-manjaro gitlab]# vi config/gitlab.rb
要修改的地方主要有以下几点:
external_url 'http://192.168.0.105:82' # 大约在32行,注意替换本地ip地址
gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 大约在631行
# nginx['redirect_http_to_https_port'] = 82 # 大约在1312行
nginx['listen_port'] = 82 # 大约在1354行
修改完成后,重启gitlab的容器镜像(在上一次的run中,我们将其命名为gitlab):
[dechin-manjaro gitlab]# docker restart gitlab
gitlab
跟刚才一样的,需要看容器状态以确定是否启动成功:
[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID IMAGE COMMAND CREATED STATUS
c12732a4acfb gitlab/gitlab-ce "/assets/wrapper" 13 minutes ago Up 12 seconds (health:
36fc44248800 gitlab/gitlab-ce "/assets/wrapper" 57 minutes ago Exited (137) 18 minutere_poitras
d9e431790dfa gitlab/gitlab-ce "--help" 58 minutes ago Created igent_hopper
当状态变成了healthy之后,就可以进入下一步的工作:
[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID IMAGE COMMAND CREATED STATUS
c12732a4acfb gitlab/gitlab-ce "/assets/wrapper" 15 minutes ago Up 2 minutes (healt
36fc44248800 gitlab/gitlab-ce "/assets/wrapper" About an hour ago Exited (137) 20 min_poitras
d9e431790dfa gitlab/gitlab-ce "--help" About an hour ago Created ent_hopper
Gitlab配置
在前面的步骤都执行成功后,我们应该可以在浏览器中输入http://192.168.0.105:82/(这里注意替换本地ip地址,Linux系统可以通过ifconfig获取)打开Gitlab的管理界面如下:

首次登录会被要求重设密码,帐号是root。重设完密码之后,就可以进入Gitlab的登录页面:

输入root帐号和刚才设定的密码之后,就可以登录进入Gitlab主页:

在主页上点击创建项目,可以新建一个本地的项目:

创建好项目后的项目主页如下:

这里因为我们略过了一个步骤,在第一次使用Gitlab平台的时候,需要使用RSA加密生成密钥对,点击刚才界面上的添加ssh key进入添加密钥对的界面:

此时我们需要在本地终端窗口中执行如下的指令来产生密钥对:
[dechin@dechin-manjaro projects]$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dechin/.ssh/id_rsa): private_gitlab.pub # 文件名,可以不加pub
Enter passphrase (empty for no passphrase): # 输入自定义密码
Enter same passphrase again: # 再次输入自定义密码
Your identification has been saved in private_gitlab.pub
Your public key has been saved in private_gitlab.pub.pub
The key fingerprint is:
SHA256:Xr3DhNi+8ZMJ×××××××××××××××××××0w dechin@dechin-manjaro
The key's randomart image is:
+---[RSA 2048]----+
|o.. |
|.. o. . . |
|..+o + * |
| . E o.oo++o |
| o . .++. |
| o.. . .. |
+----[SHA256]-----+
执行完该指令会在当前目录下产生两个密钥文件:
[dechin@dechin-manjaro projects]$ ll
总用量 8
-rw------- 1 dechin dechin 1876 5月 5 16:43 private_gitlab.pub
-rw-r--r-- 1 dechin dechin 403 5月 5 16:43 private_gitlab.pub.pub
其中少一个pub的文件是私钥,不应该暴露出来,而多一个pub的文件是公钥,需要复制这个文件中的字符串,输入到刚才Gitlab的配置中:
[dechin@dechin-manjaro projects]$ cat private_gitlab.pub.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDt6VXrvTPhWr5iUy3KpIzRryX3SGBUAYietTMSqEOuZjRXr1u14lFk1cT5jwAHw7BtnfBOrwptTIYaWztoWR94gG1W1KFc6HRY0SWrUHtwXwOypWcqMv7Z2AT6TFIgNf/2ZZAlYisC0G9xTO5qTcYDyJe/88zcIm/5B6NQ7safAkGkGYY+WrFxBpnNU2bEdSbx4Sem2v2TD9GRxSg9RpLSXQaULi1bpDgGfxLJZBxj2Eeo11j9ayjipWFqJ43pJ dechin@dechin-manjaro
一般是以ssh-rsa开头的字符串,输入完成后点击Add Key,即可完成密钥对的配置:

代码仓基本操作
在完成前面章节的基本配置之后,就可以使用https的方式将需要托管的代码仓库clone下来同步操作,首先复制仓库链接:

到本地终端窗口执行git clone指令:
[dechin@dechin-manjaro projects]$ git clone http://192.168.0.105:82/root/myfirstproject.git
正克隆到 'myfirstproject'...
Username for 'http://192.168.0.105:82': root
Password for 'http://root@192.168.0.105:82':
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), 完成.
完成克隆操作后,可以在当前目录下看到一个新生成的与仓库同名的文件夹,里面仅有一个项目初始化的readme文件,这也是创建项目时候所选择的配置:
[dechin@dechin-manjaro projects]$ ll
总用量 12
drwxr-xr-x 3 dechin dechin 4096 5月 5 16:50 myfirstproject
-rw------- 1 dechin dechin 1876 5月 5 16:43 private_gitlab.pub
-rw-r--r-- 1 dechin dechin 403 5月 5 16:43 private_gitlab.pub.pub
[dechin@dechin-manjaro projects]$ cd myfirstproject/
[dechin@dechin-manjaro myfirstproject]$ ll
总用量 4
-rw-r--r-- 1 dechin dechin 44 5月 5 16:50 README.md
关于更多的git相关操作,读者可以参考这一篇博客,这里我们仅为了展示本地部署的gitlab的使用场景演示:
[dechin@dechin-manjaro myfirstproject]$ mkdir src # 创建一个src目录
[dechin@dechin-manjaro myfirstproject]$ cd src/
[dechin@dechin-manjaro src]$ touch .gitkeep # 创建一个gitkeep文件,可以使得目录不被简化,空目录无法被git识别
[dechin@dechin-manjaro src]$ git status # 查看修改状态
位于分支 master
您的分支与上游分支 'origin/master' 一致。
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
./
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[dechin@dechin-manjaro src]$ git add ./ # 添加当前目录下的所有修改
[dechin@dechin-manjaro src]$ git commit -m 'Create a folder from localhost' 提交修改说明
[master 211278b] Create a folder from localhost
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/.gitkeep
[dechin@dechin-manjaro src]$ git push # 推送修改
Username for 'http://192.168.0.105:82': root # 输入gitlab的用户名
Password for 'http://root@192.168.0.105:82': # 输入gitlab的密码
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (4/4), 327 字节 | 327.00 KiB/s, 完成.
总共 4(差异 0),复用 0(差异 0),包复用 0
To http://192.168.0.105:82/root/myfirstproject.git
5ee2b12..211278b master -> master
提交修改前后对比:


我们可以看到push完成后,Gitlab项目界面上多了一个src目录出来,这就说明变更提交成功了,而且每一次变更的说明信息都会被保存,最近一次的变更说明会在主页上显示出来。接下来再试试Gitlab的分支管理,新建一个分支,然后直接提交:
[dechin@dechin-manjaro myfirstproject]$ git checkout -b dev
切换到一个新分支 'dev'
[dechin@dechin-manjaro myfirstproject]$ git push
fatal: 当前分支 dev 没有对应的上游分支。
为推送当前分支并建立与远程上游的跟踪,使用
git push --set-upstream origin dev
[dechin@dechin-manjaro myfirstproject]$ git push --set-upstream origin dev
Username for 'http://192.168.0.105:82': root
Password for 'http://root@192.168.0.105:82':
总共 0(差异 0),复用 0(差异 0),包复用 0
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.0.105:82/root/myfirstproject/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To http://192.168.0.105:82/root/myfirstproject.git
* [new branch] dev -> dev
分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'。

上传新的分支之后,就会在分支列表中看到不同的分支。那么除了这些提交修改同步的功能之外,Gitlab也有类似于Github的工作管理界面,比如个人活跃度:

比如基于Merge Request和Issue的任务提交与下发系统:

在同一个无线网络的局域网下,使用手机等终端设备也可以访问该私有的Gitlab仓库:

基本上功能还是比较完善的。而关于自动化集成的方案,会在后续介绍Jenkins的博客中再展开说明。
总结概要
本文按照操作流程的时间顺序,分别介绍了Gitlab的Docker容器部署、Gitlab平台的基本配置以及基于Git的代码仓基本管理与同步方法。通过掌握这一套的流程,就可以实现在本地构建一个类似于Github的代码托管系统,在企业内网更好的管理私有代码仓库,避免因为在Github上进行代码开发而被其他企业窃取核心技术。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/gitlab.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
参考链接
基于Docker配置本地Gitlab的更多相关文章
- 搭建并配置本地GitLab服务器教程
由于工作单位不一定能够方便使用外部网络,现以下载rpm包来搭建一套本地GitLab服务器. 1. 系统准备 系统:redhat 7.3 2. 下载所需安装包 去官网下rpm包,下载地址,ce是免费的社 ...
- 上穷碧落下凡尘:Win10系统下基于Docker配置Elasticsearch7配合Python3进行全文检索交互
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_166 基于文档式的全文检索引擎大家都不陌生,之前一篇文章:使用Redisearch实现的全文检索功能服务,曾经使用Rediseac ...
- Docker配置本地镜像与容器的存储位置
默认情况下Docker的存放位置为:/var/lib/docker 可以通过下面命令查看具体位置: sudo docker info | grep "Docker Root Dir" ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)---Harbor的安装
前期安装文档:https://www.cnblogs.com/lq-93/p/11828626.html Harbor的作用: 开发提交代码至gitlab容器中,Jenkins拉取代码构建镜像 ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)
说明:前期的安装,请转向https://www.cnblogs.com/lq-93/p/11824039.html (4).查看gitlab镜像是否启动成功 docker inspect 容器id ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作
一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...
- ubunt 基于deb 配置本地apt 源 分成仅本机使用,局域网使用2种
dpkg-scanpackages /software /dev/null | gzip>/software/Packages.gz
- 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...
- 如何搭建基于Docker的gitlab服务器集成CI/CD实现DEVOPS(完整版)
From this lesson you will learn about 1,How to install and configure a docker based gitlab server 2, ...
随机推荐
- Markdown的基本用法与下载
Markdown的基本用法与下载typora 下载typora 1.在浏览器搜索typora 2.然后点进去 3.往下翻点击Download 4.看自己是什么系统然后在选择 5.选好系统以后再去去选择 ...
- 解决浏览器点击button出现边框问题
发现问题 本人不懂浏览器的HTML代码 不知道怎么在chrome浏览器的F12之后点到了哪里 点击button的时候就会出现黑色边框 解决 终于发现不是因为动了调试页面,而是动了谷歌浏览器的高级选项, ...
- vivo 官网资源包适配多场景的应用
本文介绍了资源包的概念及使用场景,同时对资源包的几种使用方案进行对比.通过本文,大家可以快速掌握资源包的使用方法,解决单一配置满足多场景.多样式的问题. 一.业务背景 随着官网项目的业务深入发展,单纯 ...
- go 动态数组 二维动态数组
go使用动态数组还有点麻烦,比python麻烦一点,需要先定义. 动态数组申明 var dynaArr []string 动态数组添加成员 dynaArr = append(dynaArr, &quo ...
- 如何使用python爬取网页动态数据
我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...
- 你好,布尔玛!(BulmaRazor)
Blazor 官方简介 Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的 ...
- 学习版pytest内核测试平台开发万字长文入门篇
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...
- 测试平台系列(2) 给Pity添加配置
给Pity添加配置 回顾 还记得上篇文章创立的「Flask」实例吗?我们通过这个实例,给根路由 「/」 绑定了一个方法,从而使得用户访问不同路由的时候可以执行不同的方法. 配置 要知道,在一个「Web ...
- div+伪元素实现太极图
需求:使用div和伪元素实现阴阳太极图 图例: 代码: <html> <head> <title>太极图</title> <style type= ...
- BuaacodingT141 microhhh的回城 题解(模拟)
题目链接 microhhh的回城 解题思路 这题挺有意思的.本来寻思放在\(DS\)第一次练习赛应该不会很难吧,结果愣是卡在数据范围上写不出来. 然后暴力过掉了,但是用了\(1019ms\).感觉可以 ...