天天看點

搭建自己的docker registry,非生産環境

版本資訊      ubuntu 16.04

    docker 1.11.2

    registry 2

本地安裝registry 由于docker中registry的latest版本為1.x, 是以我們指定安裝版本2。

  1. docker pull registry:2

通過這個image建立一個 Container

  1. docker run -p 5000:5000 -d --name=local_registry registry:2
  2. docker ps

之後使用docker ps檢視就能看到名為 local_registry的container已經在背景運作了。

 測試registry 從官方下載下傳hello-world image 用以 測試 , 192.168.223.132是本機區域網路IP

  1. docker pull hello-world:latest
  2. docker tag hello-world:latest 127.0.0.1:5000/hello-world
  3. docker tag hello-world:latest 192.168.223.132:5000/hello-world

進入container容器檢視

  1. docker exec -i -t local_registry /bin/sh
  2. 或者
  3. docker exec -i -t local_registry /bin/bash

  這個就看到了我們的上傳的image了, 由于使用registry:2是以在容器中上傳的image存在 /var/lib/registry中,我們将其删除。

然後exit退出容器。 

如果再按照這個位址push, 就會出現錯誤。

  1. docker push 192.168.223.132:5000/hello-world

  這是由于使用https原因,查了很多,都說在/etc/default/docker中修改 DOCKER_OPTS, 然後重新開機docker。 然而這并 沒有什麼卵用

是以,這種方式隻能用于本地主機,不能用在區域網路中。是以,我們采取官方推薦的,用https,自建證書

搭建https regsitry

server 端:

  • 生成自簽名證書
  1. mkdir -p ~/registry/certs && cd ~/registry/certs
  2. openssl req -x509 -days 3650 -subj '/CN=reg.domain.com/' -nodes -newkey rsa:2048 -keyout registry.key -out registry.crt

這個由于ca認證不支援ip位址,是以采用域名,之後在hosts中添加映射就可以了。

  • 添加域名

在 /etc/hosts 添加一行 192.168.1.102 reg.domain.com

  1. vim /etc/hosts
  • 生成使用者名密碼
  1. mkdir -p ~/registry/auth && cd ~/registry/auth
  2. $ docker run --rm --entrypoint htpasswd registry:2 -Bbn testuser password > ./htpasswd

使用registry:2中的 htpasswd 生成使用者名密碼 testuser password 并存到本地。

  • 建立證書目錄
  1. mkdir -p /etc/docker/certs.d/reg.domain.com:5000
  2. cp ~/registry/certs/registry.crt /etc/docker/certs.d/reg.domain.com:5000
  • 啟動registry , 删除之前的 local_registry
  1. docker stop local_registry && docker rm local_registry
  2. $ docker run -d -p 5000:5000 --name=registry --restart=always -v ~/registry/auth:/auth -v ~/registry/certs:/certs -v /data/registry:/var/lib/registry -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key registry:2

如果啟動之後 5000端口沒有監聽,嘗試将-d 放到-p的後面

client 端:

  • 證書相關 

    通過scp将證書copy到本地

  1. sudo mkdir -p /etc/docker/certs.d/reg.domain.com:5000
  2. $ sudo scp -r [email protected].168.223.132:/home/todd/registry/certs/registry.crt /etc/docker/certs.d/reg.domain.com:5000

測試 登入輸入之前設定的 testuser 和 password

  1. docker login reg.domain.com:5000
  2. Username: testuser
  3. Password: password
  4. docker pull hello-world
  5. docker tag hello-world:latest reg.domain.com:5000/hello-world
  6. docker push reg.domain.com:5000/hello-world

繼續閱讀