和Maven一样,Docker不仅提供了一个中央仓库,同时也允许我们搭建私有仓库。如果读者对Maven有所了解,将会很容易理解私有仓库的优势:
- 节省带宽,镜像无需从中央仓库下载,只需从私有仓库中下载即可
- 对于私有仓库中已有的镜像,提升了下载速度
- 便于内部镜像的统一管理
下面我们来讲解一下如何搭建、使用私有仓库
准备工作
准备两台安装有Docker的CentOS7的机器,主机规划如下(仅供参考):
主机 | IP | 角色 |
---|---|---|
node0 | 192.168.11.143 | Docker开发机 |
node1 | 192.168.11.144 | Docker私有仓库 |
安装、使用私有仓库
网上有很多docker-registry
的教程,但是docker-registry
已经过时,并且已经2年不维护了。详见https://github.com/docker/docker-registry ,故而本文不做探讨,对docker-registry
有兴趣的童鞋可以查阅本节的参考文档。
本节讲解registry V2,registry V2需要Docker版本高于1.6.0。registry V2要求使用https访问,那么我们先做一些准备,为了方便,这边模拟以域名reg.itmuch.com
进行讲解。
使用域名搭建https的私有仓库
- 首先修改两台机器的hosts,配置
192.168.11.144
到reg.itmuch.com
的映射
echo '192.168.11.144 reg.itmuch.com'>> /etc/hosts |
- 既然使用https,那么我们需要生成证书,本文讲解的是使用openssl自签名证书,当然也可以使用诸如
Let’s Encrypt
等工具生成证书,首先在node1机器上生成key:
mkdir -p ~/certs |
再生成密钥文件:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.itmuch.com.key -x509 -days 365 -out reg.itmuch.com.crt |
会有一些信息需要填写:
Country Name (2 letter code) [XX]:CN # 你的国家名称 |
这样自签名证书就制作完成了。
- 由于是自签名证书,默认是不受Docker信任的,故而需要将证书添加到Docker的根证书中,Docker在CentOS 7中,证书存放路径是
/etc/docker/certs.d/域名
:
node1
端:
mkdir -p /etc/docker/certs.d/reg.itmuch.com |
node0
端:将生成的证书下载到根证书路径
mkdir -p /etc/docker/certs.d/reg.itmuch.com |
- 重新启动
node0
和node1
的Docker
service docker restart |
- 在
node1
上启动私有仓库
首先切换到家目录中,这一步不能少,原因是下面的-v 挂载了证书,如果不切换,将会引用不到证书文件。
cd ~ |
启动Docker私有仓库(注意:如果直接粘贴运行,请删除掉注释):
docker run -d -p 443:5000 --restart=always --name registry \ |
其中,之所以挂载/opt/docker-image目录,是为了防止私有仓库容器被删除,私有仓库中的镜像也会丢失。
- 在
node0
上测试,将镜像push到私服
docker pull kitematic/hello-world-nginx |
会发现如下内容:
The push refers to a repository [reg.itmuch.com/kitematic/hello-world-nginx] |
说明已经push成功。
- 从私服中下载镜像:
docker pull reg.itmuch.com/kitematic/hello-world-nginx |
配置登录认证
在很多场景下,我们需要用户登录后才能访问私有仓库,那么我们可以如下操作:
建立在上文生成证书,同时重启过Docker服务的前提下,我们讲解一下如何配置:
- 为防止端口冲突,我们首先删除或停止之前启动好的私有仓库:
docker kill registry |
- 在node1机器上安装
httpd-tools
:
yum install httpd-tools |
- 在node机器上创建密码文件,并添加一个用户
testuser
,密码是testpassword
:
cd ~ |
- 在node1机器上切换到
~
目录,并启动私有仓库(注意:如果直接粘贴运行,请删除掉注释):
docker run -d -p 443:5000 --restart=always --name registry2 \ |
- 测试:
docker push reg.itmuch.com/kitematic/hello-world-nginx |
提示:
461f75075df2: Image push failed |
说明需要认证。
我们登陆一下,执行:
docker login reg.imuch.com |
再次执行
docker push reg.itmuch.com/kitematic/hello-world-nginx |
就可以正常push镜像到私有仓库了。
注意:如果想要从私有仓库上下载镜像,同样需要登录。