Registry 使用Go語(yǔ)言編寫黎泣,在性能和安全性上做了很多優(yōu)化,重新設(shè)計(jì)了鏡像的存儲(chǔ)格式缤谎。
如果需要安裝registry 抒倚,只需下載最新的registry鏡像即可,應(yīng)該說(shuō)此類倉(cāng)庫(kù)搭建只能用于測(cè)試學(xué)習(xí)之用坷澡,不能用于生產(chǎn)環(huán)境托呕。
生產(chǎn)環(huán)境中,請(qǐng)使用 nexus或harbor之類的可以用來(lái)構(gòu)建docker鏡像倉(cāng)庫(kù)軟件频敛!
一项郊、實(shí)驗(yàn)環(huán)境
兩臺(tái)裝有Docker的CentOS7.2虛擬機(jī)
虛擬機(jī)1:192.168.112.132 用作測(cè)試機(jī)
虛擬機(jī)2:192.168.112.136 用作私有倉(cāng)庫(kù)
此處我們準(zhǔn)備了兩個(gè)虛擬機(jī),分別都安裝了Docker斟赚,其中132機(jī)器用作開發(fā)機(jī)着降,136機(jī)器用作registry私有倉(cāng)庫(kù)機(jī)器。環(huán)境準(zhǔn)備好之后接下來(lái)我們就開始搭建私有鏡像倉(cāng)庫(kù)拗军。
二鹊碍、搭建私有倉(cāng)庫(kù)?
首先在136機(jī)器上下載registry鏡像
# docker pull registry
用鏡像啟動(dòng)一個(gè)容器
# docker run -d -p 5000:5000 registry
默認(rèn)情況下厌殉,會(huì)將倉(cāng)庫(kù)存放于容器內(nèi)的/tmp/registry目錄下,這樣如果容器被刪除,則存放于容器中的鏡像也會(huì)丟失侈咕,所以我們一般情況下會(huì)指定本地一個(gè)目錄掛載到容器內(nèi)的/tmp/registry下公罕。
# docker run -d ??-p 5000:5000 ? ?--privileged=true???--restart=always?--name=docker_registry ?-v /opt/data/registry:/tmp/registry ? registry
可以看到我們啟動(dòng)了一個(gè)容器泻肯,地址為:192.168.112.136:5000
相關(guān)參數(shù)說(shuō)明:
-p ? --publish ?端口映射
-v /opt/registry:/tmp/registry ?默認(rèn)情況下侯养,會(huì)將倉(cāng)庫(kù)存放于容器內(nèi)的/tmp/registry目錄下,指定本地目錄掛載到容器?
--privileged=true ?CentOS7中的安全模塊selinux把權(quán)限禁掉了斤富,參數(shù)給容器加特權(quán)熊尉。不加上傳鏡像會(huì)報(bào)權(quán)限錯(cuò)誤(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)錯(cuò)誤
--restart=always ?創(chuàng)建容器罐柳,設(shè)置為隨docker啟動(dòng)
--name ? ?容器名,此處為倉(cāng)庫(kù)名
三狰住、實(shí)驗(yàn)測(cè)試
將一個(gè)本地鏡像push到私有倉(cāng)庫(kù)中,首先在132機(jī)器下pull一個(gè)比較小的鏡像來(lái)測(cè)試(此處使用的是busybox)
# docker pull busybox
給鏡像打tag张吉,tag不加版本號(hào),默認(rèn)是latest
# ?docker tag?busybox??192.168.112.136:5000/busybox
tag 加上特定的版本號(hào)v1
# ?docker tag??busybox????192.168.112.136:5000/busybox:v1?
將打了tag的鏡像上傳到私有倉(cāng)庫(kù)
# docker ?push ? 192.168.112.136:5000/busybox
# docker ?push ?192.168.112.136:5000/busybox:v1?
可以看到push失敗催植,具體錯(cuò)誤如下:
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,然而此處搭建的私有倉(cāng)庫(kù)只提供http服務(wù)创南,所以當(dāng)與私有倉(cāng)庫(kù)交互時(shí)就會(huì)報(bào)上面的錯(cuò)誤伦忠。
為了解決這個(gè)問(wèn)題需要在啟動(dòng)docker server時(shí)增加啟動(dòng)參數(shù)為默認(rèn)使用http訪問(wèn)。
修改docker啟動(dòng)配置文件(此處是修改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"
方法二:
通過(guò)修改daemon配置文件 /etc/docker/daemon.json
# vim ? ?/etc/docker/daemon.json
如果是多個(gè)倉(cāng)庫(kù)
方法三:
修改docker的啟動(dòng)參數(shù)
1. 如果是命令行啟動(dòng)稿辙,添加參數(shù) ? --insecure-registry 192.168.112.136:5000
# dockerd ? --insecure-registry 192.168.112.136:5000
2.如果用systemctl啟動(dòng)昆码,修改服務(wù)的service文件?
# vim ?/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd ?--insecure-registry 192.168.112.136:5000
無(wú)論使用那種方式,要使得配置生效邻储,都需要重啟docker
#?systemctl ?restart docker?
# docker info
重啟完之后我們?cè)俅芜\(yùn)行推送命令赋咽,把本地鏡像推送到私有服務(wù)器上
# docker ?push192.168.112.136:5000/busybox
可以看到鏡像已經(jīng)push到私有倉(cāng)庫(kù)中去了。
我們刪除本地鏡像吨娜,然后從私有倉(cāng)庫(kù)中pull下來(lái)該鏡像脓匿。
# docker ?pull192.168.112.136:5000/busybox
到此就搭建好了Docker私有倉(cāng)庫(kù),上面搭建的倉(cāng)庫(kù)是不需要認(rèn)證的萌壳,我們可以結(jié)合nginx和https實(shí)現(xiàn)認(rèn)證和加密功能。
四日月、參考
Authenticate proxy with nginx
https://docs.docker.com/registry/recipes/nginx
透過(guò) nginx 反向代理docker 私有 registry
http://www.reibang.com/p/265f228a0471
https://blog.csdn.net/wanglei_storage/article/details/51444432