Docker Register部署與基本認證

DukeCheng發表於2017-11-18

準備

  1. 基本事項
  2. Docker環境
  3. 登入授權方式
  4. 映象存放地址
  5. HTTPS外網訪問
  6. 啟動Docker Registry

1. 基本事項

本篇涉及到的資料檔案都放在/data目錄下, 其中會有三個子目錄

/data/auth/ 基本的使用者名稱密碼認證檔案存放地址

/data/certs/ docker registry 映象https訪問射擊到的證書與金鑰的存放地址

/data/registry/ docker registry映象的存放地址, 當push映象到映象伺服器之後,映象就是存放在這裡

2. Docker環境

docker的安裝,全稱參考官網介紹: https://docs.docker.com/engine/installation/linux/docker-ce/debian/#install-docker-ce

3. Registry登入認證

Registry Server的登入認證有多種方式,這裡我們使用常規情況下的一種認證,基本的使用者名稱密碼認證,這種認證方式也跟nginx的基本http認證相同, 使用一個htpasswd檔案來存放認證的使用者名稱跟密碼, 這個檔案的操作是通過htpasswd這個命令來新增與管理使用者密碼的.

如果系統中沒有這個命令,可通過下面命令安裝

apt-get install apache2-utils

通過htpasswd命令生成使用者管理檔案並新增一個使用者
htpasswd -cBb auth/htpasswd <username> <password>

往現有的檔案裡面新增一個使用者
htpasswd -Bb auth/htpasswd <username> <password>

Docker官網文件地址: https://docs.docker.com/registry/deploying/#restricting-access

4. 映象存放地址

通常正式環境我們的映象會儲存在外部,而不是在docker container裡面, 所以我們需要在外部準備一個目錄,在啟動registry映象的時候,通過-v 引數對映到container內部, 此教程裡面的目錄是/data/registry/

5. HTTPS外網訪問

外網訪問必須要用https, 主要是涉及到證書的問題, 通常我們可以使用自簽名證書,

我們分docker register server端跟 docker pull 客戶端兩部分來講

server端不涉及根證書新增到信任區域問題,

client端要訪問自簽名證書的伺服器,必須新增根證書到client的信任區

BUT: 當docker register server需要pull/push映象的時候,就需要把根證書新增到信任區, 這裡有個原則,就是哪裡需要pull/push映象,那臺機器就需要新增根證書

新增自簽名根證書到linux信任區(Debian, 適用於Ubuntu)

這個步驟只需要用到docker pull的機器上做, docker registry server非必須

證書存放區域: /usr/share/ca-certificates/

Copy證書到證書存放地址:

wget http://agilelabs.net/certifications/publicauthorities/agilelabs_root_ca.pem/ –O /usr/share/ca-certificates/agilelabs_root_ca.crt

重新載入新新增的跟證書:

dpkg-reconfigure ca-certificates

選擇YES=>通過”空格”鍵選擇剛新增的根證書=> Tab到底部的OK=>回車選擇

新增新的根證書之後需要重啟Docker,讓 Docker能識別新的證書

service docker restart

6. 啟動Docker Registry

mkdir -p /data/registry \
mkdir -p /data/auth \
mkdir -p /data/certs


docker run -d \
--restart=always \
--name registry \
-v /data/registry:/var/lib/registry \
-v /data/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v /data/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.niusys.com.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/niusys.key \
-p 443:443 \
registry:2

以上算是對這段時間研究Docker以來,搭建Registry的總結。

自簽名證書的部分可以通過 http://agilelabs.net 非常方便的生成與下載.

無論是金鑰還是證書都可以通過右鍵複製連結, 在Linux裡面通過 wget http://agilelabs.net/下載地址 –O 要儲存的檔名

比如下載根證書並儲存到/usr/share/ca-certificates目錄下的agilelabs_root_ca.crt檔案: wget http://agilelabs.net/certifications/publicauthorities/agilelabs_root_ca.pem/ –O /usr/share/ca-certificates/agilelabs_root_ca.crt


補充 1 - 通過NGINX為Docker Registry配置反向代理

我們知道https是使用的443埠,如果Docker Registry的Container埠對映到機器的443埠,那意味著這個機器再沒辦法部署其他https的服務, 在這裡準備通過nginx反向代理Docker Registry,做到443埠的多服務共享, 我在上面的啟動配置裡面把 –p 443:443換成了 –p 4433:443, 下面是nginx的docker registry反向代理配置

upstream internal_docker_registry  {
     server localhost:4433; # registry.renhl.com
}

server {
     listen 443 ssl;
     server_name registry.niusys.com

    ssl on;
     ssl_certificate      /data/certs/registry.niusys.com.crt;
     ssl_certificate_key  /data/certs/niusys.key;
     ssl_session_cache    shared:SSL:10m;
     ssl_session_timeout 5m;
     ssl_protocols    TLSv1.1 TLSv1.2;

    client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads

    # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
     chunked_transfer_encoding on;

    location / {
         proxy_pass https://internal_docker_registry;
         proxy_read_timeout  90;

        proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection $http_connection;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_cache_bypass $http_upgrade;
     }
}

相關文章