一、為什么要搭建 docker 私有倉庫
原因有幾個:
- 項目需要,不希望將項目放到 docker hub 上。
- 環境需求,考慮網絡、效率的問題,希望在私有服務器上建立自用的倉庫,提高便利性和訪問速度。
- 可以做更多的個性化配置。
二、用什么搭建 docker 私有倉庫
docker 官方提供了 registry 的鏡像,可以使用它來建私有倉庫。
三、搭建過程
環境介紹
系統 | IP | 角色 |
ubuntu-16.04.5-server-amd64 | 192.168.91.129 | docker 客戶端服務器 |
ubuntu-16.04.5-server-amd64 | 192.168.91.131 | docker 倉庫服務器 |
安裝docker
2台服務器,都安裝docker
apt-get install -y docker.io
配置阿里雲docker加速器
2台服務器都 編輯配置文件
vim /etc/docker/daemon.json
內容如下:
{ "registry-mirrors": [ "https://kv3qfp85.mirror.aliyuncs.com" ] }
2台服務器都 重啟docker服務
systemctl restart docker
拉取registry倉庫docker鏡像
在131服務器 拉取鏡像
docker pull registry
默認會拉取最新版本,訪問以下鏈接:
https://hub.docker.com/_/registry/
版本應該是2.6.2
創建registry docker進程
docker run -d --name docker-registry --restart=always -p 5000:5000 registry
參加解釋:
-d 后台運行
--name 鏡像名稱起別名
--restart=always 在容器退出時總是重啟容器,注意:在生產環境中,要啟用這個參數
-p 映射端口,規則是, 真實機端口:容器端口
四、測試上傳鏡像
下載測試鏡像
登錄到129服務器,下載一個鏡像,比如alpine
docker pull alpine
將alpine鏡像重命名為本地鏡像格式與本地registry相匹配。
鏡像名稱由registry和tag兩部分組成,registry完整格式:[registry_ip]:[registry:port]/[user]/[image_name:version]
docker tag alpine 192.168.91.131:5000/alpine
上傳測試鏡像
docker push 192.168.91.131:5000/alpine
輸出:
The push refers to a repository [192.168.91.131:5000/alpine] Get https://192.168.91.131:5000/v1/_ping: http: server gave HTTP response to HTTPS client
因為Docker從1.3.X之后,與docker registry交互默認使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫交互時就會報上面的錯誤。
解決https錯誤
關於解決https錯誤,眾說紛紜。什么修改/etc/default/docker,修改/etc/init/docker.conf,修改/lib/systemd/system/docker.service...
我測試了一下,貌似沒有成功!
下面說能成功的方法。
修改daemon.json
注意:2台服務器都需要修改!
vim /etc/docker/daemon.json
增加 insecure-registries,完整內容如下:
{ "registry-mirrors": [ "https://kv3qfp85.mirror.aliyuncs.com" ], "insecure-registries": [ "192.168.91.131:5000" ] }
insecure-registries 是一個列表,你可以增加多個。
重啟docker服務
systemctl restart docker
再次執行
root@jqb-node129:~# docker push 192.168.91.131:5000/alpine The push refers to a repository [192.168.91.131:5000/alpine] df64d3292fd6: Pushed latest: digest: sha256:b6459ba7992adb5d76a7962e84909e1b3aaf029fbd8cb94131e8cbe464b6cd04 size: 528
登錄到131服務器,查看鏡像
注意:私有倉庫中的鏡像不是直接docker images查看的,而是訪問url
比如:
curl -XGET http://registry地址:5000/v2/_catalog curl -XGET http://registry地址:5000/v2/鏡像名/tags/list
先執行第一個,查看現有的鏡像
root@jqb-node129:~# curl -XGET http://192.168.91.131:5000/v2/_catalog {"repositories":["alpine"]}
查看alpine鏡像的信息
root@jqb-node129:~# curl -XGET http://192.168.91.131:5000/v2/alpine/tags/list {"name":"alpine","tags":["latest"]}
docker 官方的 registry 倉庫,默認是不支持從其他客戶端拉取服務器倉庫的鏡像文件的,不過簡單的辦法,就是設置insecure-registry 參數。
五、鏡像刪除
官方提供了刪除鏡像的API
DELETE /v2/<name>/manifests/<reference>
name:鏡像名稱
reference: 鏡像對應sha256值
重點是:鏡像對應sha256值,計算非常麻煩。
所以這里使用第三方插件來刪除
第三方插件刪除
插件github上的位置:
https://github.com/burnettk/delete-docker-registry-image
下載資源
curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
設置權限
chmod a+x /usr/local/bin/delete_docker_registry_image
設置相關環境變量
先來搜索registry
root@jqb-node131:~# find / -name registry /usr/share/vim/registry /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry /var/lib/docker/aufs/diff/d4f4fd0107a55fa3b608a4ff9b13a94b2246b0eb212714b8b61bf8e383a062e8/var/lib/registry /var/lib/docker/aufs/diff/bc0dbcfaf524ebed6a9957d3b7e81847f0f3eb3caee1936035f61bf734e82636/etc/docker/registry /var/lib/docker/aufs/diff/693c5a102cda676001a36d96b988a3967734123d788df90ffd5d90af43dfcff2/bin/registry /var/lib/docker/aufs/diff/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/var/lib/registry /var/lib/docker/aufs/mnt/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/var/lib/registry /var/lib/docker/aufs/mnt/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/etc/docker/registry /var/lib/docker/aufs/mnt/d60ed6fa449324e4075ae7bbff41b31c36a80c4e5a5fa8fabbc4e07436ee8bf6/bin/registry /var/lib/ucf/registry
從上面搜索結果中,有很多。這么多目錄,那一個才是真正的呢?
末尾帶有_data/docker/registry才是真正的存儲目錄
查看這個目錄,進一步查看v2/repositories
root@jqb-node131:~# ll /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/repositories/ total 12 drwxr-xr-x 3 root root 4096 Nov 12 15:46 ./ drwxr-xr-x 4 root root 4096 Nov 12 15:46 ../ drwxr-xr-x 5 root root 4096 Nov 12 15:46 alpine/
就可以發現 alpine了,就是客戶端上傳的鏡像。
設置環境變量,注意:要去掉上面路徑中末尾的repositories
export REGISTRY_DATA_DIR=/var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/
直接刪除鏡像
先來查看一下鏡像列表
root@jqb-node131:~# curl http://192.168.91.131:5000/v2/_catalog {"repositories":["alpine"]}
再查看alpine的tag
root@jqb-node131:~# curl http://192.168.91.131:5000/v2/alpine/tags/list {"name":"alpine","tags":["latest"]}
之后就可以直接刪除:
語法:
delete_docker_registry_image --image 鏡像名:版本
例如:
root@jqb-node131:~# delete_docker_registry_image --image alpine:latest
輸出如下:

INFO [2018-11-12 16:22:09,413] Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/blobs/sha256/b6/b6459ba7992adb5d76a7962e84909e1b3aaf029fbd8cb94131e8cbe464b6cd04 INFO [2018-11-12 16:22:09,418] Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/blobs/sha256/19/196d12cf6ab19273823e700516e98eb1910b03b17840f9d5509f03858484d321 INFO [2018-11-12 16:22:09,419] Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/blobs/sha256/2b/2bc1c5ee86055a39979b389170e9638262b2e11e1761403e5e0321101f96b427 INFO [2018-11-12 16:22:09,421] Deleting /var/lib/docker/volumes/518c02aa36ce326f1dcc5cc397d21f621b28e690b864ca3d36e474a4d657ea13/_data/docker/registry/v2/repositories/alpine
再看一下本地倉庫的鏡像有幾個
root@jqb-node131:~# curl http://192.168.91.131:5000/v2/_catalog {"repositories":[]}
發現已經為空了!
本文參考鏈接:
http://blog.51cto.com/wangpengtai/2093613
https://blog.csdn.net/tototuzuoquan/article/details/82025954