Docker容器學習梳理 - 私有倉庫Registry使用

散盡浮華發表於2017-03-27

 

但有時候使用Docker Hub這樣的公共倉庫可能不方便,這種情況下使用者可以使用registry建立一個本地倉庫供私人使用,這點跟Maven的管理類似。
使用私有倉庫有許多優點:

1)節省網路頻寬,針對於每個映象不用每個人都去中央倉庫上面去下載,只需要從私有倉庫中下載即可;
2)提供映象資源利用,針對於公司內部使用的映象,推送到本地的私有倉庫中,以供公司內部相關人員使用。

目前Docker Registry已經升級到了v2,最新版的Docker已不再支援v1。Registry v2使用Go語言編寫,在效能和安全性上做了很多優化,重新設計了映象的儲存格式。如果需要安裝registry v2,只需下載registry:2.2即可。Docker官方提供的工具docker-registry可以用於構建私有的映象倉庫。廢話不多說了,下面記錄下Docker私有倉庫構建的過程:

選擇一臺伺服器(內外網地址:192.168.1.23)作為註冊伺服器,用於搭建私有倉庫。(該機器要安裝了Docker環境)
1)從Docker官方倉庫裡下載registry映象
[root@localhost ~]# docker pull registry:2.2
----------------------------------------------------------------
或者:
[root@localhost ~]# docker pull registry
[root@localhost ~]# docker pull registry:2.1.1
----------------------------------------------------------------
下載完之後,可以通過該映象啟動一個容器
[root@localhost ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
tomcat7              latest              97c6a43dd69c        12 minutes ago      562.3 MB
docker.io/registry   2.2                 ad379b517aa6        14 months ago       224.5 MB
        
預設情況下,會將私有倉庫存放於容器內的/tmp/registry目錄下,這樣如果容器被刪除,則存放於容器中的映象也會丟失。
所以一般情況下會指定本地一個目錄掛載到容器內的/tmp/registry下,如下:
[root@localhost ~]# docker run -d --name=my_registry -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry:2.2
9fe45329bda17f61da04e6e8d2faf124fb22665a25270421bb8979a419809446
        
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                    NAMES
d8e98b1068cd        docker.io/registry:2.2   "/bin/registry /etc/d"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   my_registry
        
由上可以看到,已經啟動了一個容器,地址為:192.168.1.23:5000。
        
2)測試
接下來可以把一個本地映象push(如下面的tomcat7映象)到私有倉庫中。
[root@localhost ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
tomcat7              latest              97c6a43dd69c        18 minutes ago      562.3 MB
docker.io/registry   2.2                 ad379b517aa6        14 months ago       224.5 MB
        
修改一下該映象的tag標識。
[root@localhost ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7
     
[root@localhost ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7       //修改了tag後的映象若要刪除,docker rmi後面不能用映象ID了,需要用docker rmi 192.168.1.23:5000/tomcat7:latest
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.23:5000/tomcat7   latest              97c6a43dd69c        18 minutes ago      562.3 MB
tomcat7                     latest              97c6a43dd69c        18 minutes ago      562.3 MB
docker.io/registry          2.2                 ad379b517aa6        14 months ago       224.5 MB
     
接下來把上面修改tag後的映象上傳到私有倉庫。
[root@localhost ~]# docker push 192.168.1.23:5000/tomcat7
The push refers to a repository [192.168.1.23:5000/tomcat7]
unable to ping registry endpoint https://192.168.1.23:5000/v0/
v2 ping attempt failed with error: Get https://192.168.1.23:5000/v2/: http: server gave HTTP response to HTTPS client
v1 ping attempt failed with error: Get https://192.168.1.23:5000/v1/_ping: http: server gave HTTP response to HTTPS client
        
出現上面錯誤的原因分析:
因為Docker從1.3.X之後,與docker registry互動預設使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫互動時就會報上面的錯誤。
為了解決這個問題需要在啟動docker server時增加啟動引數為預設使用http訪問。
需要在docker的配置檔案/etc/sysconfig/docker (ubuntu系統中的docker配置檔案時/etc/default/docker )新增引數“--insecure-registry=192.168.1.23:5000”。
-----------------------------------------------------------------------------------------------------------
溫馨提示:
這個是在客戶機的docker配置檔案裡新增的(即上傳映象到私有倉庫裡或從私有倉庫下載映象的客戶機)。
比如說在A機器上將它的映象上傳到192.168.1.23的私有倉庫上或從該私有倉庫下載映象,那麼就在A機器的本地docker配置檔案中新增。
我這裡測試用的是同一臺機器(centos7),即將序號產生器192.168.1.23本機的映象上傳到它的倉庫內。     [如果是centos6系統,就在other_args選項後面新增。other_args="--graph=/docker --insecure-registry=192.168.1.234:5000"]
-----------------------------------------------------------------------------------------------------------
[root@localhost ~]# vim /etc/sysconfig/docker
.......
OPTIONS='--selinux-enabled --log-driver=journald'
改為
OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry=192.168.1.23:5000'
        
[root@localhost ~]# service docker restart
        
由於docker服務重啟後,所有容器都會被關閉。所以需要在docker重啟後再次啟動容器
[root@localhost ~]# docker start my_registry
my_registry
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                    NAMES
d8e98b1068cd        docker.io/registry:2.2   "/bin/registry /etc/d"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   my_registry
        
再次提交到私有倉庫
[root@localhost ~]# docker push 192.168.1.23:5000/tomcat7
The push refers to a repository [192.168.1.23:5000/tomcat7]
c6d7ce9e90d7: Pushed
34e7b85d83e4: Pushed
latest: digest: sha256:5fdcbaf254cb44dd26645f606cccea8de76118baff03485e40853c691a15956d size: 720
      
上面命令執行無誤後,就表示映象已經push到私有倉庫中去了。
檢視私有倉庫裡的映象(一定要保證下面能檢視到倉庫裡有映象!如果倉庫裡沒有映象,那麼客戶端機器就無法從該私有倉庫下載映象了)
[root@localhost ~]# curl -XGET http://192.168.1.23:5000/v2/_catalog    //即該私有倉庫裡有tomcat7映象  
{"repositories":["tomcat7"]}
[root@localhost ~]# curl -XGET http://192.168.1.23:5000/v2/tomcat7/tags/list
{"name":"tomcat7","tags":["latest"]}
或者瀏覽器裡訪問(103.110.186.23是序號產生器的外網ip,iptables防火牆內開放5000埠訪問):
http://103.110.186.23:5000/v2/_catalog
http://103.110.186.23:5000/v2/tomcat7/tags/list
    
現在可以將本地的tomcat7和192.168.1.23:5000/tomcat7映象都刪除,然後從私有倉庫中下載
[root@localhost ~]# docker rmi tomcat7
[root@localhost ~]# docker rmi 192.168.1.23:5000/tomcat7
    
[root@localhost ~]# docker pull 192.168.1.23:5000/tomcat7
[root@localhost ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.23:5000/tomcat7   latest              5hc8a2ip413w        3 days ago          562.3 MB
    
-----------------------------------------------------------------------------
這樣,也就可以在同一區域網內的其他機器上,從該私有倉庫中pull下來該映象。
比如在192.168.1.17伺服器上拉取該私有倉庫的tomcat映象進行容器建立(注意,要在該機器的/etc/sysconfig/docker配置檔案裡新增--insecure-registry=192.168.1.23:5000引數)
[root@linux-node2 ~]# docker pull 192.168.1.23:5000/tomcat7
      
[root@linux-node2 ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.1.23:5000/tomcat7   latest              2ec9e2eb978a        3 days ago          562.3 MB
      
這樣就搭建了Docker私有倉庫,上面搭建的倉庫是不需要認證的,我們可以結合nginx和https實現認證和加密功能。

注意檢視映象方法(docker pull registry:2.1.1):

# curl -XGET http://registry_ip:5000/v2/_catalog
# curl -XGET http://registry_ip:5000/v2/image_name/tags/list

相關文章