一. 背景
作為程序員等缀,像GitHub這種好工具是必須得十分了解的矛渴,但是有時(shí)GitHub并不能滿足我們所有的需求,就如作者所在的公司颅停,我們的代碼都是商業(yè)性的產(chǎn)品沐兵,不可能放到GitHub的開放倉(cāng)庫(kù)中的,而申請(qǐng)GitHub私人倉(cāng)庫(kù)需要錢便监。這就陷入了尷尬的局面扎谎,那有沒(méi)有一種既能具有GitHub一樣的功能,又能保護(hù)隱私免費(fèi)的管理工具呢烧董?答案是肯定的毁靶,感謝程序員偉大的開源精神,我們有了GitLab!!!今天筆者在這里就跟大家分享一下自己使用docker搭建GitLab的過(guò)程吧逊移,這其中踩了一些坑预吆,希望看過(guò)這篇文章的人不用在踩我踩過(guò)的坑了!
二. 環(huán)境介紹
服務(wù)器信息:
CPU : 2
DISK : 30G
RAM : 4G
OS : Linux centos7-0 3.10.0-229.el7.x86_64
這里筆者使用的是自己公司的服務(wù)器胳泉,也可以使用虛擬機(jī)進(jìn)行搭建
三. 搭建過(guò)程
1. 安裝docker
因?yàn)槲覀兪鞘褂胐ocker搭建的拐叉,所以需要先安裝docker,docker支持不同的OS扇商,具體的安裝信息這里不做詳細(xì)介紹凤瘦,可以自己的操作系統(tǒng),參考官方的安裝指南進(jìn)行安裝案铺。http://www.docker.io
2. 安裝GitLab及相關(guān)組件
GitLab需要用到數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)相關(guān)數(shù)據(jù)蔬芥,所以需要在安裝GitLab的同時(shí)安裝數(shù)據(jù)庫(kù),這里使用的是postgresql和redis控汉。我在查找相關(guān)的鏡像笔诵,之后發(fā)現(xiàn)有很多現(xiàn)成的鏡像,這里我使用的sameersbn鏡像姑子。但是有一點(diǎn)我認(rèn)為不是很好的是:這個(gè)鏡像沒(méi)有把redis乎婿、postgresql集成到gitlab的容器里面,需要先單獨(dú)pull這兩個(gè)鏡像run一下街佑,然后再pull gitlab的鏡像進(jìn)行安裝谢翎。
使用如下命令分別拉取最新的鏡像:
docker pull sameersbn/redis
docker pull sameersbn/postgresql
docker pull sameersbn/gitlab
這里有第一個(gè)坑:因?yàn)槲覀兡J(rèn)都是從docker的官方倉(cāng)庫(kù)中拉去鏡像,但是由于國(guó)內(nèi)訪問(wèn)國(guó)外的網(wǎng)站有墻舆乔,而且速度也是十分的慢岳服,所以需要代理剂公。這里推薦Daocloud加速器 https://www.daocloud.io/ 免費(fèi)使用希俩,但是需要先注冊(cè),登錄成功后纲辽,找到加速器執(zhí)行相關(guān)命令即可颜武。筆者親測(cè)速度明顯快很多璃搜!
使用如下命令運(yùn)行postgresql鏡像:
docker run --name postgresql -d \
-e 'DB_NAME=gitlabhq_production' \
-e 'DB_USER=gitlab' \
-e 'DB_PASS=password' \
-e 'DB_EXTENSION=pg_trgm' \
-v /home/root/opt/postgresql/data:/var/lib/postgresql \
sameersbn/postgresql
這里需要解釋的是:
(1). 以上是一條命令,反斜杠是為了在命令內(nèi)換行方便閱讀鳞上,如果不喜歡这吻,也可以寫在一行。
(2). -e
后面跟的都是容器的環(huán)境參數(shù)篙议,都是在制作鏡像的時(shí)候指定好的唾糯,所以不要去改動(dòng)。
(3). -v
后面是添加數(shù)據(jù)卷鬼贱,這樣在容器退出的時(shí)候數(shù)據(jù)就不會(huì)丟失移怯,其中 /home/root/opt/postgresql/data
是作者自己創(chuàng)建的文件夾,讀者可以自己自定義这难,后面的部分是容器內(nèi)的文件路徑舟误,需要保持不變。
(4). 命令執(zhí)行成功之后會(huì)在控制臺(tái)顯示一串容器的編號(hào)姻乓,可以使用命令docker ps
查看剛剛啟動(dòng)的容器嵌溢。
使用如下命令運(yùn)行redis鏡像:
docker run --name redis -d \
-v /home/root/opt/redis/data:/var/lib/redis \
sameersbn/redis
這里跟啟動(dòng)postgresql一樣。
使用如下命令運(yùn)行GitLab鏡像:
docker run --name gitlab -d \
--link postgresql:postgresql --link redis:redisio \
-p 10022:22 -p 10080:80 \
-e 'GITLAB_PORT=10080' \
-e 'GITLAB_SSH_PORT=10022' \
-e 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string'\
-e 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
-e 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string'\
-e 'GITLAB_HOST=服務(wù)器地址' \
-e 'GITLAB_EMAIL=郵箱地址' \
-e 'SMTP_ENABLED=true' \
-e 'SMTP_DOMAIN=www.sina.com' \
-e 'SMTP_HOST=smtp.sina.com' \
-e 'SMTP_STARTTLS=false' \
-e 'SMTP_USER=郵箱地址' \
-e 'SMTP_PASS=郵箱密碼' \
-e 'SMTP_AUTHENTICATION=login' \
-e 'GITLAB_BACKUP_SCHEDULE=daily' \
-e 'GITLAB_BACKUP_TIME=10:30' \
-v /home/root/opt/gitlab/data:/home/git/data \
sameersbn/gitlab
這里需要解釋的是:
(1). 網(wǎng)上又很多教程講關(guān)于使用docker安裝GitLab蹋岩,但是講的不全面赖草,至少我按照他們的方法安裝時(shí)不能正常運(yùn)行,這里是第三個(gè)坑:一定要加上如下環(huán)境參數(shù):
-e 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string'\
-e 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
-e 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string'\
有關(guān)于這三個(gè)環(huán)境參數(shù)的含義:
我個(gè)人的理解是用來(lái)進(jìn)行加密的key剪个。
(2). 上面有關(guān)
SMTP
的環(huán)境參數(shù)是配置郵箱的疚顷,需要填上對(duì)應(yīng)的郵箱信息,我使用的是新浪郵箱禁偎,讀者可以根據(jù)自己的郵箱進(jìn)行填寫腿堤。(3). 使用GitLab需要兩個(gè)端口,一個(gè)是web端口如暖,一個(gè)是SSH端口用于push代碼的所以一下代碼進(jìn)行端口映射和指定:
-p 10022:22 -p 10080:80 \
-e 'GITLAB_PORT=10080' \
-e 'GITLAB_SSH_PORT=10022' \
(4). GitLab有自帶的備份笆檀,這里可以通過(guò)如下進(jìn)行配置:
-e 'GITLAB_BACKUP_SCHEDULE=daily' \
-e 'GITLAB_BACKUP_TIME=10:30' \
指定的是每天10:30進(jìn)行備份。
說(shuō)到這里基本上GitLab就搭建好了盒至,這里還有一個(gè)小坑就是:運(yùn)行這些容器的時(shí)候可以把代碼寫進(jìn)shell腳本中酗洒,然后通過(guò)腳本進(jìn)行運(yùn)行,不然直接在終端打的話很麻煩枷遂。
一下就是筆者安裝完后的截圖樱衷,直接訪問(wèn):http://服務(wù)器地址:10080 即可,首次訪問(wèn)可能會(huì)出現(xiàn)錯(cuò)誤頁(yè)面酒唉,刷新幾下頁(yè)面就可以了然后在修改密碼默認(rèn)用戶名:root 之后就可以正常使用矩桂。
四. 備份
我們可以使用GitLab自帶的備份功能,在啟動(dòng)容器的時(shí)候就進(jìn)行設(shè)置痪伦,然后再使用GitLab的 app:rake gitlab:backup:restore
命令進(jìn)行恢復(fù)侄榴,這里網(wǎng)上的教程都有說(shuō)明可以參考以下網(wǎng)站:
sameersbn的GitHub wiki:
https://github.com/sameersbn/docker-gitlab#automated-backups
這個(gè)是官方的所以比較全面雹锣,里面還有關(guān)于各種環(huán)境參數(shù)的介紹。
這里作者使用的是如下的備份方法:
因?yàn)槲覀冊(cè)谶\(yùn)行postgresql癞蚕、redis和GitLab的時(shí)候都使用了本地的文件夾進(jìn)行了數(shù)據(jù)的持久化蕊爵,而且我們實(shí)際需要備份的數(shù)據(jù)都在本地了,那么其實(shí)就可以直接使用rsync
命令備份本地的這些卷(剛剛的文件夾)即可桦山,無(wú)需再去深入到GitLab內(nèi)部攒射。如果搭建的GitLab崩潰了,或者服務(wù)器崩潰了恒水,直接再使用docker再搭一個(gè)匆篓,在把剛剛的卷跟對(duì)應(yīng)的postgresql、redis和GitLab內(nèi)的數(shù)據(jù)文件夾進(jìn)行映射即可寇窑。這是也不需要修改之前的啟動(dòng)命令鸦概,十分的方便而且作者自己測(cè)試過(guò),發(fā)現(xiàn)能夠達(dá)到要求甩骏,原先的倉(cāng)庫(kù)窗市、用戶的SSH信息等都在。