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