Docker Register部署與基本認證
準備
- 基本事項
- Docker環境
- 登錄授權方式
- 鏡像存放地址
- HTTPS外網訪問
- 啟動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.comssl 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;
}
}
浙公網安備 33010602011771號