【Docker Registry】用docker registry 鏡像搭建私有測試倉庫

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 ?push192.168.112.136:5000/busybox

可以看到鏡像已經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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容