docker搭建gitlab
構想:
通過 docker 容器技術,在centos7系統下,使用docker映象,安裝gitlab,並將gitlab的http,https,ssh埠對映到其他埠;在宿主機中裝入nginx,通過nginx反向代理技術訪問宿主機中的容器;
至於為什麼要這樣折騰嘛。。。(個人看法)
- 不同的服務依賴的環境各有差異
- 當服務需要遷移的時候,很多環境需要重新搭建其實也是挺崩潰的,通過容器技術可以更快的實現遷移
- 不同的服務對宿主機的效能是有損耗的,通過容器可以更好的控制和監管(不會出現一個服務跑掛了一臺機器。。。)
- 服務的依賴實現解耦,(eg:有多個服務依賴同一個nginx,其中一個需要重啟nginx,而導致其他服務中斷)
- 最重要的原因(我想試試....~O(∩_∩)O~)
閒話少說了。。。開始擼。。。(docker的安裝基本操作就不在這裡多說了)有需要的小夥伴可以看下:
1.拉取gitlab映象
1.1.官網找到需要的映象
在官網我們可以找到各種各樣我們需要的映象,通過搜尋可以找到gitlab映象。
1.2.拉取gitlab映象
docker pull gitlab/gitlab-ce
注意:如果沒有指定對應的版本,預設會拉取 latest版本
經過漫長的等待。。。
通過docker images 命令看到gitlab映象證明你已經pull完了
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ce latest 5d8ab6b06918 4 days ago 1.43GB
2.run容器
執行:
docker run --detach --hostname gitlab.xxx.com --publish 444:443 --publish 81:80 --publish 23:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab 5d8ab6b06918
- --hostname :指定容器中繫結的域名,會在建立映象倉庫的時候使用到,這裡繫結gitlab.xxx.com
- --publish:埠對映;容器內的443,80,22埠分別對映到宿主機的444,81,23埠
- --volume :掛載資料卷,對映到容器中去的容器外部儲存空間
- 5d8ab6b06918 :映象的ID
資料儲存地方
當地的位置 | 容器的位置 | 作用 |
---|---|---|
/srv/gitlab/config | /etc/gitlab | 用於儲存GitLab配置檔案 |
/srv/gitlab/logs | /var/log/gitlab | 用於儲存日誌 |
/srv/gitlab/data | /var/opt/gitlab | 用於儲存應用資料 |
通過docker ps 命令看到gitlab容器證明你已經執行成功了
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e12ae220c14 5d8ab6b06918 "/assets/wrapper" 13 minutes ago Up 13 minutes (healthy) 0.0.0.0:23->22/tcp, 0.0.0.0:81->80/tcp, 0.0.0.0:444->443/tcp gitlab
3.配置GitLab
上面的容器使用的是官方Omnibus GitLab軟體包,所有的配置都在唯一的配置檔案 /etc/gitlab/gitlab.rb
當然我們也可以進入容器內部通過shell會話進行相關操作
docker exec -it gitlab /bin/bash
3.1 SMTP Setting
GitLab的使用過程中涉及到大量的郵件,而郵件服務你可以選擇使用Postfix,sendmai,配置SMTP服務其中一種;
Postfix還要安裝其他東西,sendmai又是比較老,相對較下SMTP配置起來會比較方便,我使用的就是SMTP;
1. 編輯/etc/gitlab/gitlab.rb檔案(加到檔案最後面就好了)。本來想用QQ郵箱的,但是怎奈QQ郵箱配置了半天,還是報個535(祕鑰驗證不通過),最後放棄了選擇163
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "XXX@163.com"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = :login
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = "XXX@163.com"
user["git_user_email"] = "XXX@163.com"
說明:
- gitlab_rails['smtp_address'] :SMTP服務地址,不同的服務商不同
- gitlab_rails['smtp_port'] :服務埠
- gitlab_rails['smtp_user_name'] :使用者名稱,自己註冊的
- gitlab_rails['smtp_password'] :客戶端授權祕鑰(獲取方式,下圖講解)
- gitlab_rails['gitlab_email_from'] :發出郵件的使用者,注意跟使用者名稱保持一致
- user["git_user_email"] :發出使用者,注意跟使用者名稱保持一致
獲取郵箱客戶端祕鑰:
2.如上配置完成後可以重新載入gitlab的配置
gitlab-ctl reconfigure
3.測試郵件傳送
gitlab-rails console
Notify.test_email('543314032@qq.com', 'Message Subject', 'Message Body').deliver_now
應該會成功。。。
注意:
其實你在宿主機的 /srv/gitlab/config 目錄的下也能找到gitlab.rb,修改這個檔案也可以;但是修改完成後,必須重啟容器
docker restart gitlab
只要容器重啟Gitlab就會自動重新載入配置;
網上還有很多教程修改的 gitlab的其他配置檔案實現SMTP的配置,我不太建議,因為文件上面要求是在gitlab.rb上修改相關的配置的;其他檔案修改,如果不是很熟悉可能會混亂。。。也可能會出現莫名其妙的問題。。。
如果你選擇的是其他服務商的smtp,具體配置可以看文件
更多的配置可以參考官方文件:
Omnibus GitLab
來到這裡其實你已經可以通過訪問81埠來訪問我們的gitlab了
4.Nginx反向代理
我的nginx是通過rpm安裝的;具體的安裝這裡就不多說了!
開啟nginx的配置檔案
upstream git{
# 域名對應 gitlab配置中的 external_url
# 埠對應 gitlab 配置中的 nginx['listen_port']
server 域名:埠;
}
server{
listen 80;
# 此域名是提供給終端使用者的訪問地址
server_name 域名;
location / {
# 這個大小的設定非常重要,如果 git 版本庫裡面有大檔案,設定的太小,檔案push 會失敗,根據情況調整
client_max_body_size 50m;
proxy_redirect off;
#以下確保 gitlab中專案的 url 是域名而不是 http://git,不可缺少
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 反向代理到 gitlab 內建的 nginx
proxy_pass http://git;
index index.html index.htm;
}
}
5.問題總結
5.1 external_url 設定
external_url 是一個很重要的配置,GitLab的資源(例如:git創庫,檔案,圖片)都是基於這個URL;說白了就是我們clone的地址;
external_url 的預設為:
external_url 'GENERATED_EXTERNAL_URL'
其實就是 http://hostname
可以把這個值改成對應的主機名或者ip地址作為專案的倉庫地址為:
// http
http://<external_url>:<port>/<組名>/<專案名>.git
// ssh
git@<external_url>:<組名>/<專案名>.git
也可以直接將其改成IP
external_url 'http://10.2.237.56'
5.2 修改SSH
如果是ssh埠,需要修改gitlab_shell_ssh_port。
gitlab_rails['gitlab_shell_ssh_port'] = 23
如果要修改 ssh 的域名,就需要修改 gitlab_ssh_host
gitlab_rails['gitlab_ssh_host'] = '10.2.123.123'
5.3 nginx埠
如果你修改了external_url 並加了埠,你會突然發現,gital 的 web 訪問不了了,其實你不用慌張,因為這是因為nginx 預設監聽的是 external_url 的埠
你只需要更改下 nginx 的埠配置就好了
# nginx['listen_port'] = nil
nginx['listen_port'] = 80
以上的配置都是在 gitlab.rb 裡面改的!!!