国内从 Docker Hub 拉取镜像有时会遇到困难,一般是网络比较慢,需要很长时间,极有可能连接断裂,拉不到镜像。此时,可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如阿里云、华为云、网易云和道云等等。一般都会去创建或修改 机器的/etc/docker/daemon.json文件:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
这样你的机器就能拉取dockerhub镜像啦。
|但是企业中使用,也是每台机器都去配置这个damon.json文件去拉取dockerhub镜像吗?
要是每台机器都去配置这个加速器,会有以下问题:
所以,本文将推出如何在企业内部部署dockerhub容器镜像加速器服务,功能:
缓存镜像。当节点来该加速器服务拉取镜像时,如果加速器服务中已经有了该镜像,则节点可直接从加速器服务拉取。要是加速器服务没有该镜像,就需要取dockerhub拉取镜像,再返回请求节点。
加快镜像拉取速度,进而加快应用的部署。因为所有节点都去加速器服务拉镜像,而加速器服务只需要去dockerhub拉取一次镜像就可以将镜像返回给所有节点。加速器服务后端有存储,将存储拉过的镜像。
配置redis的用户名和密码,修改redis.conf, 以6.0.3为例
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
tar xzf redis-6.0.3.tar.gz
修改redis.conf文件
requirepass zhounanjun
#bind 127.0.0.1
protected-mode no
保存配置文件
制作redis镜像,redis的Dockerfile(将修改好的redis.conf与Dockerfile放在一个目录):
FROM redis:6.0.3
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
运行:
docker build -t redis:v1.0 .
docker run -p 6379:6379 --name some-redis -d redis:v1.0
registry后端支持S3存储,这边选用minio作为后端存储,MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。Minio介绍
docker run -p 9000:9000 --name minio1 -v /mnt/data:/data -v /mnt/config:/root/.minio -d minio/minio server /data
本地创建好/mnt/data目录
访问minio前端UI:http://公网IP:9000 (阿里云上的主机需要开通9000端口策略)
用户名和密码分别是minioadmin和minioadmin
点击右下角+号创建buckets名为 mirror-registry,如下图所示:
Docker registry是存储docker image的仓库,它在docke生态环境中的位置如下图所示,运行 docker push 、 docker pull 、 docker search 时,实际上是通过docker daemon与docker registry通信, registry除了作为私有仓库外,他还有个缓存模式,开启缓存模式是你只可以从registry拉取镜像而不能推送镜像,这种缓存模式也就可以被用来作镜像加速器的功能。
那么下面就开始来配置registry使它可以作为镜像加速服务:
配置registry的config.yml:
version: 0.1
log:
fields:
service: registry
level: info
storage:
cache:# registry自己需要用到缓存,可以使用内存或者redis,这边使用redis
blobdescriptor: redis
s3: 配置后端存储
accesskey: minioadmin #minio用户名
secretkey: minioadmin #minio密码
region: huadong #自己搭建的Minio就随便填
regionendpoint: http://8.210.20.74:9000 #minio服务地址
bucket: mirror-registry #minio中创建的bucket名字
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: 8.210.20.74:6379 #redis服务
password: zhounanjun #redis密码
db: 0
dialtimeout: 10ms
readtimeout: 10ms
writetimeout: 10ms
pool:
maxidle: 16
maxactive: 64
idletimeout: 300s
health: #配置健康检查,以便进行监控
storagedriver:
enabled: true
interval: 10s
threshold: 3
tcp:
- addr: 8.210.20.74:6379
timeout: 3s
interval: 10s
threshold: 3
制作registry镜像的Dockerfile:
FROM registry:latest
LABEL maintainer="zhounanjun"
COPY entrypoint.sh /entrypoint.sh
COPY config.yml /etc/docker/registry/config.yml
registry需要用到的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 zhounanjun/mirror:${VERSION} .
run-dockerhub:
docker run -itd -p 7669:5000 -e PROXY_REMOTE_URL=https://registry-1.docker.io --restart=always --name registry-mirror zhounanjun/mirror:${VERSION}
上面Makefile中的PROXY_REMOTE_URL环境变量很重要哦,这个url的值就是去拉取dockerhub镜像的地址,你可以配置成阿里云加速器地址,你也可以配置成dockerhub官方地址。要是你没有国外机器,你就写入阿里云镜像加速器地址,我这边写的dokcerhub官方地址,因为我部署在了国外的服务器上,海外服务器拉dockerhub镜像贼快。
在你需要内网环境中的一个节点上部署加速器服务,运行:
make image
make run-dockerhub
然后你在k8s集群中的节点中都做如下配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://192.168.1.1000:7669/"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
然后你的k8s集群就可以正常拉取dockerhub镜像啦,使用镜像加速器服务越频繁,加速效果越明显,因为你的内部加速器会缓存越来越多。
因为vps上的主机有可能会被封掉,所以你可以在阿里云上买一台香港主机,比较稳定,我在阿里云上买了一台轻量级服务器和对象存储Oss。总共花了40元吧。要是企业内部使用,建议去买台阿里云ECS的服务器,注意下带宽啊!好一点的带宽,拉镜像快。
1、创建对象存储,在阿里云oss下创建bucket,如图
2、创建阿里云香港服务器三台企业级服务器,带宽基础能力:25 Gbit/s相当于3G/s。没试过,应该很快。如图
为了顺利使用阿里云的对象存储,你需要在阿里云上创建AccessKey,如何在阿里云创建AccessKey:
使用阿里云的对象存储只需要修改下registry的config.yaml:
version: 0.1
log:
fields:
service: registry
level: info
storage:
cache:# registry自己需要用到缓存,可以使用内存或者redis,这边使用redis
blobdescriptor: redis
oss:
accesskeyid: LTAI4G8T5y8m2TtfwfgD66Kj #自己去控制台创建
accesskeysecret: MPQUxt8O0csgbdfdjZdcAQPIEbVgHFa #自己去控制台创建
region: oss-cn-hangzhou #所属域
bucket: webplus-cn-hangzhou-s-5df099203c3f2876a5b6b344 #bucket名称
delete:
enabled: true
maintenance:
uploadpurging:
enabled: true
age: 168h
interval: 24h
dryrun: false
readonly:
enabled: false
http:
addr: :5000 # registry服务地址
headers:
X-Content-Type-Options: [nosniff]
redis:
addr: 8.210.20.74:6379 #redis服务
password: zhounanjun #redis密码
db: 0
dialtimeout: 10ms
readtimeout: 10ms
writetimeout: 10ms
pool:
maxidle: 16
maxactive: 64
idletimeout: 300s
health: #配置健康检查,以便进行监控
storagedriver:
enabled: true
interval: 10s
threshold: 3
tcp:
- addr: 8.210.20.74:6379
timeout: 3s
interval: 10s
threshold: 3
其他的和上面配置一样,redis还是用容器起就行。
因为阿里云香港服务器自带公网地址,只要能连外网的机器都能连到这台registry服务。
我的需求是:拥有自己的dockerhub镜像加速器,不依赖阿里云等公有云的加速器。
所以,我去找一台海外服务器,部署一套完整的加速器服务(我是去阿里云上部署的,租用阿里云的对象存储),海外节点部署registry的makefile文件中的PROXY_REMOTE_URL参数设置为https://registry-1.docker.io,然后企业内部私有云中机器可能不能连接外网,所以可以找几台内部节点,部署加速器服务,其中makefile的PROXY_REMOTE_URL设置为海外节点registry服务地址,申请开通这几台机器到海外节点的网络策略。其他内部节点只需要配置下damon.json,且registry-mirrors参数指向内部加速节点registry的服务地址即可。当然,若是内部节点可以全开通到海外节点的网络策略,那就连内部加速器服务节点都可以省掉了,但是这样的话,内部节点拉镜像的速度就完全取决于内部节点访问公网的速度了,肯定没有访问内网快啦!
根据我的部署方案去部署,你不需要依赖任何公有云的镜像加速服务,自力更生,实现企业内部自己使用。要是有任何疑问请在评论区评价,我会及时回复的!
欢迎关注本人微信公众号“云原生手记”,我会定时更新哒!
参考文章:
[1]:https://docs.docker.com/registry/recipes/mirror/
[2]: https://docs.docker.com/registry/configuration/