準備
- 基本事項
- 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;
}
}