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