一、關於Registry
官方的Docker hub是一個用於管理公共鏡像的好地方,我們可以在上面找到我們想要的鏡像,也可以把我們自己的鏡像推送上去。但是,有時 候,我們的使用場景需要我們擁有一個私有的鏡像倉庫用於管理我們自己的鏡像。這個可以通過開源軟件Registry來達成目的。
Registry在github上有兩份代碼:老代碼庫和新代碼庫。老代碼是采用python編寫的,存在pull和push的性能問題,出到0.9.1版本之后就標志為deprecated,不再繼續開發。從2.0版本開始就到在新代碼庫進行開發,新代碼庫是采用go語言編寫,修改了鏡像id的生成算法、registry上鏡像的保存結構,大大優化了pull和push鏡像的效率。
官方在Docker hub上提供了registry的鏡像(詳情),我們可以直接使用該registry鏡像來構建一個容器,搭建我們自己的私有倉庫服務。
二、安裝Docker私有倉庫
1、下載Docker Registry鏡像
# docker pull registry //下載到的版本默認為 docker.io/registry latest
2、將registry鏡像運行並生成一個容器
說明:Registry服務默認會將上傳的鏡像保存在容器的/var/lib/registry,將主機的/opt/application/registry/images目錄掛載到該目錄,即可實現將鏡像保存到主機的/opt/application/registry/images目錄了。
# docker run -d --name registry01 -v /opt/application/registry/images:/var/lib/registry -p 5000:5000 --restart=always registry:latest
3、測試上傳鏡像到Registry
1)首先將主機的registry鏡像命名為符合倉庫要求registry_url:port/ImageName:tag的格式,可以使用docker tag來標記:
# docker tag xoa_all_production:v1 192.168.0.8:5000/xoa_all_production:v1
2)開始上傳
# docker push 192.168.0.8:5000/xoa_all_production:v1
上面的報錯是因為registry未采用https服務,而客戶端docker使用https請求push所致。
解決方法:docker客戶端將https請求更改為http請求, 將以下配置添加到 /etc/docker/daemon.json 中:
{
"registry-mirrors": ["https://k728i8z5.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.8:5000"]
}
注意: 該配置是配置在docker客戶端,讓docker客戶端以不安全的http請求訪問docker registry,ip以及端口填寫的是提供服務容器的ip以及端口。
修改配置需要重啟Docker服務才能生效,執行命令:systemctl restart docker ,再push即可。
push成功之后,查看本地/opt/application/registry/images目錄下已經有了剛推送上來的registry鏡像,也可以在瀏覽器中輸入http://ip_add:5000/v2/_catalog
至此,我們的Registry私有倉庫搭建完成,如果在今后中要使用,可以使用命令:docker pull 拉取鏡像
三、設置私有倉庫的用戶認證(可選)
私有倉庫搭建以后其他所有客戶端均可以push、pull, docker官方提供認證方法對docker倉庫進行權限保護
1、刪除原啟動的docker registry容器
# docker stop registry01
# docker rm registry01
2、創建存儲用戶密碼的文件
# mkdir /opt/application/registry/auth //可自定義
# docker run --entrypoint htpasswd registry:2.6 -Bbn lisi 123456 > /opt/application/registry/auth/htpasswd
注意:發現使用registry最新的(2.7)的鏡像此條命令會存在問題,可能最新的鏡像有問題,此處使用的是2.6版本的
3、使用原來的鏡像數據運行Registry:
docker run -d -p 5000:5000 --restart=always --name registry01 \ -v /opt/application/registry/images:/var/lib/registry \ -v /opt/application/registry/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry
登錄:docker login -u lisi -p 123456 192.168.0.8:5000
退出:docker logout 192.168.0.8:5000
四、查看Registry中的鏡像及版本