ch03 存储与发布镜像
本章会涉及一些服务. 例如 Docker Hub, Docker Registry.
- Docker Hub 可用于存储镜像
- Docker Registry 可以用于运行本地存储的容器
我们会比较其不同, 并介绍如何使用它们. 本章还会介绍如何利用 web hook 进行自动构建.
本章的主题:
- 理解 Docker Hub
- 部署自己的 Docker registry
- 查看第三方 registry
- 了解 Microbadger
3.1 技术要求(略)
介绍了作者电脑环境(mac), 并提供了一个视频学习链接.
3.2 理解 Docker Hub
前面虽然用到了 Docker Hub, 但仅仅是 pull 镜像, 并未过多介绍.
本章将其作为重点说明. Docker Hub 是一个开源的项目. 本章将重点放在 Web 管理方面.
3.2.1 Docker Hub Dashboard
登录 Docker Hub 后就会进入 Dashboard 页面. 从该页面可以进入 Docker Hub 的其他页面.
在 Dashboard 页面中, 你可以看到你发布的所有镜像, 包括公共的, 以及私有的. 它们会按照星与 pull 来排序.
作者从上往下, 从浅蓝色的菜单开始介绍整个页面.
2024年7月17日 网站已经发生改版. 这里略去顺序. 基本结构不会变化, 但是展示会调整.
Explore
该页面用于展示官方的 Docker 镜像列表. 这里可以用于查询需要的镜像.
Repositories
这里是仓库, 用于管理你自己的镜像. 后面创建自动构建时会使用到. 该页面可以轻松查看到你的镜像的星, 以及被 pull 的次数 (取决于该镜像是公共的还是私有的).
国内似乎不太友好. 需要考虑本地搭建私有仓库.
需要注意的是, push 镜像, 需要保证 repository 名字一样. 这里我的用户名为 jklibs, 那么我为镜像打包时, 名字的前缀也必须是 jklibs. 否则会报错:
Organizations
组织是用于统一维护管理镜像的一个组. 例如多人协同开发, 或统一公开或私有化等.
Get Help (略)
Profile and settings(略)
3.2.2 创建自动化构建
Creating an automated build
可以将你的 DockerHub 与 GitHub 连接起来, 当你在代码仓库中更新后, 可以自动的在 DockerHub 中构建镜像.
3.2.3 设置你的代码
首先需要设置你的代码托管仓库 (设置 GitHub). 作者使用 GitHub (书中还引用了 Bitbucket). 同时作者表示该书的代码也托管在 GitHub 上, 可以一并 fork 使用.
3.2.4 设置 DockerHub
注意, 该功能只允许在 Docker Pro, Team, 和 Business subscription 账户下才可以使用.
基本操作就是在 Docker Hub 上关联 GitHub 账户. 并且界面上有提示向导, 一步步往下操作即可.
流程类似于 CICD, 需要点击启动, 配置构建规则 (分支等信息). 点击 Trigger (触发), 即可开始构建. 同时也会显示构建过程 (命令行内容). 构建完成后, 就可以使用 pull
命令将镜像拉到本地.
然后作者简要说明了构建过程, 并展示过程中的命令行提示 (与本地的构建类似).
感觉还是要搞一搞本地镜像仓库.
3.2.5 推送你自己的镜像
将本地的镜像推送到 DockerHub. 首先需要注册一个账户.
然后执行 docker login
, 会提示输入用户名和密码. 登录后, 执行 docker push <img>
即可.
需要注意, 镜像名前缀需要与你的账户名相同.
3.2.6 Docker 认证镜像与认证发行商 (略)
3.3 部署你自己的 Docker Registry
Docker Registry 是一个开源项目, 允许你在任何位置部署, 并存储你的镜像. 我们会对比 Docker Hub 和 Docker Registry, 并介绍如何选择.
3.3.1 Docker Registry 概述
它是一个开源项目, 用于存储镜像, 可以保证 100% 私有化.
如果不愿意在 Docker Hub 上花银子, Docker Registry 是一个选择. 下面看看其区别:
Docker Registry 的特点:
- 可以自己部署, 管理镜像, 可以自由设置其为公共或私有.
- 可以根据镜像数量与
pull
的频次来对 registry 进行伸缩处理. - 所有内容都基于命令行.
在 Docker Hub 中, 你可以:
- 基于 GUI 来管理镜像.
- 有一个本地预设, 可以配置公开与私有.
- 不需要自己托管, 会更省心.
下面看看如何设置自己的 registry.
3.3.2 部署你自己的 registry
registry 也是在 Docker Hub 上发布的. 使用下面命令部署:
docker image pull registry:2
docker container run -d -p 5000:5000 --name registry registry:2
运行 register 后可以将本地镜像上传 (先打标签, 再上传)
docker pull alpine # 先从网上拉取镜像
docker tag alpine localhost:5000/localalpine # 再给下载到本地的镜像打标签
docker push localhost:5000/localalpine # 将打过标签的镜像推送到 registry 上
要演示在本地 Registry 上拉取镜像, 首先将本地镜像的两个副本删除.
docker image rm alpine localhost:5000/localalpine
然后从本地 Registry 中拉取镜像
docker pull localhost:5000/localalpine
docker images # 可以查看拉取到的镜像
使用下面命令停止, 删除 Registry
docker container stop registry
docker container rm -v registry # 连同卷一起删除
-v
表示删除对容器相关联的匿名卷
运行 Docker Registry 中的选项有很多, 其中最重要的是存储引擎.
Docker Registry 支持的存储引擎有:
- 文件系统 (Filesystem). 所有的镜像都存储在指定的文件系统中. 默认地址为:
/var/lib/registry
. - Azure. 微软提供的存储.
- GCS. Google 提供的存储.
- S3. 亚马逊提供的存储.
- Swift. 使用 OpenStack Swift
jk: 比较在意, 是不是可以本地部署 MinIO 来作为存储引擎使用.
3.3.3 Docker Trusted Registry(略)
Docker 信任的 Registry
Docker 商业版提供的 Registry. 这里略.
3.4 再看第三方 Registry
不仅仅 Docker 官方提供了 Registry, 很多其他机构也会有提供 Registry. 例如 RedHat 就有自己的 Registry, 托管其 RedHat 镜像.
还有其他公司, GitHub, Amazon Web Services, Microsoft Azure, 以及 Google Cloud.
下面快速看看这些:
3.4.1 GitHub Packages and Actions(暂略)
3.4.2 Azure Container Registry(暂略)
3.5 小结(略)
3.6 问题
- Docker Hub 是唯一的镜像仓库, 是对的吗?
- 描述为什么需要使用自动构建. 可惜社区版不支持.
- Docker Hub 也支持多阶段构建吗?
- 在命令行登录 Docker 后也在 Desktop 中登录了. 是对的吗?
- 如何删除两个具有相同 IMG ID 的镜像?
- Registry 默认运行在哪个端口?