通過 docker 搭建自用的 gitlab 服務

楊高超發表於2018-01-03

前言

git 是當下如日中天的版本管理系統。現在如果不是工作在 git 版本管理系統之下,幾乎都不好意思和人打招呼了。有很多現成的網際網路的 git 服務提供給大家使用,例如號稱程式設計師社交網路的 GitHub,還有低調好用的 bitbucket 。這些給個人使用或者公司用來做開源使用都沒有什麼問題。但如果在部門內推廣使用就會涉及到程式碼不能公開或者額外的費用的問題。本人原來在部門內採用的是手工在 linux 伺服器上來管理程式碼倉庫。許可權沒法設定,也非常不方便。所以也一直很苦惱。

正好 gitlab 公司提供了 gitlab 社群版,看了看基本滿足了部門內 git 管理的需求。gitlab 提供了各種各樣的安裝方式,最方便的當然還是 docker 方式的安裝,適合我這種不想多折騰的。抽空搭建了一個。也趟了幾個坑,將步驟記錄如下,希望對其他有此需求的人有所幫助。

docker 安裝

既然是基於 docker 來安裝 gitlab ,首先是安裝 docker 環境了。我是在 centos 7 的基礎上安裝的。根據官網的指南

刪除舊版本的 docker

舊版本的 docker 的叫做 docker 或者 docker-engine,如果系統中已經安裝舊版本,則需要刪除。通過一下命令刪除舊的 docker 版本

yum remove docker docker-common docker-selinux docker-engine
複製程式碼

增加 docker yum 源

新的 docker 叫做 docker-ce ,如果第一次安裝 docker-ce 需要設定 docker-ce 的 yum 源。用如下的命令來增加 docker-ce 的yum 源

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-test
複製程式碼

安裝 dokcer-ce

首先我們檢視所有有效的 docker-ce 的版本

yum list docker-ce --showduplicates | sort -r
複製程式碼

得到如下的列表

docker-ce.x86_64         17.12.0.ce-1.el7.centos              docker-ce-test   
docker-ce.x86_64         17.12.0.ce-1.el7.centos               docker-ce-stable 
docker-ce.x86_64         17.12.0.ce-1.el7.centos               @docker-ce-stable
docker-ce.x86_64         17.12.0.ce-0.4.rc4.el7.centos         docker-ce-test   
docker-ce.x86_64         17.12.0.ce-0.3.rc3.el7.centos         docker-ce-test   
docker-ce.x86_64         17.12.0.ce-0.2.rc2.el7.centos         docker-ce-test   
docker-ce.x86_64         17.12.0.ce-0.1.rc1.el7.centos         docker-ce-test   
docker-ce.x86_64         17.11.0.ce-1.el7.centos               docker-ce-test   
docker-ce.x86_64         17.11.0.ce-0.4.rc4.el7.centos         docker-ce-test   
...
docker-ce.x86_64         17.03.1.ce-0.1.rc1.el7.centos         docker-ce-test   
docker-ce.x86_64         17.03.0.ce-1.el7.centos               docker-ce-stable
複製程式碼

從這裡可以看到最新的穩定版本是 17.12.0.ce。我們用下面的命令選擇安裝該版本

yum install docker-ce-17.12.0.ce
複製程式碼

自定義 docker 配置

因為眾所周知的原因,訪問 docker 的中央倉庫下載 docker 映象的速度非常慢。為了獲得較好的體驗,我們需要配置一個尋找一個國內的映象加速服務。

預設情況下,docker 將執行的目錄配置到了/var/lib/docker 目錄下。通常這個目錄是在 linux 的根分割槽下,空間比較有限,所以我們需要將 docker 的執行目錄配置到其他目錄下。

映象加速服務可以使用阿里雲的映象加速服務。註冊阿里雲的使用者後,登入 https://cr.console.aliyun.com ,在管理控制檯選擇映象加速服務,則出現如下的資訊。這裡紅色打碼部分就是你的阿里雲映象加速服務的地址。

阿里雲映象加速服務

為了自定義 docker 的預設執行目錄和映象倉庫地址,我們需要修改 /etc/docker/daemon.json

mkdir /etc/docker
vi /etc/docker/daemon.json
複製程式碼

輸入如下內容

{
  "graph":"/u1/docker",
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
複製程式碼

graph 定義 docker 執行的目錄, registry-mirrors 定義了 docker 獲取映象的倉庫的地址。

啟動 docker

執行如下的命令啟動 docker 的服務

systemctl start docker
複製程式碼

執行如下命令檢視 docker 資訊

docker info
複製程式碼

可以看到如下的資訊

docker 資訊

可以看到 Docker Root Dir 和 RegistryMirrors 都變成了 /etc/docker/daemon.json 中配置的內容了

安裝 gitlab

下載映象

執行下面的命令,從 docker 的映象倉庫中下載 gitlab 社群版的映象

docker pull gitlab/gitlab-ce:latest
複製程式碼

映象有 1g 多,所以需要等待一段時間

資料持久化儲存

因為容器的資料是不能持久化儲存的。所以我們需要用 docker volume 的方式將儲存的資料對映到作業系統的目錄中來。這樣就算執行的容器崩潰,我們重新啟動一個新的容器,原來容器中的資料還是不會丟失

我們建立了目錄 /u1/gitlab 來儲存 gitlab 容器中的資料

準備對映 sshd

另外,為了 git 採用 ssh 協議來操作 git 倉庫,我們將主機的 sshd 的 22 埠對映到 容器中去。將主機的 sshd 埠更改為 15678。這裡因為 centos 7 更嚴格的安全機制,算是一個坑,需要按照下面的步驟去進行。

編輯檔案 /etc/ssh/sshd_config,將其中的 #Port 22 註釋去掉,將數字 22 更改為 15678

執行下面的命令重啟 sshd 服務

systemctl restart sshd
複製程式碼

執行下面的命令使 15678 埠可以對外提供服務。否則無法進行遠端的 ssh 登入。

semanage port -a -t ssh_port_t -p tcp 15678
firewall-cmd --permanent --add-port=15678/tcp
firewall-cmd --reload 
複製程式碼

執行 gitlab

docker run \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --volume /u1/gitlab/config:/etc/gitlab \
    --volume /u1/gitlab/logs:/var/log/gitlab \
    --volume /u1/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce
複製程式碼

這裡把主機的 443、80、22 埠直接轉發到容器,同時利用 --volume /u1/gitlab/config:/etc/gitlab 、 --volume /u1/gitlab/logs:/var/log/gitlab 、 --volume /u1/gitlab/data:/var/opt/gitlab 這三個引數將 gitlab 的配置、資料和日誌持久化到主機檔案系統上來。

管理員配置 gitlab

登入 gitlab

等待 docker 容器啟動完成後,訪問 http://ip 就進入 gitlab 訪問介面。第一次訪問是讓我們修改管理員密碼。如下所示

初始化 gitlab 管理員密碼

設定後管理員密碼後,就進入登入頁面,輸入使用者名稱 root 和剛才設定的密碼就進入了 gitlab 的控制檯。如下圖所示

gitlab 管理員控制檯

建立組( group)

gitlab 裡面有三類物件:組( group)、專案( project)和使用者 (people)。

為了方便管理,我們應該基於組來建立專案。一個專案就是一個 git 的倉庫。基於組建立專案 ,然後將使用者設定合適的許可權後加入到組裡面。這樣使用者就有了組裡面所有專案的對應許可權。

點選 “Create a group” 連結,如下圖所示建立一個“健康醫療開發組” 的組

gitlab 建立組

建立使用者(people)

點選 “Add people” 連結,如下圖所示建立一個 “yanggch” 的使用者

gitlab 增加使用者

因為還沒有配置好郵件服務,所以還不能傳送使用者初始化密碼的郵件。我們需要編輯使用者,手動設定一個密碼。如下圖所示。如果使用者忘記了密碼,充值密碼也可以在這裡進行。

gitlab 修改使用者資訊

將使用者加入組

為了方便管理,需要將使用者加入到對應的組裡面。如下圖所示,在組管理介面中,點選組的名稱,進入組使用者設定介面。將剛才建立的使用者 “yanggch” 加入到組 “健康醫療開發組”中,並且給他設定為 “Master” 角色。只有 “Master” 或者 “Owner” 角色才能推送 git 的更新。

image.png

建立專案(project)

增加 gitlab 組的時候,為了讓專案讓組裡面的人都能訪問,注意要將專案建立在組之下。如下圖所示,在“健康醫療開發組”之下建立了 “redis_util” 的專案。

gitlab 建立專案

這樣專案建好之後就可以被組裡的使用者訪問了。

客戶端訪問

安裝 git 客戶端

這裡演示在 window上安裝 git 客戶端。首先根據 window 版本下載 git 客戶端安裝程式。這裡我下載的是

https://github.com/git-for-windows/git/releases/download/v2.15.1.windows.2/Git-2.15.1.2-64-bit.exe
複製程式碼

命令列訪問

安裝後,在準備 clone 專案的目錄下點選滑鼠右鍵,出現下面的右鍵選單。

右鍵選單

點選 “Git Bash Here” 進入 git 命令列環境。我們會從 redis_util 專案中看到該專案基於 http 協議的 clone 命令是

git clone http://7a45cd079bdc/healthcare_dev/redis_util.git
複製程式碼

這裡的 7a45cd079bdc 實際上是 docker 容器的機器名。實際執行的時候我們把這個字串更換成容器所在主機的 ip 地址即可。如下所示

git clone http://10.110.2.50/healthcare_dev/redis_util.git
複製程式碼

這種情況下會要求輸入登入的使用者名稱和密碼。這裡輸入剛才建立的使用者的使用者名稱和密碼即可。在使用前,需要用這個使用者登入 gitlab 控制檯修改一下初始密碼才能使用。

gitlab http 許可權驗證

出現如下提示表示從 gitlab clone 專案成功

Cloning into 'redis_util'...
warning: You appear to have cloned an empty repository.
複製程式碼

免密碼登入

剛才那種方式通過 http 協議和 gitlab 進行通訊,每次都要輸入使用者名稱和密碼,非常不方便。使用者可以設定通過 ssh 進行互動,將ssh key 加入到使用者的 sshkey 設定列表中。

參考“命令訪問” 章節進入 git 的 bash 環境。執行下面的命令進入 ssh key 儲存目錄

cd ~/.ssh
複製程式碼

目錄中 id_rsa.pub 是 ssh 訪問的公鑰。如果不存在則執行下面的命令生成

ssh-keygen -t rsa
複製程式碼

全部回車後,會生成 id_rsa.pub 檔案。

將檔案中的內容拷貝到剪貼簿。然後通過前面建立的使用者名稱和密碼登入 gitlab 控制檯。在下面的介面中,將 id_rsa.pub 檔案的內容填入文字框

配置使用者 ssh key

儲存後。再通過 ssh 協議操作 git 倉庫,將不再需要輸入使用者名稱和密碼。如下所示

免登陸操作 gitlab 倉庫

推送一次提交

首先配置當前倉庫的使用者名稱和使用者郵箱配置

cd redis_util
git config --local user.name "yanggch"
git config --local user.email "yanggch@inspur.com"
複製程式碼

然後在 redis_util 目錄下加入一個 readme.txt,執行下面的命令提交併將更新推送到 gitlab 遠端伺服器

#將新檔案加入到版本管理
git add readme.txt
#提交
git commit -m"第一次提交"
#將當前分支 master 推送到遠端倉庫
git push
#以 master 分支為基礎建立一個新的 dev 本地分支
git checkout -b dev
#將本地倉庫分支推送到遠端倉庫,在遠端倉庫建立對應的 dev 分支
git push --set-upstream origin dev
複製程式碼

到 gitlab 控制檯檢視 redis_util 的狀態。如下圖所示

redis_util 分支狀況

到此,我們就完成了一個公司級別的 gitlab 伺服器的搭建工作。小夥伴們就可以在這個上面流暢的進行開發了。

原文發表在簡書中,原始連結

相關文章