本文要讲的是如何制作项目中自己的镜像加速器(如果你有墙外的服务器,就不需要我的方案了。直接用国外服务器起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 <xxxx@163.com>"
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 (这里面会有配置的详细解释)