部署企业自己的Docker Hub镜像加速器

部署企业自己的Docker Hub镜像加速器_第1张图片

背景

国内从 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镜像吗?

要是每台机器都去配置这个加速器,会有以下问题:

  • 万一阿里云或者华为云的加速器地址变了,那你每台机器都要改,很麻烦,当然阿里云和华为云是很稳定的,目前没出现这种情况,但这种情况是可能发生的。本人之前用的是微软云的加速器地址(https://dockerhub.azk8s.cn/),现在该加速器地址微软云已经不对外开放了,只供微软云用户使用。所以这种情况还是可能发生的。
  • 要是在k8s部署一个nginx的deployment,副本数是10个,10个pod都分配在不同的节点上,那么就要请求阿里云镜像加速服务10次以拉取nginx镜像,也就是重复拉取了,使得应用部署时间边长。

所以,本文将推出如何在企业内部部署dockerhub容器镜像加速器服务,功能:

  • 缓存镜像。当节点来该加速器服务拉取镜像时,如果加速器服务中已经有了该镜像,则节点可直接从加速器服务拉取。要是加速器服务没有该镜像,就需要取dockerhub拉取镜像,再返回请求节点。

  • 加快镜像拉取速度,进而加快应用的部署。因为所有节点都去加速器服务拉镜像,而加速器服务只需要去dockerhub拉取一次镜像就可以将镜像返回给所有节点。加速器服务后端有存储,将存储拉过的镜像。

部署加速器服务前提条件

  • 1台vps主机(国外机器),可以去https://my.vultr.com/ 或者阿里云上买一台,Vultr上按小时租赁,很便宜,租一台1C1G的就行
  • 1个redis服务
  • 1个S3存储服务
  • 1个docker registry服务: 这是一个docker私有仓库,有官方镜像,直接使用即可。点击这里查看详情

1. 配置redis

配置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

2. 配置minio

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 Hub镜像加速器_第2张图片

3.配置registry

Docker registry是存储docker image的仓库,它在docke生态环境中的位置如下图所示,运行 docker push 、 docker pull 、 docker search 时,实际上是通过docker daemon与docker registry通信, registry除了作为私有仓库外,他还有个缓存模式,开启缓存模式是你只可以从registry拉取镜像而不能推送镜像,这种缓存模式也就可以被用来作镜像加速器的功能。
部署企业自己的Docker Hub镜像加速器_第3张图片

那么下面就开始来配置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镜像贼快。

4.部署加速器

在你需要内网环境中的一个节点上部署加速器服务,运行:

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,如图
部署企业自己的Docker Hub镜像加速器_第4张图片

2、创建阿里云香港服务器三台企业级服务器,带宽基础能力:25 Gbit/s相当于3G/s。没试过,应该很快。如图
部署企业自己的Docker Hub镜像加速器_第5张图片

为了顺利使用阿里云的对象存储,你需要在阿里云上创建AccessKey,如何在阿里云创建AccessKey:

  1. 以主账号登录阿里云管理控制台 。
  2. 将鼠标置于页面右上方的账号图标,单击accesskeys
  3. 安全提示页面,选择获取主账号还是子账号的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服务。

下面介绍下我的部署方案如下:
部署企业自己的Docker Hub镜像加速器_第6张图片

我的需求是:拥有自己的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/

你可能感兴趣的:(docker)