Docker Hub 虽然方便,但还是有些限制。比如:需要 Intenet 连接,上传下载慢。而且上传到 Docker Hub 的镜像任何人都能访问到(虽然也提供私有 repository,但需要收费),有安全性问题。
好在 Docker 已经将 Registry 开源了,同时在 Docker Hub 上也有官方的镜像 registry。下面演示如何在 Docker 中运行自己的 registry,搭建本地 Registry。
1,启动 registry 容器
(1)这里我们使用的镜像是 registry:2,执行如下代码会自动下载并启动:
参数说明:
-d:后台启动容器
-p:将容器的 5000 端口映射到 Host 的 5000 端口(5000 是 registry 服务端口)。
-v:将容器 /var/lib/registry 目录映射到 Host 的 /myregistry,用于存放镜像数据。
1 | docker run -d -p 5000:5000 -v /myregistry:/ var /lib/registry registry:2 |
(2)接着执行下面命令配置 firewalld 防火墙策略:
1 2 | firewall-cmd --permanent --add-port=5000/tcp firewall-cmd --reload |
(3)最后访问 http://主机IP:5000/v2,如果返回如下内容则说明 registry 已经启动成功了。
2,重命名镜像
镜像的名称由 repository 和 tag 两部分组成。
repostory 的完整格式为:[registry-host]:[port]/[username]/xxx
只有 Docker Hub 上的镜像可以省略 registry-host:[host] ,如果使用我们搭建的私有仓库则不能省略。
我们在另一台客户机上通过 docker tag 命令重命名镜像(在镜像前面增加运行 registry 的主机名称和端口),使之与 registry 匹配:
1 | docker tag hangge_server 192.168.60.128:5000/hangge/hangge_server:v1 |
3,上传镜像
(1)镜像重命名后,客户机这边通过 docker push 命令上传镜像:
1 | docker push 192.168.60.128:5000/hangge/hangge_server:v1 |
(2)上面命令执行后可能会报“http: server gave HTTP response to HTTPS client”错误。
(3)这是因为 Docker从1.3.X 之后,与 docker registry 交互默认使用的是 https,然而我们前面搭建的私有仓库只提供 http 服务,所以当与私有仓库交互时就会报上面的错误。
为了解决这个问题需要在启动 docker server 时增加启动参数为默认使用 http 访问。我们执行如下命令修改“客户机”这边 docker 启动配置文件:
1 | vi /usr/lib/systemd/system/docker.service |
(4)找到 ExecStart,按下 i 键在其末尾添加如下内容(IP 则为 registry 主机的 IP):
1 | --insecure-registry 192.168.60.128:5000 |
(5)编辑完毕后按下 esc 退出编辑模式。 接着组合按下 shift + : 开启命令,然后输入 wq 回车,保存退出。
(6)最后执行如下两个命令重启 docker:
1 2 | systemctl daemon-reload systemctl restart docker |
(7)我们再次通过 docker push 命令上传镜像,可以发现镜像已经成果上传到仓库:
4,查看镜像
我们访问 http://主机IP:5000/v2/_catalog,即可看到当前仓库里的所有镜像:
5,下载镜像
客户机同样使用 docker pull 从本地 registry 下载镜像,除了镜像名称长一些,使用方式同 Docker Hub 下载镜像完全一样:
1 | docker pull 192.168.60.128:5000/hangge/hangge_server:v1 |
原文链接:https://www.hangge.com/blog/cache/detail_2410.html