docker搭建私有倉庫v2(Private Registry v2),自簽發證書、公網訪問、登入認證
如果不用自簽發的證書,直接照著官方的步驟做就是了,已經很直白,但是如果需要用自簽發的證書,稍微就比較麻煩,特別在用mac版的docker的時候有點坑,不過最後還是搭建成功了,現來分享下經驗。
假設registry的域名準備用hub.domain.com
(後面出現它的地方均替換為你自己要用的域名),先ssh登入伺服器,執行下面的步驟:
1. 先生成自簽發證書,執行下面的命令:
mkdir -p certs && openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 99999 -out certs/domain.crt
在Common Name那裡輸入域名,其它喜歡怎麼填就怎麼填:
2. 建立使用者名稱密碼:
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd
將testuser
和testpassword
分別替換成你需要的registry登入名和密碼
3. 啟動Registry:
docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/auth: /auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
如果沒有registry映象會自動下載然後啟動,或者可以先執行docker pull registry:2
好了,registry服務端算是搭建好了,但是如果其它客戶端直接docker login hub.domain.com:5000
的話會報錯,比如:x509: certificate signed by unknown authority
下面對其它需要用到registry的docker伺服器或開發機器進行一些操作:
注:如果DNS沒有hub.domain.com
的記錄,就需要在每個docker客戶端所在機器修改hosts檔案,將registry的ip地址對映到hub.domain.com
上
我們還需要讓所有機器信任自簽發的registry,不然登入會報錯。
- 將之前registry伺服器上生成的
certs/domain.crt
複製到當前機器,命名為ca.crt
- 建立資料夾並將
ca.crt
拷進去:
mkdir -p /etc/docker/certs.d/hub.domain.com:5000
cp ca.crt /etc/docker/certs.d/hub.domain.com\:5000/
注:如果是macOS版的docker也是一樣的操作,儘管它連/etc/docker
都不存在,別擔心,照做就是了。另外,macOS的使用者還需要額外執行下面的命令:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crt
OK,接下來可以測試下:
docker login hub.domain.com:5000
輸入登入名和密碼。如果提示Login Succeeded
,恭喜你,大功告成!