搭建自己的 Docker Mirror

在国内从 Docker Hub 上 pull 镜像的时候实在是蛋疼,虽然国内中科大已经有 Docker 的 Mirror 了,但是公司的网最近实在是太慢了,于是我就在内网整了一台 Docker Hub 的 Mirror。

弄好之后,那速度爽的我不要不要的。

服务端

  1. 安装 Docker

    Linux 下安装 Docker 非常方便,一条命令就搞定:

    1
    $ curl https://get.docker.com | sh
  2. 制作证书

    Docker 自从1.6版本开始,API 都是 https 协议,所以需要申请一张证书。如果你有在 CA 申请证书,可以跳过第2步。我是自签名的证书,后面会麻烦一些。

    在终端依次执行下面 3 条命令,注意第一条是你自己要设置的域名,反正在内网用,随便写,到时改一下 hosts 文件就行了。

    1
    2
    3
    4
    5
    $ signdomain=hub.evalbug.com

    $ openssl req -nodes -subj "/C=CN/ST=Xian/L=Gaoxin/CN=$signdomain" -newkey rsa:4096 -keyout $signdomain.key -out $signdomain.csr

    $ openssl x509 -req -days 3650 -in $signdomain.csr -signkey $signdomain.key -out $signdomain.crt

    执行完这 3 条命令之后,就会在当前目录下生成三个文件,我们关注下面这两个文件:hub.evalbug.com.crt 是服务器证书,hub.evalbug.com.key 是服务器私钥。

    如果你是在 CA 申请的,也会有这两个东西。

    然后我们把这证书和私钥统一放在 /root/certs/ 目录下。

  3. 创建仓库存储的目录

    1
    mkdir /opt/registry
  4. 创建一个 Registry 容器

    1
    2
    $ signdomain=hub.evalbug.com
    $ docker run -d -p 443:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/$signdomain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/$signdomain.key registry:2

    这里需要注意使用的 tag 是 2。

    容器启动成功后,进入容器 bash 下:

    1
    $ docker exec -it registry /bin/bash

    然后执行:

    1
    2
    $ echo "proxy:" >> /etc/docker/registry/config.yml
    $ echo " remoteurl: https://docker.mirrors.ustc.edu.cn" >> /etc/docker/registry/config.yml

    有人说这个可以通过创建容器的时候,
    加上 MIRROR_SOURCE=https://docker.mirrors.ustc.edu.cn
    MIRROR_SOURCE_INDEX=https://index.docker.io
    这两个环境变量来实现,但经过实测后发现并不能。

    接着退出 bash ,重启 registry 容器。

    1
    docker restart registry

    这里的 registry 是我们在 docker run 的时候加了 --name,取了一个别名。

    至此,Server 端就搞定了。

客户端

  1. 安装 Docker, 过程不再多说,不过要注意版本不要太低

  2. 先设置域名解析。

    1
    $ echo "192.168.1.101 hub.evalbug.com" >> /etc/hosts

    如果自己有域名,可以在域名提供商那设置解析,如果域名是自己随便写的,就在 hosts 里面加上解析。

  3. 信任证书

    如果是在 CA 申请的证书,可以跳过此步

    因为我们是自己签名、颁发的证书,肯定不是受信的,不过在内网中,完全够用了。信任证书也分两种方式,让 docker 信任证书和让操作系统信任证书,两种都可以。

    让 Docker 信任证书

    1
    2
    3
    $ DOMAIN_NAME=hub.evalbug.com
    $ mkdir -p /etc/docker/certs.d/$DOMAIN_NAME
    $ openssl s_client -connect $DOMAIN_NAME:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /etc/docker/certs.d/$DOMAIN_NAME/ca.crt

    其实就是把证书拷到 /etc/docker/certs.d/域名/ 目录下。

    让操作系统信任证书

    • debian、ubuntu 下
    1
    2
    3
    $ DOMAIN_NAME=hub.evalbug.com
    $ openssl s_client -connect $DOMAIN_NAME:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /usr/local/share/ca-certificates/$DOMAIN_NAME.crt
    $ sudo update-ca-certificates
    • readhat 下
    1
    2
    3
    $ DOMAIN_NAME=hub.evalbug.com
    $ openssl s_client -connect $DOMAIN_NAME:443 -showcerts </dev/null 2>/dev/null | openssl x509 -outform PEM | sudo tee /etc/pki/ca-trust/source/anchors/$DOMAIN_NAME.crt
    $ sudo update-ca-trust
  4. 配置 Docker Mirrors

    1
    $ vi /etc/docker/daemon.json

    然后输入如下内容:

    1
    2
    3
    {
    "registry-mirrors": ["https://hub.evalbug.com"]
    }
  5. 重启 Docker

    1
    $ service docker restart

    1
    $ systemctl restart docker.service
  6. 测试

    随便拉取一个镜像试试

    1
    $ docker pull ubuntu:14.04

    第一次可能会慢一些,因为服务器上没缓存,拉取完毕后,把客户端的 images 删除,然后重新拉取一下,就能感受到速度了。