本文要講的是如何製作項目中自己的鏡像加速器(如果你有牆外的服務器,就不需要我的方案了。直接用國外服務器起registry容器,國內服務器能連到這臺國外服務器就行了),在實際應用過程中,在拉dockerhub鏡像時,因爲存在網絡上被牆的原因,我們無法通過docker pull tomcat這樣的命令直接拉取到鏡像或者拉取的非常慢,這時候就需要用到鏡像加速器了。最簡單的肯定是使用阿里雲和亞馬遜 的鏡像加速地址,放入機器的/etc/docker/daemon.json文件,就像這樣,下面加了阿里雲,科大,道雲等加速器,目前我測試的比較穩定並且不需要登錄獲取的加速器地址是azure加速器地址(https://dockerhub.azk8s.cn):
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com"
]
}
下面正式開始介紹如何製作自己的鏡像加速器,先介紹下我做的,然後再跟大家說下參考的官方地址。
1、配置config.yaml文件
該文件是registry的配置文件,裏面會配置s3存儲和緩存redis等。
version: 0.1
log:
fields:
service: registry
level: info
storage:
cache:
blobdescriptor: redis #緩存使用redis,下面需要配置redis信息,這邊是可以配置內存做緩存的,下面會有地址讓給參考
s3:#存儲配置,我們存儲使用的是minio,你自己部署的時候直接用minio鏡像起個容器就行,以下信息都是Minio提供的。
accesskey: admin #minio登錄賬號和密碼
secretkey: A123456z
region: huadong
regionendpoint: http://10.124.13.127:9000
bucket: mirror-registry
encrypt: false
secure: false
v4auth: true
chunksize: 5242880
rootdirectory: /
delete:
enabled: true
maintenance:
uploadpurging:
enabled: true
age: 168h
interval: 24h
dryrun: false
readonly:
enabled: false
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
redis:
addr: 10.154.12.248:6379 #redis的地址
password: A123456z #redis密碼
db: 0
dialtimeout: 10ms
readtimeout: 10ms
writetimeout: 10ms
pool:
maxidle: 16
maxactive: 64
idletimeout: 300s
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
proxy:
remoteurl: https://dockerhub.azk8s.cn
#這邊可替換成其他加速地址:https://dockerhub.azk8s.cn;https://cduvuqsh.mirror.aliyuncs.com
2、Dockerfile
用於製作我們自己的registry鏡像,基於官方的registry鏡像做的,
FROM registry:latest
LABEL maintainer="fishing_fly <[email protected]>"
COPY entrypoint.sh /entrypoint.sh
COPY config.yml /etc/docker/registry/config.yml
主要拷貝文件entrypoint.sh和registry的配置文件
3、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 "$@"
主要做的一件事是將命令行設置的PROXY_REMOTE_URL寫入config.yaml文件,這個地址是加速器的地址,可以寫入阿里雲或者azure的加速器地址
3、Makefile文件
VERSION ?= v1.0
image:
docker build -t registry-mirror:${VERSION} .
run-azure:
docker run -itd -p 7998:5000 -e PROXY_REMOTE_URL=https://dockerhub.azk8s.cn --restart=always --name registry-mirror-azure registry-mirror:${VERSION}
run-aliyun:
docker run -itd -p 7999:5000 -e PROXY_REMOTE_URL=https://cduvuqsh.mirror.aliyuncs.com --restart=always --name registry-mirror-aliyun registry-mirror:${VERSION}
在運行docker run命令時可以指定代理的加速器地址。你在項目中使用時可以代理多個加速器地址,做高可用。
4、在其他需要拉鏡像的虛擬機上,修改/etc/docker/daemon.json中registry-mirrors配:
{
"registry-mirrors": ["http://10.143.12.120:7998","http://10.143.12.120:7999"]
}
這兩個ip和端口,是我們上面起registry鏡像的地址和端口。docker 本地拉鏡像會按需去第一個地址拉,拉不到的話,去第二個地址拉。
上面這些文件配置好運行一下命令在待部署registry的服務器上運行:
#打鏡像,鏡像公用
make build
make run-azure #起微軟的registry鏡像
make run-aliyun #起阿里雲的registry鏡像
下面說下參考地址:
https://github.com/docker/docker.github.io/blob/master/registry/deploying.md
https://github.com/docker/docker.github.io/blob/v18.03/registry/configuration.md (這裏面會有配置的詳細解釋)