registry拉取dockerhub私有鏡像

registry拉取dockerhub私有鏡像

準備階段

目標是製作registry可用於加速dockerhub私有鏡像的加速器。

需要準備的工具:

1、registry鏡像,最新的就行

2、兩臺可通信的虛擬機(pc機就行)

測試項:

1、是否可以正常拉取dockerhub私有鏡像

2、私有鏡像保存在這樣的倉庫中是否安全(其他用戶是否也可以不經過認證獲取到私有鏡像)

基於以上的情況,開始搭建測試環境:

config.yml配置文件:

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://registry-1.docker.io
  username: ##填你Dockerhub的賬號##
  password: ##填你自己dockerhub密碼,沒有就去註冊一個##

Dockerfile

FROM registry:latest
LABEL maintainer="zhounanjun <[email protected]>"
COPY entrypoint.sh /entrypoint.sh
COPY config.yml /etc/docker/registry/config.yml

entrypoint.sh

#!/bin/sh
​
set -e
​
CONFIG_YML=/etc/docker/registry/config.yml
​
if [ -n "$PROXY_REMOTE_URL" -a `grep -c "$PROXY_REMOTE_URL" $CONFIG_YML` -eq 0 ]; then
    echo "proxy:" >> $CONFIG_YML
    echo "  remoteurl: $PROXY_REMOTE_URL" >> $CONFIG_YML
    echo "------ Enabled proxy to remote: $PROXY_REMOTE_URL ------"
elif [ $DELETE_ENABLED = true -a `grep -c "delete:" $CONFIG_YML` -eq 0 ]; then
    sed -i '/rootdirectory/a\  delete:' $CONFIG_YML
    sed -i '/delete/a\    enabled: true' $CONFIG_YML
    echo "------ Enabled local storage delete -----"
fi
case "$1" in
    *.yaml|*.yml) set -- registry serve "$@" ;;
    serve|garbage-collect|help|-*) set -- registry "$@" ;;
esac
​
exec "$@"
​

Makefile

VERSION ?= v1.0
​
image:
        docker build -t ecloud-cis/registry-mirror:${VERSION} .
run-test-registry:
        docker run -itd -p 7990:5000 -e PROXY_REMOTE_URL=https://registry-1.docker.io  --restart=always  --name registry-mirror-test-2 ecloud-cis/registry-mirror:${VERSION}
​

搭建測試環境

在你準備上面這些文件時,你就運行以下命令:

make image
make run-test-registry

就可以運行期一個用於緩存的registry

docker ps 看下運行起的容器:

在這裏插入圖片描述

docker logs -f registry-mirror-test-2 //查看剛起的regsitry的日誌

看到如下listen:5000字樣,那就是啓動成功了

在這裏插入圖片描述

到測試機上更改daemon.json,daemon.json文件一般在/etc/docker下,要是沒有就新建一個

改成如下:裏面的地址是你起的registry加速器的地址,

{
        "registry-mirrors": ["http://10.154.12.120:7990"]
}

運行: systemctl daemon-reload

systemctl restart docker

systemctl status docker 看下Dockers的狀態是不是running

然後運行docker system info //看下docker的信息:

Containers: 5
 Running: 4
 Paused: 0
 Stopped: 1
Images: 18
Server Version: 18.09.5
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.14.78-300.el7.bclinux.x86_64
Operating System: BigCloud Enterprise Linux For LDK 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 30.91GiB
Name: WXJD-PSC-T-VM-CIS-2
ID: APXY:N3RV:QXW7:5MIV:PJGH:VDHQ:CRRG:4FTK:CGGC:26PY:UUP4:2BHN
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: turningfish
Registry: https://index.docker.io/v1/ ####要是加速器地址拉不到鏡像,就直接去dockerhub官方鏡像
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 http://10.154.12.120:7990/   ####這裏是加速器地址,要是加速器地址拉不到鏡像它會自動去上面的registry拉鏡像
Live Restore Enabled: false
Product License: Community Engine

開始測試

上面順利部署完之後,開始測試:

docker pull fishingflt/private2:v1 //這是我的私有鏡像,你需要拉你的,拉我的你是拉不下來的

配置可以拉取私有鏡像的registry參考文章:https://docs.docker.com/registry/recipes/mirror/

如果remoteurl配置的是阿里雲或者azure的加速地址,那麼配置上去的username,password會被送去阿里雲和微軟雲認證。因爲賬號和密碼是Dockerhub的,所以認證失敗,你也拉不到你想要的鏡像。

在這裏插入圖片描述

將remoteurl改爲https://registry-1.docker.io後,即可正常拉取對象
在這裏插入圖片描述

看見沒,我們其實在拉取私有鏡像fishingfly/private2:v1時沒有要求我們去登錄dockerhub。因爲這一步是由registry幫你去做的,registry配置了dockerhub的用戶名和密碼,每次拉取私有鏡像時,registry會用配置好的用戶名和密碼進行登錄然後拉取私有鏡像。所以只要知道registry鏡像加速器地址的機器都能拉取fishingfly這個用戶的私有鏡像,這樣是不安全的。

順便測試下能不能正常拉取Dockerhub公共鏡像:

在這裏插入圖片描述

總結

  1. 配置緩存拉取私有鏡像,參見官方文檔:https://docs.docker.com/registry/recipes/mirror/
  2. remoteUrl當拉取私有鏡像時只能填中心倉庫地址,不能填阿里雲或者微軟加速器的地址。(測試所得結論)
  3. 使用dockerhub的url,配上username,pwd。(用戶A的密碼)。用戶A能從加速器拉dockerhub私有鏡像。用戶B不能從加速器拉自己的私有鏡像。同時用戶A的私有鏡像會被緩存在加速器本地,而且用戶A的私有鏡像能被所有能連到這個加速器的docker client所獲取,所以我猜測是regsitry直接讀取配置文件中的密碼去dockerhub驗證,驗證完通過後才能拉取對象,這就不管你docker login哪個用戶了,只要能連接加速器地址都能拉取用戶A的私有鏡像:
    在這裏插入圖片描述
  4. 圈出來就是fishingfly用戶的私有鏡像,被存在鏡像加速器裏,下次Pull可以很快被其他機器拉下來
發佈了159 篇原創文章 · 獲贊 141 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章