1、倉庫介紹
倉庫(repository)用來集中管理Docker鏡像,支持鏡像分發和更新。
目前世界上最大最知名的公共倉庫是Docker官方的Docker Hub,國內比較知名的有:Docker Pool、阿里雲倉庫等。
2、鏡像倉庫
倉庫下面包含着一組鏡像,鏡像之間用標簽(tag)區分,一個完整的鏡像路徑通常由服務器地址、倉庫名稱和標簽組成,如:
registry.hub.docker.com/official/ubuntu:14.04
2.1 上傳鏡像
docker push localhost:5000/official/ubuntu:14.04
上述命令是向本地倉庫上傳鏡像,如果不寫倉庫地址默認想docker官方倉庫上傳鏡像,向官方倉庫上傳鏡像需要登錄賬戶,上傳的目標是自己的倉庫。
2.2 下載鏡像
docker pull ubuntu:14.04
不加tag默認下載所有ubuntu倉庫下的官方鏡像。
2.3 查詢鏡像
docker search localhost:5000/ubuntu #倉庫開發者需要實現查詢功能
3、構建私有倉庫
Docker私有服務(private registry)用來建設私有倉庫,部署私有倉庫的優點:
可獨立開發和運維私有倉庫;
節省帶寬資源
有獨立的賬戶管理系統
增加了定制化功能
搭建私有倉庫之前要部署Docker Private Registry,命令如下:
docker run -d --hostname localhost --name registry-v2 \
-v /opt/data/distribution:/var/lib/registry/docker/registry/v2 \
-p 5000:5000 registry:2.0
上面運行一個名為registry-v2的服務,-v把本地目錄mount到容器內的鏡像目錄,方便開發者查看和管理本地鏡像數據。
上傳下載鏡像:
docker push/pull localhost:5000/official/ubuntu:14.04
由於暴露的5000端口,能訪問該主機的用戶都可以通過5000端口上傳或下載鏡像
4、構建反向代理
在實際使用中,暴露主機端口是不安全的,一般設計私有倉庫時會加上https反向代理。
假設私有倉庫的地址:https://my.docker.io,利用opendns組織下的nginx-auth-proxy開源項目實現反向代理功能。
開源項目地址:https://github.com/opendns/nginx-auth-proxy
實現反向代理需要生成服務器的一對密鑰和根證書,利用OpenSSL生成自簽名證書命令如下:
生成私鑰文件server.key:openssl genrsa -out server.key 2048
生成根證書文件server.pem:openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 3650 \
-out server.pem -subj "/C=CN/ST=state/L=city/O=Your Company Name/OU=localhost"
將pem證書轉換成crt證書,放到系統證書目錄(用戶訪問registry之前需要做這一步):
cat server.pem | sudo tee -a /etc/ssl/certs/server.crt
nginx把生成的證書通過Dockerfile加載到鏡像中:
ADD server.crt /etc/ssl/certs/docker-registry
ADD server.key /etc/ssl/private/docker-registry
配置nginx支持ssl功能
ssl;
ssl_certificate /etc/ssl/certs/docker-registry;
ssl_certificate /etc/ssl/private/docker-registry
配置用戶驗證文件
auth_basic_user_file <htpasswd file name>
運行nginx容器,啟動代理功能
docker run -d --hostname my.docker.io --name nginx --link registry:registry -p 443:443 nginx
nginx配置反代到registry
proxy_pass http://registry:5000;
請求頭配置
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization "";
proxy_set_header Accept-Encoding "";
proxy_set_header X-Forwarded-By $Server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
資源訪問配置
不需要鑒權
location /v2/ {
auth_basic off;
proxy_pass http://docker-registry;
}
需要鑒權
location /auth/{
auth_basic "Resticted";
auth_basic_user_file passwd;
proxy_pass http://docker-registry;
}
上傳私有鏡像到registry,必須先登錄
docker login -u <usernam> -p <password> -e <email> my.registry.io
