Registry 使用Go語言編寫,在性能和安全性上做了很多優(yōu)化,重新設(shè)計(jì)了鏡像的存儲格式。
如果需要安裝registry ,只需下載最新的registry鏡像即可,應(yīng)該說此類倉庫搭建只能用于測試學(xué)習(xí)之用,不能用于生產(chǎn)環(huán)境。
生產(chǎn)環(huán)境中,請使用 nexus或harbor之類的可以用來構(gòu)建docker鏡像倉庫軟件!
一、實(shí)驗(yàn)環(huán)境
兩臺裝有Docker的CentOS7.2虛擬機(jī)
虛擬機(jī)1:192.168.112.132 用作測試機(jī)
虛擬機(jī)2:192.168.112.136 用作私有倉庫
此處我們準(zhǔn)備了兩個虛擬機(jī),分別都安裝了Docker,其中132機(jī)器用作開發(fā)機(jī),136機(jī)器用作registry私有倉庫機(jī)器。環(huán)境準(zhǔn)備好之后接下來我們就開始搭建私有鏡像倉庫。

二、搭建私有倉庫
首先在136機(jī)器上下載registry鏡像
# docker pull registry

用鏡像啟動一個容器
# docker run -d -p 5000:5000 registry
默認(rèn)情況下,會將倉庫存放于容器內(nèi)的/tmp/registry目錄下,這樣如果容器被刪除,則存放于容器中的鏡像也會丟失,所以我們一般情況下會指定本地一個目錄掛載到容器內(nèi)的/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
相關(guān)參數(shù)說明:
-p? --publish? 端口映射
-v /opt/registry:/tmp/registry? 默認(rèn)情況下,會將倉庫存放于容器內(nèi)的/tmp/registry目錄下,指定本地目錄掛載到容器
--privileged=true? CentOS7中的安全模塊selinux把權(quán)限禁掉了,參數(shù)給容器加特權(quán)。不加上傳鏡像會報權(quán)限錯誤(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)錯誤
--restart=always? 創(chuàng)建容器,設(shè)置為隨docker啟動
--name? ? 容器名,此處為倉庫名
三、實(shí)驗(yàn)測試
將一個本地鏡像push到私有倉庫中,首先在132機(jī)器下pull一個比較小的鏡像來測試(此處使用的是busybox)
# docker pull busybox
給鏡像打tag,tag不加版本號,默認(rèn)是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
因?yàn)镈ocker從1.3.X之后,與docker registry交互默認(rèn)使用的是https,然而此處搭建的私有倉庫只提供http服務(wù),所以當(dāng)與私有倉庫交互時就會報上面的錯誤。
為了解決這個問題需要在啟動docker server時增加啟動參數(shù)為默認(rèn)使用http訪問。
修改docker啟動配置文件(此處是修改132機(jī)器的配置)在其中增加"--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的啟動參數(shù)
1. 如果是命令行啟動,添加參數(shù)? --insecure-registry 192.168.112.136:5000
# dockerd? --insecure-registry 192.168.112.136:5000
2.如果用systemctl啟動,修改服務(wù)的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
重啟完之后我們再次運(yùn)行推送命令,把本地鏡像推送到私有服務(wù)器上
# docker? push 192.168.112.136:5000/busybox:v1
可以看到鏡像已經(jīng)push到私有倉庫中去了。
我們刪除本地鏡像,然后從私有倉庫中pull下來該鏡像。
# docker? pull192.168.112.136:5000/busybox
到此就搭建好了Docker私有倉庫,上面搭建的倉庫是不需要認(rèn)證的,我們可以結(jié)合nginx和https實(shí)現(xiàn)認(rèn)證和加密功能。
四、參考
Authenticate proxy with nginx
https://docs.docker.com/registry/recipes/nginx
透過 nginx 反向代理docker 私有 registry
http://www.itdecent.cn/p/265f228a0471
https://blog.csdn.net/wanglei_storage/article/details/51444432