一、倉庫介紹node
倉庫(repository)用來集中管理Docker鏡像,支持鏡像分發和更新。nginx
目前世界上最大最知名的公共倉庫是Docker官方的Docker Hub,國內比較知名的有:Docker Pool、阿里雲倉庫等。git
二、鏡像倉庫github
倉庫下面包含着一組鏡像,鏡像之間用標籤(tag)區分,一個完整的鏡像路徑一般由服務器地址、倉庫名稱和標籤組成,如:docker
registry.hub.docker.com/official/ubuntu:14.04ubuntu
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 #倉庫開發者須要實現查詢功能
三、構建私有倉庫
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端口上傳或下載鏡像
四、構建反向代理
在實際使用中,暴露主機端口是不安全的,通常設計私有倉庫時會加上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