但有時候使用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