1、了解 Docker Registry
1.1 介绍
Registry 用于保存 Docker 镜像,包括镜像的层次结构和元数据。
启动容器时,Docker Daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地;
拉取镜像时,如果不知道 Registry 仓库地址,默认从 Docker Hub 搜索拉取镜像。
1.2 分类
Sponsor Registry:第三方的 Registry,供客户和 Docker 社区使用。
Mirror Registry:第三方的 Registry,只让客户使用。如 docker cn 和 阿里云的镜像加速器。
Vendor Registry:服务商的 Registry,由发布 Docker 镜像的供应商提供的 Registry。如:红帽提供的专有的,收费提供。
Private Registry:通过设有防火墙和额外的安全层的私有实体提供的 Registry。自建的 Registry,在本地搭建 Registry,节省带宽。
1.3 Registry 组成( Repository 和 Index)
(1)Repository
由特定的 Docker 镜像的所有迭代版本组成的镜像仓库。
一个 Registry 中可以存在多个 Repository。
Repository 可分为 “顶层仓库” 和 “用户仓库”。
用户仓库名称格式为 “用户名/仓库名”。
每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像。
(2)Index
维护用户账户、镜像的校验以及公共命名空间的信息。
相当于为 Registry 提供了一个完成用户认证等功能的检索接口。
1.4 拉取上传仓库镜像
(1)拉取镜像
docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
registry:仓库服务器地址,不指定默认是 Docker Hub。
port:端口,默认是 443,因为是 https 协议。
namespace:名称空间,指是哪个用户的仓库。如果是顶层仓库,可省。
name:仓库名。
tag:标签名,默认是 latest 版本。
(2)上传镜像
docker push [OPTIONS] NAME[:TAG]
1.5 知名三方 Docker 仓库
https://hub.docker.com/
https://quay.io/
2、使用官方 Distribution 搭建私有仓库
2.1 Distribution 介绍
Docker 在 2015 年推出了 Distribution 项目,即 Docker Registry 2。相比于 Old Registry,Registry 2 使用 Go 实现,在安全性、性能方面均有大幅改进。Registry 设计了全新的 Rest API,并且在 Image 存储格式等方面不再兼容于 Old Registry。如果你要与Registry2 交互,你的 Docker 版本至少要是 Docker 1.6。
Registry 2 在镜像存储方面不仅支持本地盘,还支持诸多主流第三方存储方案。通过分布式存储系统你还可以实现一个分布式 Docker Registry 服务。
2.2 安装启动 Registry
Docker 的开发者也一直在致力于改善 Registry 安装和使用的体验,通过提供官方 Registry Image 以及 Docker Compose 工具等来简化 Registry 的配置。
在本文中,我们只是利用 Docker 以及 Registry 的官方 Image 来部署Registry。
2.2.1 方案1:使用 yum 安装(直接从 extras 源中下载安装)
[root@docker2 ~]# yum info docker-distribution已加载插件:fastestmirrorLoading mirror speeds from cached hostfile可安装的软件包名称 :docker-distribution架构 :x86_64版本 :2.6.2发布 :2.git48294d9.el7大小 :3.5 M源 :extras/7/x86_64简介 : Docker toolset to pack, ship, store, and deliver content网址 :https://github.com/docker/distribution协议 : ASL 2.0描述 : Docker toolset to pack, ship, store, and deliver content[root@docker2 ~]# yum -y install docker-distribution
2.2.2 方案2:以容器方式安装
(1)拉取镜像
[root@docker2 ~]# docker pull registry:2.6.22.6.2: Pulling from library/registryd6a5679aa3cf: Pull completead0eac849f8f: Pull complete2261ba058a15: Pull completef296fda86f10: Pull completebcd4a541795b: Pull completeDigest: sha256:5a156ff125e5a12ac7fdec2b90b7e2ae5120fa249cf62248337b6d04abc574c8Status: Downloaded newer image for registry:2.6.2
(2)启动 Registry 容器
[root@docker2 ~]# docker run --name registry -p 5000:5000 -v /data/registry:/var/lib/registry -d registry:2.6.2a43f802e737eba89879a4dc02562b38e0042db981f9bdb91782b453f0bac4119[root@docker2 ~]# docker port registry5000/tcp -> 0.0.0.0:5000[root@docker2 ~]# ss -nutlp |grep 5000tcp LISTEN 0 128 :::5000 :::* users:(("docker-proxy",pid=4901,fd=4))[root@docker2 ~]# docker inspect -f {
{."Mounts"}} registry[{bind /data/registry /var/lib/registry true rprivate}]
注:
-p 5000:5000:将容器中的 5000 端口,暴露在宿主机的 5000 端口。
-v /data/registry:/var/lib/registry:指定宿主机存储的位置为 /data/registry。
-d:后台运行容器。
2.3 从私有仓库上传下载镜像
2.3.1 将本地的镜像上传到私有仓库
(1)先将本地仓库打上合适的标签
[root@docker1 ~]# docker tag busybox:latest 192.168.10.102:5000/busybox:v0.1[root@docker1 ~]# docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE192.168.10.102:5000/busybox v0.1 758ec7f3a1ee 13 days ago 1.15 MBbusybox latest 758ec7f3a1ee 13 days ago 1.15 MB
(2)尝试上传镜像
[root@docker1 ~]# docker push 192.168.10.102:5000/busybox:v0.1The push refers to a repository [192.168.10.102:5000/busybox]Get https://192.168.10.102:5000/v1/_ping: http: server gave HTTP response to HTTPS client
可以看到上传镜像失败。其原因为:Docker 上传下载默认只支持 HTTPS 协议,搭建的私有仓库是 HTTP 协议。
(3)修改重启 Docker 服务
[root@docker1 ~]# vim /etc/docker/daemon.json{
"registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["192.168.10.102:5000"]}[root@docker1 ~]# systemctl restart docker
注:让 Docker 支持私有仓库为 Insecure Registry。
(4)再次上传镜像
[root@docker1 ~]# docker push 192.168.10.102:5000/busybox:v0.1The push refers to a repository [192.168.10.102:5000/busybox]23bc2b70b201: Pushedv0.1: digest: sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe size: 527
(5)在私有仓库的服务器上验证
[root@docker2 ~]# ls /data/registry/docker/registry/v2/blobs repositories
(6)从私有仓库拉取镜像,先删除再拉取
[root@docker1 ~]# docker rmi 192.168.10.102:5000/busybox:v0.1Untagged: 192.168.10.102:5000/busybox:v0.1Untagged: 192.168.10.102:5000/busybox@sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe[root@docker1 ~]# docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest 758ec7f3a1ee 2 weeks ago 1.15 MB[root@docker1 ~]# docker pull