Docker Hub 虽然方便,但还是有些限制。比如:需要 Intenet 连接,上传下载慢。而且上传到 Docker Hub 的镜像任何人都能访问到(虽然也提供私有 repository,但需要收费),有安全性问题。

好在 Docker 已经将 Registry 开源了,同时在 Docker Hub 上也有官方的镜像 registry。下面演示如何在 Docker 中运行自己的 registry,搭建本地 Registry。

启动 registry 容器

这里我们使用的镜像是 registry:2,执行如下代码会自动下载并启动:

参数说明:

-d:后台启动容器

-p:将容器的 5000 端口映射到 Host 的 5000 端口(5000 是 registry 服务端口)。

-v:将容器 /var/lib/registry 目录映射到 Host 的 /mnt/registry,用于存放镜像数据。

–restart=always: 自动重启

–name=jackspeedregistry: 运行的容器名称

registry:2  镜像名称and版本

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  registry:2

重命名镜像

镜像的名称由 repository 和 tag 两部分组成。

repostory 的完整格式为:[registry-host]:[port]/[username]/xxx

只有 Docker Hub 上的镜像可以省略 registry-host:[host] ,如果使用我们搭建的私有仓库则不能省略。

我们在另一台客户机上通过 docker tag 命令重命名镜像(在镜像前面增加运行 registry 的主机名称和端口),使之与 registry 匹配:

docker tag nginx 192.168.60.128:5000/nginx:v1

上传镜像

镜像重命名后,客户机这边通过 docker push 命令上传镜像:

docker push 192.168.60.128:5000/nginx:v1

上面命令执行后可能会报“http: server gave HTTP response to HTTPS client”错误。

这是因为 Docker从1.3.X 之后,与 docker registry 交互默认使用的是 https,然而我们前面搭建的私有仓库只提供 http 服务,所以当与私有仓库交互时就会报上面的错误。

配置http权限支持

vim /etc/docker/daemon.json

{
"insecure-registries":["192.168.60.128:5000"]
}

windows操作

# 先切换到虚拟docker bash环境中去:

docker-machine ssh default

# 然后修改配置文件

vim /etc/docker/daemon.json

{
"insecure-registries":["192.168.60.128:5000"]
}

修改完成后重启docker应用配置文件。

然后就可以用push推送成功了。

查看镜像

我们访问 http://主机IP:5000/v2/_catalog,即可看到当前仓库里的所有镜像

我们访问 http://主机IP:5000/v2/镜像名/tags/list,即可看到某个镜像的标签列表

下载镜像

客户机同样使用 docker pull 从本地 registry 下载镜像,除了镜像名称长一些,使用方式同 Docker Hub 下载镜像完全一样(也需要配置/etc/docker/daemon.json):

docker pull 192.168.60.128:5000/nginx:v1

(完)

文章参考:航歌