Docker registry ssl認證和訪問控制

一:實驗環境以及需求

實驗環境:兩臺cnetos7.2版本虛擬機。(資源容許最好準備三臺,一臺作私有倉庫,一臺作上傳鏡像服務器,一臺作下載鏡像服務器)node

虛擬機1:192.168.1.200 python

虛擬機2:192.168.1.201linux

服務器防火牆和selinux關閉。hosts根據實際狀況作解析,每臺都須要解析。git

本實驗hosts解析爲:192168.1.201 hub.comdocker

此文檔默認在Registry上操做,client上操做時會紅色標記。瀏覽器

二:自建證書CA

要實現ssl認證就須要證書支持,證書最好是服務商提供的證書,好比阿里雲,騰訊雲等等。這裏因爲作實驗,使用自建證書。服務器

官方文檔得知須要實驗ssl認證,只須要.key 和 .crt。

建立.key和.crtdom

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 []:admin@domain.com                                    #電子郵件

三: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上執行
scp  /docker/cert/ca.crt  192.168.1.200:/etc/docker/certs.d/hub.com/  #registry 上執行。

cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt  #client上執行

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/spa

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  實時查看。

相關文章
相關標籤/搜索