最近 Docker 玩得比较多,以前玩得少的时候没什么感觉,但是当一次性 build 完十几个 Image 的时候就遇到分发镜像速度慢的情况,所以来个内网的 Registry Mirror 就很重要啦,这里就介绍一下我安装 Docker Mirror 的过程。

在使用 Registry Mirror 的时候,有两种模式,分别是 http 和 https 模式,如果使用 https 模式,请务必将 Ca 证书添加到 Docker 的信任链中,否则,你可能会获取 Image 失败,下面就由简到难介绍一下如何搭建 http 和 https 模式的 Registry Mirror。

无论是 http 模式和 https 模式的 Docker 仓库,我都是用容器运行的,所以第一步肯定是先安装 Docker 以及拉取镜像:

1. 安装 Docker

[[email protected]]# sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
[[email protected]]# sudo yum install docker-ce docker-ce-cli containerd.io
[[email protected]]# docker version
Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77156
 Built:             Sat May  4 02:34:58 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.6
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       481bc77
  Built:            Sat May  4 02:02:43 2019
  OS/Arch:          linux/amd64
  Experimental:     false
[[email protected]]# systemctl enable docker
[[email protected]]# systemctl start docker

看到这些输出就表示 Docker 安装正常,并且是最新的稳定版本啦。

2. 拉取镜像

Docker 到目前为止有两个 Mirror Registry 的 Image,分别是版本 1 和版本 2,但是最新的 Docker 只支持版本 2,所以这里我们就拉取版本 2 的 Image:

[[email protected]]# docker pull registry:2

3. http 模式的仓库

在搭建之前得先对规模做一个规划,这个 Mirror 准备存放多少的 Image ,然后创建对应的目录,例如我准备的目录是:/opt/registry/,大小设置了 500G,应该够我平时开发测试使用了。下一步就是开始搭建了,为了简单,我都是使用 Docker 创建的,所以肯定是得要有个 Docker 先,推荐安装最新版本的 Docker:

启动 Registry Mirror

[[email protected]]#  docker run -d -p 80:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry:2

设置远程的 Registry 地址

因为我们这是一个 Mirror,所以需要指定一个真实的地址,可能你会出于公司安全或者国内网络的考虑,会选用不同的源,但是,我这里使用的官方的,所以你根据自己的情况替换:

[[email protected]]# docker exec -it registry /bin/bash
/ # echo "proxy:" >> /etc/docker/registry/config.yml
/ # echo "    remoteurl: https://registry-1.docker.io" >> /etc/docker/registry/config.yml
[[email protected]]# docker restart registry

这里最后还有一个退出 Container 并且重启 Container 的操作,切忌别忘了哦。

测试 Mirror Registry

配置完 Registry 之后就改试用一下了,在试用之前还是得设置一样 Docker:

[[email protected]]# touch /etc/docker/daemon.json
[[email protected]]# echo "{\"registry-mirrors\": [\"http://192.168.57.79\"]}" >> /etc/docker/daemon.json
[[email protected]]# service docker restart

然后拉个镜像看看:

[[email protected]]# docker pull lukelau/protoc

当 pull 完之后,去你得 Mirror Registry 的数据目录看看,应该会有数据了:

[[email protected]]# ll /opt/registry/docker/registry/v2/repositories/
total 4
drwxr-xr-x.  3 root root   20 Jun 13 17:26 library
drwxr-xr-x. 18 root root 4096 Jun 13 16:21 rancher

4. https 模式的 Mirror

创建证书

虽然前面的 http 模式可以工作得很好,但是,有一些场景下必须使用 https 的话(目前我使用的 docker 1.18.x 版本是没有强制要求需要),那么就需要为自己的 Registry Mirror 设置 https 证书了,这里你可能会有自己的方式生成,例如使用 Let’s Encrypt,但是,因为我要演示的是内网的 https,所以一般来说都会使用自签名的,这里我为了方便就不使用命令行来创建了,就使用一个在线的工具来操作吧,这个工具的链接是:http://www.ssleye.com/self_sign.html,使用的页面是这样的:

填写完必要的信息之后,你将会获得两份文本:

然后分别将上下两份保存为:server.cert 和 server.key

启动 https 的 Container

因为使用 Docker 的 registry Image 都是通过一个 5000 端口暴露 http/https 服务的,所以当你决定使用 https 的时候,就不能同时使用 http 了,这样的话,我们得先把 http 的 Container 停掉(希望你没有真实数据在那)。然后先以 443 端口把容器跑起来:

[[email protected]]#  docker run -d -p 443:5000 --restart=always --name registry-https \
-v /opt/registry:/var/lib/registry \
-v /home/liqiang.io/certs:/etc/tls/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/tls/certs/server.cert  \
-e REGISTRY_HTTP_TLS_KEY=/etc/tls/certs/server.key \
registry:2

验证 Registry

这个就和前面 http 的一样了,修改一下 Docker 的配置:

[[email protected]]# cat /etc/docker/daemon.json
{
   "registry-mirrors": ["https://registry.liqiang.io"]
}

然后再拉取一个 Image 看看。

5. 小结

本文对 Docker 安装 Docker Registry Mirror 的 http 和 https 形态分别进行了介绍,但是,由于行文仓卒,略过了一些细节,如果你对内容有一些不理解,不妨留言交流,我一般在一天时间内都会回复,共勉!

6. Reference