Registry 使用Go語言編寫,在性能和安全性上做了很多優化,重新設計了鏡像的存儲格式。
如果需要安裝registry ,只需下載最新的registry鏡像即可,應該說此類倉庫搭建只能用于測試學習之用,不能用于生產環境。
生產環境中,請使用 nexus或harbor之類的可以用來構建docker鏡像倉庫軟件!
一、實驗環境
兩臺裝有Docker的CentOS7.2虛擬機
虛擬機1:192.168.112.132 用作測試機
虛擬機2:192.168.112.136 用作私有倉庫
此處我們準備了兩個虛擬機,分別都安裝了Docker,其中132機器用作開發機,136機器用作registry私有倉庫機器。環境準備好之后接下來我們就開始搭建私有鏡像倉庫。
二、搭建私有倉庫
首先在136機器上下載registry鏡像
# docker pull registry
用鏡像啟動一個容器
# docker run -d -p 5000:5000 registry
默認情況下,會將倉庫存放于容器內的/tmp/registry目錄下,這樣如果容器被刪除,則存放于容器中的鏡像也會丟失,所以我們一般情況下會指定本地一個目錄掛載到容器內的/tmp/registry下。
# docker run -d? -p 5000:5000? ? --privileged=true? --restart=always --name=docker_registry? -v /opt/data/registry:/tmp/registry? registry
可以看到我們啟動了一個容器,地址為:192.168.112.136:5000
相關參數說明:
-p? --publish? 端口映射
-v /opt/registry:/tmp/registry? 默認情況下,會將倉庫存放于容器內的/tmp/registry目錄下,指定本地目錄掛載到容器
--privileged=true? CentOS7中的安全模塊selinux把權限禁掉了,參數給容器加特權。不加上傳鏡像會報權限錯誤(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)錯誤
--restart=always? 創建容器,設置為隨docker啟動
--name? ? 容器名,此處為倉庫名
三、實驗測試
將一個本地鏡像push到私有倉庫中,首先在132機器下pull一個比較小的鏡像來測試(此處使用的是busybox)
# docker pull busybox
給鏡像打tag,tag不加版本號,默認是latest
#? docker tag busybox? 192.168.112.136:5000/busybox
tag 加上特定的版本號v1
#? docker tag? busybox? ? 192.168.112.136:5000/busybox:v1
將打了tag的鏡像上傳到私有倉庫
# docker? push? 192.168.112.136:5000/busybox
# docker? push? 192.168.112.136:5000/busybox:v1
可以看到push失敗,具體錯誤如下:
Error: Invalid registry endpoint https://192.168.112.136:5000/v1/: Get https://192.168.112.136:5000/v1/_ping: dial tcp 192.168.112.136:5000: connection refused.
If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.112.136:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.112.136:5000/ca.crt
因為Docker從1.3.X之后,與docker registry交互默認使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫交互時就會報上面的錯誤。
為了解決這個問題需要在啟動docker server時增加啟動參數為默認使用http訪問。
修改docker啟動配置文件(此處是修改132機器的配置)在其中增加"--insecure-registry 192.168.112.136:5000"
方法一:
修改Docker配置文件
# vim /etc/default/docker
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 192.168.112.136:5000"
方法二:
通過修改daemon配置文件 /etc/docker/daemon.json
# vim? ? /etc/docker/daemon.json
如果是多個倉庫
方法三:
修改docker的啟動參數
1. 如果是命令行啟動,添加參數? --insecure-registry 192.168.112.136:5000
# dockerd? --insecure-registry 192.168.112.136:5000
2.如果用systemctl啟動,修改服務的service文件
# vim? /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd? --insecure-registry 192.168.112.136:5000
無論使用那種方式,要使得配置生效,都需要重啟docker
# systemctl? restart docker
# docker info
重啟完之后我們再次運行推送命令,把本地鏡像推送到私有服務器上
# docker? push 192.168.112.136:5000/busybox:v1
可以看到鏡像已經push到私有倉庫中去了。
我們刪除本地鏡像,然后從私有倉庫中pull下來該鏡像。
# docker? pull192.168.112.136:5000/busybox
到此就搭建好了Docker私有倉庫,上面搭建的倉庫是不需要認證的,我們可以結合nginx和https實現認證和加密功能。
四、參考
Authenticate proxy with nginx
https://docs.docker.com/registry/recipes/nginx
透過 nginx 反向代理docker 私有 registry
http://www.lxweimin.com/p/265f228a0471
https://blog.csdn.net/wanglei_storage/article/details/51444432