Ubuntu 搭建docker registry 私有倉庫


一、為什么要搭建 docker 私有倉庫

原因有幾個:

  1. 項目需要,不希望將項目放到 docker hub 上。
  2. 環境需求,考慮網絡、效率的問題,希望在私有服務器上建立自用的倉庫,提高便利性和訪問速度。
  3. 可以做更多的個性化配置。

 

二、用什么搭建 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
View Code

 

再看一下本地倉庫的鏡像有幾個

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM