最近 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 形态分别进行了介绍,但是,由于行文仓卒,略过了一些细节,如果你对内容有一些不理解,不妨留言交流,我一般在一天时间内都会回复,共勉!