docker(四)使用篇一:docker 镜像仓库
前文我们已经介绍了 docker 并安装了 docker,下面我们将正式步入使用环节,本章是第一个使用教学:docker 镜像仓库。
一、什么是镜像仓库
所谓镜像仓库,其实就是负责存储、管理和分发镜像的仓库,并且建立了仓库的索引,提供了登录认证能力。
镜像仓库可以看做一个大仓库,其内部又管理多个小镜像仓库(Repository),这些小镜像仓库通过命名来区分。
每个 Repository 包含一个或多个镜像,镜像之间则通过镜像名称和标签 (Tag)来区分。

大镜像仓库(Registry)
镜像仓库可以看做一个大仓库,要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库(如hub.docker.com)。一个 Registry 中可以存在多个 Repository。
小镜像仓库(Repository)
由某特定的 docker 镜像的所有迭代版本组成的镜像仓库;又可分为“顶层仓库”和“用户仓库”,用户仓库名称格式为“用户名 / 仓库名”。
每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像。(镜像名称(name)+标签(tag):如 nginx:latest)认证能力:
提供用户注册,登录、登出镜像仓库的能力。
索引:
提供镜像的索引信息,方便检索。
一个容器镜像实际包含了两个部分:
一个是元数据(存储镜像信息的数据),其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的 checksum 这些信息都会记录下来,还有最终的可执行文件在哪,都是在这个元数据里面。
还有一个是 blob 文件,它真正保存了数据,也真正占用空间。
二、镜像仓库的分类
1、以是否对外开放划分种类(研发人员常用):
(1)公有仓库:像阿里云、docker hub 等放到公有网络上的镜像仓库,不用登录就可以下载镜像,供大家访问使用。
(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。
2、按供应商和面向群体划分种类
(1)sponsor(赞助) registry:第三方的 registry,供客户和 docker 社区版使用。
(2)mirror(镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才能使用。
(3)vendor(供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像 Google 和 Redhat 提供了镜像仓库服务。
(4)private registry:通过没有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用。
三、镜像仓库的工作机制
1、镜像仓库的使用流程
(1)通过 docker login 登录仓库
(2)Docker pull 拉取需要的镜像
(3)通过 dockerfile 或者 commit 等方式制作完镜像再通过 docker push 上传到仓库
2、在实际研发中镜像仓库如何使用
Docker Registry 中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry 上保存,供其他人员使用,例如“部署”到生产环境。

开发环境:开发人员使用的一套环境
测试环境:需求开发完成后,发布到供测试人员进行测试的环境
预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布
生产环境:真正面向客户的环境
3、镜像仓库的拉取机制
启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其会从 Registry 中下载该镜像并保存到本地。
四、常见的镜像仓库
1、docker hub(已被封禁,可以拉取公有镜像,但无法登陆私有仓库)
注意:截止至文章发布,因某些原因,docker hub 在国内已经被封禁,无法通过国内网络访问,仅可以拉取公有镜像!
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与团队共享。
具有以下功能:
(1)个人可以注册私有仓库,能够发布自己的镜像
(2)提供镜像检索能力
(3)提供海量官方和认证组织的镜像
(4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
(5)支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL)
docker hub 的功能浏览
1、搜索镜像
2、镜像 tag 查找
3、对应版本拉取命令
4、镜像的大小,id,cpu 架构查看
2、国内公有镜像仓库
由于 docker hub 已经被封禁,通过正常渠道,我们只能访问国内各大云服务商提供的镜像仓库,如腾讯、阿里、华为等,笔者由于云服务器是华为云的,因此这里给出华为云镜像仓库的链接以及如何创建私有的镜像仓库:
华为开源镜像仓库
Docker华为云创建私人镜像仓库
3、私有仓库
私有镜像仓库则是指部署在公司或组织内部的,用于自身应用 Docker 镜像存储、分发的镜像仓库。
在构建公司内部使用的自动化发布系统的过程中,从安全的角度出发,应用的打包镜像一般情况下只会被存储在私有镜像仓库中,CI / CD 流程的衔接点也是通过向私有镜像仓库上传镜像和拉取镜像的操作来完成的。
常见的私有仓库工具:
Harbor:Harbor:
VMware 公司最近开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的registry 为基础,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。
Nexus:
Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,目前常被用来作为 Maven 私服、Docker 私服。
Docker registry:
由 docker 官方提供的私服,类似于 docker hub。用于保存公司内部上传的 Docker 镜像。
五、核心:镜像仓库相关命令
命令清单
命令 | 别名 | 功能 | 备注 |
docker login | 登录仓库(在拉取私人镜像 / 向个人仓库推送镜像时,需要使用) | 必须掌握 | |
docker logout | 登出仓库 | ||
docker pull | docker image pull | 从仓库拉取镜像(拉取公有镜像不需要登录) | 必须掌握 |
docker push | docker image push | 向仓库推送镜像 | 必须掌握 |
docker search | 查找镜像仓库中某个镜像(一般直接在网页查询了,用的较少) |
1、docker login
# 注意:[]表示可选项,可有可无,后面都是如此,这里特别说明,后面不再赘述
docker login [核心参数] [镜像仓库地址]
核心参数:
-u(镜像仓库的用户名)
-p(镜像仓库的密码,建议不要在命令行中输入,会被看见)
功能:登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。

2、docker pull
# 此处的 TAG 指的是镜像标签;DIGEST则是另一种表示,sha256的值
docker pull [关键参数] 镜像仓库名[:TAG 或者 @DIGEST]
关键参数:
-a:拉取指定仓库中的某一镜像的所有不同版本。
--disable-content-trust :忽略镜像的校验,默认开启
功能:从镜像仓库中拉取指定镜像
# 示例:拉取 nginx 1.23.3 版本
docker pull nginx:1.23.3
3、docker push
docker push [关键参数] 镜像名称[:TAG]
关键参数:
-a:推送某一镜像的所有不同版本。
--disable-content-trust :忽略镜像的校验,默认开启
功能:把本地镜像上传至当前登录的镜像仓库
# 示例:向自己的的仓库推送 myapache v1 版本
docker push myapache:v1
4、docker search
# 因 docker hub 被国内封禁,此命令暂时无法实操
docker search [关键参数] 镜像名称
关键参数
--no-trunc:显示完整的镜像描述;
-f <过滤条件>:列出收藏数不小于指定值的镜像。
功能:查找镜像仓库中某个镜像(一般直接在网页查询了,用的较少)
# 从 Docker Hub 查找所有镜像名包含 nginx,并且 star 数大于 10 的镜像
docker search -f stars=10 nginx
5、docker logout
docker logout [镜像仓库地址]
功能:登出镜像仓库