Docker在2015年推出了distribution項目,即Docker Registry 2。相比于old registry,Registry 2使用Go實作,在安全性、性能方面均有大幅改進。Registry設計了全新的Rest API,并且在image存儲格式等方面不再相容于old Registry。去年8月份,docker官方hub使用Registriy 2.1替代了原先的old Registry。如果你要與Registry2互動,你的Docker版本至少要是Docker 1.6。docker-Registry 具有以下優點
1、節省網絡帶寬,針對于每個鏡像不用每個人都去中央倉庫上面去下載下傳,隻需要從私有倉庫中下載下傳即可;
2、提供鏡像資源利用,針對于公司内部使用的鏡像,推送到本地的私有倉庫中,以供公司内部相關人員使用。
環境準備,兩台Centos7 機器
192.168.10.62 docker 版本1.12.6 用作開發機器
192.168.10.61 docker 版本 1.12.6 用作私有倉庫
搭建私有倉庫
下載下傳鏡像
docker pull registry:2.3
啟動鏡像
mkdir –p /opt/data/registry
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry
指定本地一個目錄/opt/data/registry挂載到容器内的/var/lib/registry下
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9819f1221756 registry "/entrypoint.sh /etc/" 3 hours ago Up 36 minutes 0.0.0.0:5000->5000/tcp amazing_khorana
測試
在 192.168.10.62 開發機器上面送出鏡像
從docker hub 上擷取鏡像consul
docker pull consul:1.0.0
更改鏡像tag
docker tag docker.io/consul:1.0.0 192.168.10.61:5000/consul
送出鏡像至私有倉庫
docker push 192.168.10.61:5000/consul
報錯
The push refers to a repository [192.168.10.61:5000/consul]
Get https://192.168.10.61:5000/v1/_ping: http: server gave HTTP response to HTTPS client
因為Docker從1.3.X之後,與docker registry互動預設使用的是https,然而此處搭建的私有倉庫隻提供http服務,是以當與私有倉庫互動時就會報上面的錯誤。為了解決這個問題需要在啟動docker server時增加啟動參數為預設使用http通路。
解決方法:修改docker 啟動配置檔案
CentOS:編輯 /etc/sysconfig/docker 檔案,添加如下行:
other_args="--insecure-registry 192.168.10.61:5000"
重新開機 Docker daemon:
systemctl restart docker
Ubuntu:編輯 /etc/default/docker 檔案,添加如下行
DOCKER_OPTS="--insecure-registry 192.168.10.61:5000"
sudo systemctl restart docker
再次送出
删除本地鏡像
docker rmi 192.168.10.61:5000/consul:latest
從私有倉庫拉取鏡像
docker pull 192.168.10.61:5000/consul
docker 私有倉庫檢視已經送出的鏡像
docker search 192.168.10.61:5000/consul
Error response from daemon: Unexpected status code 404
奇怪從docker 開發機器已經正常送出,在開發機本地删除鏡像,也可以從私有倉庫擷取,為什麼查不到呢
通過各種查詢資料,使用 registry v2 的 api 可以檢視已經送出的docker 鏡像
{"repositories":["busybox","consul","nginx"]}
本文轉自 水滴石川1 51CTO部落格,原文連結:http://blog.51cto.com/sdsca/1974261,如需轉載請自行聯系原作者