基於docker的gitlab部署及遷移
OS:CentOS 6.5 (kernel2.6.32)
背景
伴隨著github的火爆,git作為當前最受歡迎的程式碼管理工具,在現在軟體開發中應用越來越普遍。只要有多人協作共同開發,就能明顯感受到git在程式碼管理上的強大和帶來的便利。作為一個小創業團隊,基於成本上的考量,基本上不會去買付費的程式碼託管服務。雖然國內也有免費的程式碼託管平臺,但是基於安全性考量,還是感覺放在自己的伺服器上會更靠譜一些。gitlab就是一個優秀的開原始碼管理平臺。
在15年的時候,自己就曾經為公司搭建過一次,當時出發點是搭建一整套的持續整合(CI)系統,整體框架是gitlab+gerrit+jenkins。gitlab做程式碼伺服器,gerrit用來做程式碼review,jenkins做自動化測試部署。出發點是很好,,但是後來發現gerrit和jenkins並沒有在公司內部推廣開來,只有gitlab被大家廣泛使用,還是有點小小遺憾。當時搭建一整套的框架,加上自己也算是伺服器小白,有很多東西現學現用,花了我將近一個周的時間。整個系統實在是太多配置選項,以後再也不想搭第二次了。
後來偶然有了一個機會,需要我再搭一套gitlab,這次自己沒有重走以前的老路。通過工作中接觸docker,感覺到了docker在應用部署上的易用性。所以這次就是用了docker來部署新的gitlab服務。
gitlab部署
首先是要安裝docker
yum install docker-io
通過docker –version來確認是否正常安裝。
接下來是用一個開源專案docker-gitlab,docker需要執行三個容器,分別對應的是gitlab主程式,redis和postgresql。依次執行以下命令:
postgresql容器初始化
docker run --name gitlab-postgresql -d \
--env 'DB_NAME=gitlabhq_production' \
--env 'DB_USER=gitlab' --env 'DB_PASS=password' \
--env 'DB_EXTENSION=pg_trgm' \
--volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
sameersbn/postgresql:9.6-2
redis容器初始化
docker run --name gitlab-redis -d \
--volume /srv/docker/gitlab/redis:/var/lib/redis \
sameersbn/redis:latest
gitlab容器初始化
docker run --name gitlab -d \
--link gitlab-postgresql: postgresql --link gitlab-redis:redisio \
--publish 10022:22 --publish 10080:80 \
--env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
--env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
--env 'GITLAB_HOST=example.com' \
--env '[email protected]' \
--env 'SMTP_ENABLED=true' \
--env 'SMTP_DOMAIN=smtp.qq.com' \
--env 'SMTP_HOST=smtp.exmail.qq.com' \
--env 'SMTP_STARTTLS=false' \
--env '[email protected]' \
--env 'SMTP_PASS=password' \
--env 'SMTP_AUTHENTICATION=login' \
--volume /srv/docker/gitlab/gitlab:/home/git/data \
sameersbn/gitlab:10.4.2
這裡可以配置gitlab的域名以及發信郵箱,發信郵箱可以用來做郵件通知以及註冊驗證。
此時通過命令就能看到三個已經啟動的例項了:
#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2216e5cd3328 sameersbn/gitlab:10.4.2 "/sbin/entrypoint.sh 33 minutes ago Up 33 minutes 443/tcp, 0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp gitlab
3ae2606d43c9 sameersbn/redis:latest "/sbin/entrypoint.sh 37 minutes ago Up 37 minutes 6379/tcp gitlab-redis
9c9a265ddd94 sameersbn/postgresql:9.6-2 "/sbin/entrypoint.sh 39 minutes ago Up 39 minutes 5432/tcp gitlab-postgresql
通過訪問http://伺服器ip:10080,就能看到一個gitlab的使用介面了。
gitlab遷移
接下來講一下gitlab的遷移。我們的gitlab服務有時候可能由於某些原因,需要遷移到其他伺服器上,通過docker-gitlab,遷移的成本會變得非常低。
原因在於docker-gitlab做了一個程式和資料的分離,對於docker熟悉的人可能也注意到了,剛才我們啟動命令中,都是和容器共享了一個host上的路徑,分別是
/srv/docker/gitlab/postgresql
/srv/docker/gitlab/redis
/srv/docker/gitlab/gitlab
即資料都是在host上的檔案系統裡。所以當我們要遷移gitlab的時候,只要把服務停掉,然後把/srv/docker/gitlab目錄拷貝到另一臺伺服器的相同路徑下,然後重新做一遍以上的gitlab部署部分的操作即可。同時也可以通過這種方式來做資料備份和gitlab的版本升級。
ps:
在遷移時極大概率會遇到許可權的問題,因為linux有一套自己的使用者許可權管理系統,不同的使用者有各自的使用者id,所在組id。當遷移上面的gitlab檔案時,目標系統上的使用者id和原系統的使用者id很可能不同,這時候就會造成gitlab不能正常讀取檔案的錯誤,頁面可能會顯示”No repository”,這時要將遷移檔案的使用者和使用者組改成gitlab所對應的使用者
chown -R user:user /srv/docker/gitlab
同時需要清理一下快取
docker exec -ti gitlab bash
bundle exec rake cache:clear RAILS_ENV=production