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

 

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

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

目前Docker Registry已經升級到了v2,最新版的Docker已再也不支持v1。Registry v2使用Go語言編寫,在性能和安全性上作了不少優化,從新設計了鏡像的存儲格式。若是須要安裝registry v2,只需下載registry:2.2便可。Docker官方提供的工具docker-registry能夠用於構建私有的鏡像倉庫。廢話很少說了,下面記錄下Docker私有倉庫構建的過程:linux

選擇一臺服務器(內外網地址: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):nginx

# curl -XGET http://registry_ip:5000/v2/_catalog
# curl -XGET http://registry_ip:5000/v2/image_name/tags/list
相關文章
相關標籤/搜索