部署私人Docker Registry

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

安裝部署一個私人的Docker Registry是引入、學習和使用Docker這門技術的必經之路之一。尤其是當Docker被所在組織接受,更多人、項目和產品開始接觸和使用Docker時,儲存和分發自製的Docker image便成了剛需。Docker Registry一如既往的繼承了“Docker坑多”的特點,為此這裡將自己搭建”各類”Registry過程中執行的步驟、遇到的問題記錄下來,為己備忘,為他參考。

Docker在2015年推出了distribution項目,即Docker Registry 2。相比於old registry,Registry 2使用Go實現,在安全性、效能方面均有大幅改進。Registry設計了全新的Rest API,並且在image儲存格式等方面不再相容於old Registry。去年8月份,docker官方hub使用Registriy 2.1替代了原先的old Registry。如果你要與Registry2互動,你的Docker版本至少要是Docker 1.6。

Docker的開發人員也一直在致力於改善Registry安裝和使用的體驗,通過提供官方Registry Image以及Docker Compose工具等來簡化Registry的配置。不過在本文中,我們只是利用Docker以及Registry的官方Image來部署Registry,這樣更便於全面瞭解Registry的部署配置細節。

Registry2在鏡像儲存方面不僅支援本地碟,還支援諸多主流第三方儲存方案。通過分布式儲存系統你還可以實現一個分布式Docker Registry服務。這裡僅以本地碟以及single node registry2為例。

一、環境

這裡還是複用以往文章中的Docker環境:

Docker Registry Server: 10.10.105.71 Ubuntu 14.04 3.16.0-57-generic;docker 1.9.1其他兩個工作Server:10.10.105.72 Ubuntu 14.04 3.19.0-25-generic; docker 1.9.110.10.126.101 Ubuntu 12.04 3.16.7-013607-generic; docker 1.9.1

本次Registry使用當前最新stable版本:Registry 2.3.0。由於鏡像採用本地磁碟儲存,root分區較小,需要映射使用其他volume。

二、初次搭建

本以為Docker Registry的搭建是何其簡單的,甚至簡單到通過一行命令就可以完成的。比如我們在Registry Server上執行:

在~/dockerregistry下,執行:$sudo docker run -d -p 5000:5000 -v `pwd`/data:/var/lib/registry --restart=always --name registry registry:2Unable to find image 'registry:2' locally2: Pulling from library/registryf32095d4ba8a: Pull complete9b607719a62a: Pull complete973de4038269: Pull complete2867140211c1: Pull complete8da16446f5ca: Pull completefd8c38b8b68d: Pull complete136640b01f02: Pull completee039ba1c0008: Pull completec457c689c328: Pull completeDigest: sha256:339d702cf9a4b0aa665269cc36255ee7ce424412d56bee9ad8a247afe8c49ef1Status: Downloaded newer image for registry:2e9088ef901cb00546c59f89defa4625230f4b36b0a44b3713f38ab3d2a5a2b44$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry            2                   c457c689c328        9 days ago          165.7 MB$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMESe9088ef901cb        registry:2          "/bin/registry /etc/d"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   registry

Registry container已經跑起來了,其開機記錄可以通過:docker logs registry查看。

我們在71本地給busybox:latest打一個tag,並嘗試將新tag下的image push到Registry中去:

$ docker tag busybox:latest 10.10.105.71:5000/tonybai/busybox:latest$ docker imagesREPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry                            2                   c457c689c328        9 days ago          165.7 MBbusybox                             latest              65e4158d9625        9 days ago          1.114 MB10.10.105.71:5000/tonybai/busybox   latest              65e4158d9625        9 days ago          1.114 MB... ...

push到Registry中:

$ docker push 10.10.105.71:5000/tonybai/busyboxThe push refers to a repository [10.10.105.71:5000/tonybai/busybox] (len: 1)unable to ping registry endpoint https://10.10.105.71:5000/v0/v2 ping attempt failed with error: Get https://10.10.105.71:5000/v2/: Tunnel or SSL Forbidden v1 ping attempt failed with error: Get https://10.10.105.71:5000/v1/_ping: Tunnel or SSL Forbidden

出錯了!簡單分析了一下,可能是71上docker daemon配置中加了http代理的緣故,導致無法ping通registry endpoint。於是在/etc/default/docker中注釋掉export http_proxy=”xxx”的設定,並重啟docker daemon。

再次嘗試push:

$ docker push 10.10.105.71:5000/tonybai/busyboxThe push refers to a repository [10.10.105.71:5000/tonybai/busybox] (len: 1)unable to ping registry endpoint https://10.10.105.71:5000/v0/v2 ping attempt failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527

雖然還是失敗,但錯誤資訊已有所不同了。這次看來串連是可以建立的,但client端通過https訪問server端,似乎想tls通訊,但這一過程並未完成。

在其他機器上嘗試push image到registry也遇到了同樣的錯誤輸出,如下:

10.10.105.72:$ docker push 10.10.105.71:5000/tonybai/ubuntuThe push refers to a repository [10.10.105.71:5000/tonybai/ubuntu] (len: 1)unable to ping registry endpoint https://10.10.105.71:5000/v0/v2 ping attempt failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527

從錯誤資訊來看,client與Registry互動,預設將採用https訪問,但我們在install Registry時並未配置指定任何tls相關的key和crt檔案,https訪問定然失敗。要想弄清這個問題,只能查看Registry Manual。

三、Insecure Registry

Registry的文檔還是相對詳盡的。在文檔中,我們找到了Insecure Registry,即接收plain http訪問的Registry的配置和使用方法,雖然這不是官方推薦的。

實際上對於我們內部網路而言,Insecure Registry基本能滿足需求,部署過程也避免了secure registry的那些繁瑣步驟,比如製作和部署認證等。

為了搭建一個Insecure Registry,我們需要先清理一下上面已經啟動的Registry容器。

$ docker stop registryregistry$ docker rm registryregistry

修改Registry server上的Docker daemon的配置,為DOCKER_OPTS增加–insecure-registry:

DOCKER_OPTS="--insecure-registry 10.10.105.71:5000 ....

重啟Docker Daemon,啟動Registry容器:

$ sudo service docker restartdocker stop/waitingdocker start/running, process 6712$ sudo docker run -d -p 5000:5000 -v `pwd`/data:/var/lib/registry --restart=always --name registry registry:25966e92fce9c34705050e19368d19574e021a272ede1575385ef35ecf5cea019

嘗試再次Push image:

$ docker push 10.10.105.71:5000/tonybai/busyboxThe push refers to a repository [10.10.105.71:5000/tonybai/busybox] (len: 1)65e4158d9625: Pushed5506dda26018: Pushedlatest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739

這回push ok!

我們將本地的tag做untag處理,再從Registry pull相關image:

$ docker imagesREPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry                            2                   c457c689c328        9 days ago          165.7 MB10.10.105.71:5000/tonybai/busybox   latest              65e4158d9625        9 days ago          1.114 MBbusybox                             latest              65e4158d9625        9 days ago          1.114 MBubuntu                              14.04               6cc0fc2a5ee3        5 weeks ago         187.9 MB$ docker rmi 10.10.105.71:5000/tonybai/busyboxUntagged: 10.10.105.71:5000/tonybai/busybox:latest$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry            2                   c457c689c328        9 days ago          165.7 MBbusybox             latest              65e4158d9625        9 days ago          1.114 MBubuntu              14.04               6cc0fc2a5ee3        5 weeks ago         187.9 MB$ docker pull 10.10.105.71:5000/tonybai/busyboxUsing default tag: latestlatest: Pulling from tonybai/busyboxDigest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892Status: Downloaded newer image for 10.10.105.71:5000/tonybai/busybox:latest$ docker imagesREPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry                            2                   c457c689c328        9 days ago          165.7 MB10.10.105.71:5000/tonybai/busybox   latest              65e4158d9625        9 days ago          1.114 MBbusybox                             latest              65e4158d9625        9 days ago          1.114 MBubuntu                              14.04               6cc0fc2a5ee3        5 weeks ago         187.9 MB

可以看到:Pull過程也很順利。

在Private Registry2中查看或檢索Repository或images,將不能用docker search:

$ docker search 10.10.105.71:5000/tonybai/busybox/Error response from daemon: Unexpected status code 404

但通過v2版本的API,我們可以實現相同目的:

$curl  http://10.10.105.71:5000/v2/_catalog{"repositories":["tonybai/busybox"]}$ curl  http://10.10.105.71:5000/v2/tonybai/busybox/tags/list{"name":"tonybai/busybox","tags":["latest"]}

在其他主機上,我們嘗試pull busybox:

10.10.105.72:$docker pull 10.10.105.71:5000/tonybai/busyboxUsing default tag: latestError response from daemon: unable to ping registry endpoint https://10.10.105.71:5000/v0/v2 ping attempt failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527

我們發現依舊不能pull和push!在Registry手冊中講到,如果採用insecure registry的模式,那麼所有與Registry互動的主機上的Docker Daemon都要配置:–insecure-registry選項。

我們按照上面的配置方法,修改105.72上的/etc/default/docker,重啟Docker daemon,再執行pull/push就會得到正確的結果:

$ sudo vi /etc/default/docker$ sudo service docker restartdocker stop/waitingdocker start/running, process 10614$ docker pull 10.10.105.71:5000/tonybai/busyboxUsing default tag: latestlatest: Pulling from tonybai/busybox5506dda26018: Pull complete65e4158d9625: Pull completeDigest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892Status: Downloaded newer image for 10.10.105.71:5000/tonybai/busybox:latest$ docker imagesREPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZEubuntu                              14.04               36248ae4a9ac        8 days ago          187.9 MB10.10.105.71:5000/tonybai/ubuntu    14.04               36248ae4a9ac        8 days ago          187.9 MB10.10.105.71:5000/tonybai/busybox   latest              65e4158d9625        9 days ago          1.114 MB$ docker push 10.10.105.71:5000/tonybai/ubuntuThe push refers to a repository [10.10.105.71:5000/tonybai/ubuntu] (len: 1)36248ae4a9ac: Pushed8ea5373bf5a6: Pushed2e0188208e83: Pushede3c70beaa378: Pushed14.04: digest: sha256:72e56686cb9fb38438f0fd68fecf02ef592ce2ef7069bbf97802d959d568c5cc size: 6781

四、Secure Registry

Docker官方是推薦你採用Secure Registry的工作模式的,即transport採用tls。這樣我們就需要為Registry配置tls所需的key和crt檔案了。

我們首先清理一下環境,將上面的Insecure Registry停掉並rm掉;將各台主機上Docker Daemon的DOCKER_OPTS配置中的–insecure-registry去掉,並重啟Docker Daemon。

如果你擁有一個網域名稱,網域名稱下主機提供Registry服務,並且你擁有某知名CA簽署的認證檔案,那麼你可以建立起一個Secure Registry。不過我這裡沒有現成的認證,只能使用自簽署的認證。嚴格來講,使用自簽署的認證在Docker官方眼中依舊屬於Insecure,不過這裡只是藉助自簽署的認證來說明一下Secure Registry的部署步驟罷了。

1、製作自簽署認證

如果你有知名CA簽署的認證,那麼這步可直接忽略。

$ openssl req -newkey rsa:2048 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crtGenerating a 2048 bit RSA private key..............+++............................................+++writing new private key to 'certs/domain.key'-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:CNState or Province Name (full name) [Some-State]:LiaoningLocality Name (eg, city) []:shenyangOrganization Name (eg, company) [Internet Widgits Pty Ltd]:fooOrganizational Unit Name (eg, section) []:barCommon Name (e.g. server FQDN or YOUR name) []:mydockerhub.comEmail Address []:bigwhite.cn@gmail.com

2、啟動Secure Registry

啟動帶認證的Registry:

$ docker run -d -p 5000:5000 --restart=always --name registry \  -v `pwd`/data:/var/lib/registry \  -v `pwd`/certs:/certs \  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \  registry:235e8ce77dd455f2bd50854e4581cd52be8a137f4aaea717239b6d676c5ea5777

由於認證的CN是mydockerhub.com,我們需要修改一下/etc/hosts檔案:

10.10.105.71 mydockerhub.com

重新為busybox製作一個tag:

$docker tag busybox:latest mydockerhub.com:5000/tonybai/busybox:latest

Push到Registry:

$ docker push mydockerhub.com:5000/tonybai/busyboxThe push refers to a repository [mydockerhub.com:5000/tonybai/busybox] (len: 1)unable to ping registry endpoint https://mydockerhub.com:5000/v0/v2 ping attempt failed with error: Get https://mydockerhub.com:5000/v2/: x509: certificate signed by unknown authority v1 ping attempt failed with error: Get https://mydockerhub.com:5000/v1/_ping: x509: certificate signed by unknown authority

push失敗了!從錯誤記錄檔來看,docker client認為server傳輸過來的認證的簽署方是一個unknown authority(未知的CA),因此驗證失敗。我們需要讓docker client安裝我們的CA認證:

$ sudo mkdir -p /etc/docker/certs.d/mydockerhub.com:5000$ sudo cp certs/domain.crt /etc/docker/certs.d/mydockerhub.com:5000/ca.crt$ sudo service docker restart //安裝認證後,重啟Docker Daemon

再執行Push,我們看到了成功的輸出日誌。由於data目錄下之前已經被push了tonybai/busybox repository,因此提示“已存在”:

$docker push mydockerhub.com:5000/tonybai/busyboxThe push refers to a repository [mydockerhub.com:5000/tonybai/busybox] (len: 1)65e4158d9625: Image already exists5506dda26018: Image already existslatest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739

3、外部存取Registry

我們換其他機器試試訪問這個secure registry。根據之前的要求,我們照貓畫虎的修改一下hosts檔案,安裝ca.cert,去除–insecure-registry選項,並重啟Docker daemon。之後嘗試從registry pull image:

$ docker pull mydockerhub.com:5000/tonybai/busyboxUsing default tag: latestlatest: Pulling from tonybai/busyboxDigest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892Status: Downloaded newer image for mydockerhub.com:5000/tonybai/busybox:latest$ docker imagesREPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE10.10.105.71:5000/tonybai/ubuntu       14.04               36248ae4a9ac        9 days ago          187.9 MBubuntu                                 14.04               36248ae4a9ac        9 days ago          187.9 MB10.10.105.71:5000/tonybai/busybox      latest              65e4158d9625        9 days ago          1.114 MBmydockerhub.com:5000/tonybai/busybox   latest              65e4158d9625        9 days ago          1.114 MB

這樣來看,如果使用自簽署的認證,那麼所有要與Registry互動的Docker主機都需要安裝mydockerhub.com的ca.crt(domain.crt)。但如果你使用知名CA,這一步也就可以忽略。

五、Registry的鑒權管理

Registry提供了一種基礎的鑒權方式。我們通過下面步驟即可為Registry加上基礎鑒權:

在Register server上,為Registry增加foo使用者,密碼foo123:(之前需要停掉已有的Registry,並刪除之)

//產生鑒權密碼檔案$ mkdir auth$ docker run --entrypoint htpasswd registry:2 -Bbn foo foo123  > auth/htpasswd$ ls authhtpasswd//啟動帶鑒權功能的Registry:$ docker run -d -p 5000:5000 --restart=always --name registry \   -v `pwd`/auth:/auth \   -e "REGISTRY_AUTH=htpasswd" \   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \   -v `pwd`/data:/var/lib/registry \   -v `pwd`/certs:/certs \   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \   registry:2199ad0b3591fb9613b21b1c96f017267f3c39661a7025d30df636c6805e7ab50

在105.72上,我們嘗試push image到Registry:

$ docker push mydockerhub.com:5000/tonybai/busyboxThe push refers to a repository [mydockerhub.com:5000/tonybai/busybox] (len: 1)65e4158d9625: Image push failedHead https://mydockerhub.com:5000/v2/tonybai/busybox/blobs/sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4: no basic auth credentials

錯誤資訊提示:鑒權失敗。

在72上執行docker login:

$docker login mydockerhub.com:5000Username: fooPassword:Email: bigwhite.cn@gmail.comWARNING: login credentials saved in /home/baiming/.docker/config.jsonLogin Succeeded

login成功後,再行Push:

$ docker push mydockerhub.com:5000/tonybai/busyboxThe push refers to a repository [mydockerhub.com:5000/tonybai/busybox] (len: 1)65e4158d9625: Image already exists5506dda26018: Image already existslatest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739

Push ok!

六、Registry中images的管理

前面提到過,通過V2版Rest API可以查詢Repository和images:

$ curl --cacert domain.crt  --basic --user foo:foo123 https://mydockerhub.com:5000/v2/_catalog{"repositories":["tonybai/busybox","tonybai/ubuntu"]}

但如果要刪除Registry中的Repository或某個tag的Image,目前v2還不支援,原因見Registry的roadmap中的說明。

不過如果你的Registry的儲存引擎使用的是本地碟,倒是有一些第三方指令碼可供使用,比如:delete-docker-registry-image。

七、小結

Registry2發布不到1年,目前還有許多問題待解決,就比如delete image的問題,相信在2.4以及後續版本這些問題會被逐個解決掉或能找到一個相對理想的方案。

2016, bigwhite. 著作權.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.