目录
一、概念
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。镜像仓库管理多个Repository, Repository通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分
- 镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过DNS或IP地址来确定一个镜像仓库。一个 Registry 中可以存在多个Repository,Repository可分为"顶层仓库"和"用户仓库"。用户仓库名称格式为"用户名/仓库名",每个仓库可以包含多个Tag(标签),每个标签对应一个镜像
- Repository:由某特定的docker镜像的所有迭代版本组成的镜像仓库
- 镜像名称(name) + 标签(tag):如 nginx:latest
- 认证能力:提供用户注册,登录、登出能力
- 索引:提供镜像的索引信息,方便检索
一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,其checksum这些信息都会记录下来。最终的可执行文件就是在存储数据里面,就是在一个一个的 blob 里面,真正占用空间的就是这些 blob
二、镜像仓库分类
按是否对外开放划分
- 公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,供大家访问使用
- 私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用
按供应商和面向群体划分
- sponsor(赞助)registry:第三方的 registry,供客户和 docker 社区版使用
- mirror(镜像) registry:第三方的 registry,只让客户使用,如:阿里云必须注册才能使用
- vendor(供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像Google和Redhat 提供了镜像仓库服务
- private registry:通过设有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用
三、镜像仓库工作机制
使用流程
- 通过 docker login 登录仓库
- Docker pull 拉取需要的镜像
- 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库
实际研发中的使用流程
Docker Registry中的镜像通常由开发人员制作,而后推送至"公共"或"私有"Registry上保存,供其他人员使用,如:"部署"到生产环境
镜像仓库的拉取机制
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地
四、常用的镜像仓库
4.1 Docker hub
DNS污染,目前无法访问
4.2 国内镜像源
国内很多云服务商都提供了国内镜像加速器服务,如:
- 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址)
- 网易云加速器地址 https://hub-mirror.c.163.com
- 百度云加速器地址 https://mirror.baidubce.com
在 /etc/docker/daemon.json 中写入如下内容(若文件不存在请新建该文件)
{
#注意:若最外层以及有了配置,不要直接覆盖,而是将网址添加,确保json格式正确
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
添加完成后需重新加载配置,重启Docker
# 加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
# 查看 docker 状态
sudo systemctl status docker
4.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 镜像
4.4 镜像仓库命令
4.4.1 docker login
登陆到一个 Docker 镜像仓库,若未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login [OPTIONS] [SERVER]
- -u:登陆的用户名
- -p:登陆的密码
4.4.2 docker pull
从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
#别名
docker image pull
- -a:拉取所有 tagged 镜像
- --disable-content-trust:忽略镜像的校验,默认开启
4.4.3 docker push
将本地的镜像上传到镜像仓库,要先登录到镜像仓库中
docker push [OPTIONS] NAME[:TAG]
#别名
docker image push
- -a:推送所有 tagged 镜像
- --disable-content-trust:忽略镜像的校验,默认开启
4.4.4 dockor search
从docker hub中查找镜像
docker search [OPTIONS] TERM
- --no-trunc:显示完整的镜像描述
- -f <过滤条件>:列出收藏数不小于指定值的镜像
4.4.5 docker logout
登出一个docker的镜像仓库,若未指定镜像仓库的地址,默认未官方仓库docker hub
docker logout [SERVER]