Docker Register部署與基本認證


准備

  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;
     }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM