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公共鏡像:
總結
- 配置緩存拉取私有鏡像,參見官方文檔:https://docs.docker.com/registry/recipes/mirror/
- remoteUrl當拉取私有鏡像時只能填中心倉庫地址,不能填阿里雲或者微軟加速器的地址。(測試所得結論)
- 使用dockerhub的url,配上username,pwd。(用戶A的密碼)。用戶A能從加速器拉dockerhub私有鏡像。用戶B不能從加速器拉自己的私有鏡像。同時用戶A的私有鏡像會被緩存在加速器本地,而且用戶A的私有鏡像能被所有能連到這個加速器的docker client所獲取,所以我猜測是regsitry直接讀取配置文件中的密碼去dockerhub驗證,驗證完通過後才能拉取對象,這就不管你docker login哪個用戶了,只要能連接加速器地址都能拉取用戶A的私有鏡像:
- 圈出來就是fishingfly用戶的私有鏡像,被存在鏡像加速器裏,下次Pull可以很快被其他機器拉下來