1. 程式人生 > >基於docker安裝gitlab

基於docker安裝gitlab

 採用docker映象安裝GitLab

3.2.1. 簡介

  • 7.4.3之前版本,映象裡包含所有元件,7.4.3版本映象裡只包含核心元件:nginx、sshd、ruby on rails、sidekiq

3.2.2. 架構圖

docker_gitlab_arch

3.2.3. 下載映象

  • docker pull sameersbn/gitlab:7.4.3 # 下載gitlab映象
  • docker pull sameersbn/mysql:latest # 下載gitlab所用到的mysql映象
  • docker pull sameersbn/redis:latest # 下載gitlab所用到的redis映象

3.2.4. 安裝

3.2.4.1. 啟動redis

  • 命令:
    docker run \
    	--name=gitlab_redis \
    	-tid \
    	sameersbn/redis:latest
    

3.2.4.2. 啟動mysql

  • mkdir -p /opt/gitlab/mysql
  • 命令:
    docker run \
    	--name=gitlab_mysql \
    	-tid \
    	-e 'DB_NAME=gitlabhq_production' \
    	-e 'DB_USER=gitlab' \
    	-e 'DB_PASS=password' \
    	-v /opt/gitlab/mysql:/var/lib/mysql \
    	sameersbn/mysql:latest
    

3.2.4.3. 啟動gitlab

  • mkdir -p /opt/gitlab/data /opt/gitlab/log
  • 命令:
    docker run \
    	--name='gitlab' \
    	-itd \
    	--link gitlab_mysql:mysql \
    	--link gitlab_redis:redisio \
    	-e 'GITLAB_PORT=80' \
    	-e 'GITLAB_SSH_PORT=22' \
    	-e 'GITLAB_HOST=gitlab.example.com' \
    	-v /var/run/docker.sock:/run/docker.sock \
    	-v $(which docker):/bin/docker \
    	-v /opt/gitlab/data:/home/git/data \
    	-v /opt/gitlab/log:/var/log/gitlab \
    	sameersbn/gitlab:7.4.3
    
    
    上述是開啟一個基本gitlab。
    完整(包含LDAP、EMAIL):
    docker run \
    	--name='gitlab' \
    	-itd \
    	--link gitlab_mysql:mysql \
    	--link gitlab_redis:redisio \
    	-e 'GITLAB_PORT=80' \
    	-e 'GITLAB_SSH_PORT=22' \
    	-e 'LDAP_ENABLED=true' \
    	-e 'LDAP_HOST=192.168.1.1' \
    	-e 'LDAP_PORT=389' \
    	-e 'LDAP_UID=sAMAccountName' \
    	-e 'LDAP_METHOD=plain' \
    	-e '
    [email protected]
    ' \ -e 'LDAP_PASS=passwd' \ -e 'LDAP_BASE=OU=example_users,DC=example-family,DC=com' \ -e 'LDAP_ACTIVE_DIRECTORY=true' \ -e 'LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false' \ -e 'GITLAB_HOST=gitlab.example.com' \ -e 'SMTP_ENABLED=true' \ -e 'SMTP_DOMAIN=example.com' \ -e 'SMTP_HOST=192.168.1.2' \ -e 'SMTP_PORT=25' \ -e 'SMTP_STARTTLS=false' \ -v /var/run/docker.sock:/run/docker.sock \ -v $(which docker):/bin/docker \ -v /opt/gitlab/data:/home/git/data \ -v /opt/gitlab/log:/var/log/gitlab \ sameersbn/gitlab:7.4.3

這一步驟會耗時幾分鐘,因為這一步會做一些初始化操作,例如匯入資料表結構等。可以通過docker logs gitlab來檢視安裝過程。同理,mysql、redis容器也可以通過docker logs gitlab_mysql和docker logs gitlab_redis來檢視啟動資訊。

注意:上面建立的3個容器必須位於同一臺宿主上,因為–link gitlab_mysql:mysql –link gitlab_redis:redisio就是將同個宿主上的容器做連結

  • 當然,redis和mysql也支援使用ip+埠,不用–link,帶上環境變數即可,方法是:
    完整:
    docker run \
    	--name='gitlab' \
    	-itd \
    	--net=none \
    	--hostname='gitlab.example.com' \
    	-e 'DB_TYPE=mysql' \
    	-e 'DB_HOST=192.168.3.1' \
    	-e 'DB_PORT=3356' \
    	-e 'DB_NAME=gitlabhq_production' \
    	-e 'DB_USER=gitlab' \
    	-e 'DB_PASS=passwd' \
    	-e 'REDIS_HOST=192.168.3.2' \
    	-e 'REDIS_PORT=6402' \
    	-e 'UNICORN_WORKERS=20' \
    	-e 'GITLAB_PORT=80' \
    	-e 'GITLAB_SSH_PORT=22' \
    	-e 'LDAP_ENABLED=true' \
    	-e 'LDAP_HOST=192.168.3.3' \
    	-e 'LDAP_PORT=389' \
    	-e 'LDAP_UID=sAMAccountName' \
    	-e 'LDAP_METHOD=plain' \
    	-e '[email protected]' \
    	-e 'LDAP_PASS=passwd' \
    	-e 'LDAP_BASE=OU=example_users,DC=example-family,DC=com' \
    	-e 'LDAP_ACTIVE_DIRECTORY=true' \
    	-e 'LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false' \
    	-e 'GITLAB_HOST=gitlab.example.com' \
    	-e 'SMTP_ENABLED=true' \
    	-e 'SMTP_DOMAIN=example.com' \
    	-e 'SMTP_HOST=192.168.3.4' \
    	-e 'SMTP_PORT=25' \
    	-e 'SMTP_STARTTLS=false' \
    	-v /var/run/docker.sock:/run/docker.sock \
    	-v $(which docker):/bin/docker \
    	-v /opt/gitlab/data:/home/git/data \
    	-v /opt/gitlab/log:/var/log/gitlab \
    	sameersbn/gitlab:7.4.3
    
    sameersbn/gitlab:7.4.3不支援redis的任何驗證,只能無密碼使用
    

目前發現sameersbn/gitlab:7.4.3有一個非常坑的地方:容器啟動可能連不上資料庫,是因為容器啟動時會探測資料庫是否可用,而探測的方法是mysqladmin連線DB_HOST的3306埠,而不是DB_PORT指定的埠,已提交issue給作者。

3.2.4.4. 給gitlab容器配置IP

在gitlab容器啟動(docker run)時可以加上-p引數來將容器裡的埠對映到宿主上,但個人比較傾向給容器配置一個獨立IP,因此上述命令沒有采用-p來做埠對映,但是-e ‘GITLAB_PORT=80’ -e ‘GITLAB_SSH_PORT=22’ -e ‘GITLAB_HOST=gitlab.example.com’依然要指定,否則gitlab無法使用

3.2.4.5. 安裝已完成,可以開啟頁面

  • url: gitlab.example.com
    賬戶:root
    密碼:5iveL!fe
    
  • 效果:gitlab_example

3.2.4.6. 加入開機啟動

  • 加入/etc/rc.local
    echo 'docker start gitlab_redis' >> /etc/rc.local
    echo 'docker start gitlab_mysql' >> /etc/rc.local
    echo 'docker start gitlab' >> /etc/rc.local
    echo 'pipework br1 gitlab 192.168.1.1/[email protected]' >> /etc/rc.local
    

4. GitLab API wrappers

  • python:pyapi-gitlab
    基本使用:
    pip install pyapi-gitlab
    import gitlab
    git = gitlab.Gitlab("http://gitlab.example.com", token="EHBLkwhr_WYzn-sXNnNs")		# token即在頁面上Profile settings->Account裡能看到自動生成好的Private token
    git.getusers()
    

其他很多git庫的實現都太底層了,和linux的git命令完全不一樣,一點也不友好。但目前發現這個模組上傳下載程式碼只支援SSH,不支援HTTP,因此我還是更喜歡使用linux git命令

5. GitLab使用的FAQ

5.1. git程式碼釋出支援2種方法:ssh和http(s)

  • ssh:必須新增ssh key才能釋出
  • http:使用使用者名稱、密碼,若接入了LDAP,就是LDAP中的賬戶密碼
  • https:暫未測試過

5.2. 限制git上傳的單個檔案大小

  • 若gitlab是通過sameersbn/gitlab:7.4.3映象建立的,那麼可以通過環境變數NGINX_MAX_UPLOAD_SIZE進行限制

5.3. 通過API進行一些操作例如建立Project,得到成功的響應,但卻沒有立即生效,過了幾秒才生效

  • 由於GitLab為非同步架構,Ruby on Rails收到建立Project請求後將該任務推送到Redis中,但是沒有等待執行完畢,而是直接返回成功。後臺Sidekiq從Redis訂閱任務並實時執行,但由於執行需要時間,而API返回很快,因此會造成這種情況發生。目前沒有其他解決辦法,只能在自己程式邏輯裡sleep幾秒進行重試

5.4. 頁面上”Profile settings->SSH Keys”與”Project Settings裡Deploy Keys”的區別

  • Profile settings->SSH Keys:是使用者全域性的Key,具有對該使用者所有專案倉庫進行上傳下載(push、clone)的許可權
  • Project Settings裡Deploy Keys:針對某個專案,具有下載(clone)的許可權,而不具備上傳(push)的許可權

5.5. gitlab預設時區是UTC

  • sameersbn/gitlab:7.4.3映象無法對時區進行修改,若是手動安裝的gitlab,可以通過修改一個.rb檔案來生效,具體沒有測試過,有需要的可以自行百度搜下。

時區是UTC主要影響的是資料庫裡關於時間欄位的值(created_at、updated_at等),對使用者git倉庫是不影響的,因為git倉庫的建立、程式碼更新都是使用者通過git工具自行操作,因此是使用者自己的時區。

6. GitLab維護

6.1. 資料路徑、日誌路徑

  • 由於gitlab容器在啟動時已將宿主/opt/gitlab/data、/opt/gitlab/log目錄掛載到容器裡,因此可以在宿主上進入這2個目錄中檢視,另外可以通過docker logs檢視。

6.2. 高可用

  • 官方有篇關於GitLab高可用的文章:https://about.gitlab.com/high-availability/
    有1/3都在講述高可用的利弊以及不同程度的高可用帶來的收益及可能引發的更多問題,說的挺有道理的。由於筆者也才剛開始使用GitLab,因此暫不測試多機load balance或failover。
    
  • 2種備份恢復方式
    1. 備份配置、倉庫、資料庫。
    2. 給檔案系統做快照。
    官方認為第二種方法比起第一種更快,因為可以省去人為介入restore的麻煩
    XFS檔案系統支援快照
    
    有2篇文章可以拜讀下:
    http://www.icicletech.com/blog/gitlab-backup-made-easy 資料庫資料備份到本地
    http://doc.gitlab.com/ce/raketasks/backup_restore.html 官方的,和上述其實一樣
    
  • 我的備份方案:
    一. 簡介:每天固定時間備份資料(僅備份MySQL和GitLab倉庫重要檔案,其他不備份)。若資料丟失,需要恢復,則將最近備份的資料用來恢復,會將所有資料,包括本地檔案(倉庫等檔案)、資料庫一同還原回備份時刻。
    
    二. 具體操作:
    	1. 備份:
    docker run \
    	--name='gitlab_backup' \
    	-it \
    	--rm \
    	--link gitlab_mysql:mysql \
    	--link gitlab_redis:redisio \
    	-v /var/run/docker.sock:/run/docker.sock \
    	-v $(which docker):/bin/docker \
    	-v /opt/gitlab/data:/home/git/data \
    	-v /opt/gitlab/log:/var/log/gitlab \
    	sameersbn/gitlab:7.4.3 app:rake gitlab:backup:create
    
    	   過程能在螢幕上看到,備份會自動打成tar包放入/opt/gitlab/data/backups裡。可以自行對該tar包做壓縮,例如gzip 時間戳_gitlab_backup.tar。
    	   若$?=0表示備份成功,然後將生成的檔案使用gzip壓縮為.tar.gz,然後rsync推到儲存上
           通過rsync命令傳到一臺備份儲存上
    	2. 恢復:
    docker run \
    	--name='gitlab_restore' \
    	-it \
    	--rm \
    	--link gitlab_mysql:mysql \
    	--link gitlab_redis:redisio \
    	-v /var/run/docker.sock:/run/docker.sock \
    	-v $(which docker):/bin/docker \
    	-v /opt/gitlab/data:/home/git/data \
    	-v /opt/gitlab/log:/var/log/gitlab \
    	sameersbn/gitlab:7.4.3 app:rake gitlab:backup:restore
    
           螢幕上會將/opt/gitlab/data/backups中的所有檔案和目錄列出來,複製貼上要恢復的tar包檔名,敲入回車即開始恢復。
    	   注意:恢復時會將當前資料庫中的所有表先刪掉再匯入備份tar包的裡sql檔案,因此此步要小心。
    	   
    	   若redis、mysql是使用環境變數帶入gitlab容器的,備份和恢復命令也類似,將啟動gitlab的命令複製過來,修改下--name,新增一個--rm,CMD改為gitlab:backup:create或gitlab:backup:restore即可
    
    三. 注意:
        1. 使用者配置的key(即data/.ssh)是儲存在資料庫裡,在gitlab服務啟動時候會從資料庫里加載並匯入到.ssh裡,被gitlab-shell管理
        2. 由於ssh目錄(儲存著伺服器sshd服務啟動時自己生成的ssh_key)不備份,因此還原時候若這個目錄裡有檔案,則不去重新生成ssh_key,若不存在,則重新生成。若重新生成,使用者使用ssh協議進行git push,會報錯告知不合法的認證
        3. 備份只會備份3個目錄:repositories、db、uploads,然後會額外生成一個backup_information.yml檔案
        4. gitlab-satellites和tmp都是臨時目錄,因此不參與備份
        5. docker run --rm不會影響容器退出狀態的輸出
        6. 還原時候會將資料庫裡的表先DROP表再建立,因為sql檔案在INSERT之前會drop table if exists
        7. 還原時候,若存在要恢復的目錄,則會將原來的目錄mv成.old.時間戳
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(4496) | 評論(2) | 轉發(2) | 給主人留下些什麼吧!~~ 07_avatar_small.jpg

e運維2017-02-22 14:41:43

不錯不錯!

回覆 | 舉報 07_avatar_small.jpg

e運維2017-02-22 14:41:38

不錯不錯!

回覆 | 舉報 評論熱議