Docker registry ssl認證和訪問控制
一:實驗環境以及需求
實驗環境:兩臺cnetos7.2版本虛擬機器。(資源允許最好準備三臺,一臺做私有倉庫,一臺做上傳映象伺服器,一臺做下載映象伺服器)
虛擬機器1:192.168.1.200
虛擬機器2:192.168.1.201
伺服器防火牆和selinux關閉。hosts根據實際情況做解析,每臺都需要解析。
本實驗hosts解析為:192168.1.201 hub.com
此文件預設在Registry上操作,client上操作時會紅色標記。
二:自建證書CA
要實現ssl認證就需要證書支援,證書最好是服務商提供的證書,比如阿里雲,騰訊雲等等。這裡由於做實驗,使用自建證書。
由 官方文件得知需要實驗ssl認證,只需要.key 和 .crt。
建立.key和.crt
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /docker/cert/ca.key -x509 -days 365 -out /docker/cert/ca.crt
Country Name (2 letter code) [AU]:CN #國家程式碼,中國CN State or Province Name (full name) [Some-State]:Sichuan #省份全拼 Locality Name (eg, city) []:Chengdu #城市 Organization Name (eg, company) [Internet Widgits Pty Ltd]:registry #組織名,公司名 Organizational Unit Name (eg, section) []:CA #部門名稱 Common Name (e.g. server FQDN or YOUR name) []:hub.com #這裡必須填寫Docker Registry使用的域名 Email Address []:[email protected] #電子郵件
三:ssl認證
1:將ca.crt內容放入系統的CA bundle檔案當中,使作業系統信任我們的自簽名證書。然後重啟docker
CentOS 6 / 7中bundle檔案的位置在/etc/pki/tls/certs/ca-bundle.crt
cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt
systemctl restart docker
2:使用Docker Registry的Docker機需要將ca.crt拷貝到 /etc/docker/certs.d/[docker_registry_domain]/ca.crt
mkdir /etc/docker/certs.d/hub.com/ #在client上操作(200)
scp /docker/cert/ca.crt 192.168.1.200:/etc/docker/certs.d/hub.com/
3:Registry端和client端重啟docker。
systemctl restart docker
四:啟動Registry
1:啟動
docker run -d -p 5000:5000 --restart=always --name registry \ -v /registry:/var/lib/registry \ -v `pwd`/cert/:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ registry
解釋:將宿主機的cert/目錄對映到容器中的/certs目錄中。指定registry啟動使用/certs中的證書。`pwd` :當前目錄,也可以使用絕對路徑:/docker/cert/
2:瀏覽器驗證
沒使用證書的時候時走的http,使用證書後走的是https。
3:client端上傳映象驗證(client端)。
docker tag mariadb hub.com:5000/db:2.0 docker push hub.com:5000/db:2.0
五:訪問限制
通過basic authentication 實現簡單的訪問限制。
1:建立使用者名稱和密碼檔案
cd /docker
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd
注:紅色部分需改為你的使用者名稱和密碼
2:使用密碼檔案啟動registry
docker run -d -p 5000:5000 --restart=always --name registry \ -v /registry:/var/lib/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`/cert:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ registry:2
注:如果你registry正在執行,需要關閉。由於加了引數--restart=always,當你關閉registry容器時,會自動重啟registry容器,所以只有使用 docker rm -f registry 強制刪除registry容器。
3:瀏覽器驗證
使用你剛剛建立的使用者和密碼就可以登入了。
4:client驗證(client端)
docker tag mariadb hub.com:5000/db:3.0 docker push hub.com:5000/db:3.0
由於沒有登入剛剛的賬戶,所以沒有許可權上傳。
通過使用者登入
docker login hub.com:5000 docker push hub.com:5000/db3.0
六:總結
1:用引數`pwd`時一定要注意啟動時的目錄是否對應。
2:刪除registry'容器時記得刪除掛載卷,不然上傳的映象還存在。docker stop registry && docker rm -v registry
3:訪問失敗時檢視容器日誌:docker logs registry -f 加上-f 實時檢視。