仓库是什么?
例如存放代码的github,gitlab ,存放jar包的maven这些中心仓库的作用是存储。同样镜像的存储也可以搭建属于自己的仓库,任由自己存取需要的镜像。
仓库(Repository)是存储和分发 Docker 镜像的地方。镜像仓库类似于代码仓库,Docker Hub 的命名来自 GitHub,Github 是我们常用的代码存储和分发的地方。同样 Docker Hub 是用来提供 Docker 镜像存储和分发的地方。
注册服务器是存放仓库的实际服务器
仓库则可以被理解为一个具体的项目或者目录;
注册服务器可以包含很多个仓库,每个仓库又可以包含多个镜像。例如我的镜像地址为 docker.io/centos,docker.io 是注册服务器,centos 是仓库名。 它们之间的关系如图
公共镜像仓库
公共镜像仓库一般是 Docker 官方或者其他第三方组织(阿里云,腾讯云,网易云等)提供的,允许所有人注册和使用的镜像仓库。
Docker Hub 是全球最大的镜像市场,目前已经有超过 10w 个容器镜像,这些容器镜像主要来自软件供应商、开源组织和社区。大部分的操作系统镜像和软件镜像都可以直接在 Docker Hub 下载并使用。
私有镜像仓库
Docker 官方提供了开源的镜像仓库 Distribution,并且镜像存放在 Docker Hub 的 Registry 仓库下供我们下载。
Docker 官方开源的镜像仓库Distribution仅满足了镜像存储和管理的功能,用户权限管理相对较弱,并且没有管理界面。
如果你想要构建一个企业的镜像仓库,Harbor 是一个非常不错的解决方案。Harbor 是一个基于Distribution项目开发的一款企业级镜像管理软件,拥有 RBAC (基于角色的访问控制)、管理用户界面以及审计等非常完善的功能。
启动registry
我们可以使用以下命令启动一个本地镜像仓库:
/tmp]#docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4a2: Pull complete e2ead8259a04: Pull complete 3790aef225b9: Pull complete Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375 Status: Downloaded newer image for registry:latest docker.io/library/registry:latest
使用docker run启动容器:
[root@hadoop100 /]#docker run -d -p 5000:5000 -v registry:/var/lib/registry --restart=always --name myRegistry registry
-v 参数将registry的数据持久化(使用volume的具名卷)
验证: http://192.168.56.10:5000/v2/
返回[]代表启动成功,此时我们就拥有了一个私有镜像仓库
docker tag重命名镜像
我们依旧使用 busybox 镜像举例。
]#docker tag ninesun0318/qms:v1.0.0 192.168.56.10:5000/ninesun0318/qms:v1.0.1
此时 Docker 为V1.0.0镜像创建了一个别名192.168.56.10:5000/ninesun0318/qms:v1.0.1,192.168.56.10:5000为主机名和端口,Docker 将会把镜像推送到这个地址。
推送镜像到本地仓库
[root@hadoop100 ~]#docker push 192.168.56.10:5000/ninesun0318/qms Using default tag: latest The push refers to repository [192.168.56.10:5000/ninesun0318/qms] Get https://192.168.56.10:5000/v2/: http: server gave HTTP response to HTTPS client
把镜像推送到了本地镜像仓库。
从远端拉去镜像
注意几点:
远端和registry必须网络互通才可以拉去,如果是外网最好使用https。
因为客户端push的时候采用https协议,而registry未使用https导致的。
qms]#docker push 10.50.10.170:5000/ninesun0318/qms Error response from daemon: invalid registry endpoint https://10.50.10.170:5000/v0/: unable to ping registry endpoint https://10.50.10.170:5000/v0/ v2 ping attempt failed with error: Get https://10.50.10.170:5000/v2/: tls: oversized record received with length 20527 v1 ping attempt failed with error: Get https://10.50.10.170:5000/v1/_ping: tls: oversized record received with length 20527. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 10.50.10.170:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/10.50.10.170:5000/ca.crt
解决: /etc/docker/daemon.json 加入如下信任主机。需要重启docker
"insecure-registries":["192.168.56.10:5000"],
push成功
安全
到这里我们的镜像仓库虽然可以本地访问和拉取,但是如果你在另外一台机器上是无法通过 Docker 访问到这个镜像仓库的,因为 Docker 要求非localhost访问的镜像仓库必须使用 HTTPS,这时候就需要构建外部可访问的镜像仓库