一、镜像命名的最佳实践

前面已经学习了如何利用Dockerfile文件构建自己的镜像了,接下来的问题是如何在多个 Docker Host 上使用镜像?

  1. 用相同的 Dockerfile 在其他 host 构建镜像。
  2. 将镜像上传到公共 Registry(比如 Docker Hub),Host 直接下载使用。
  3. 搭建私有的 Registry 供本地 Host 使用

无论采用何种方式保存和分发镜像,首先都得给镜像命名;其实,当我们执行 docker build 命令时已经为镜像取了个名字,

譬如docker build -t ubuntu-with-vi中ubuntu-with-vi 就是镜像的名字,可以通过docker images命令查看:

运行镜像后容器名称生成 镜像命名_Docker

 实际上,一个特定镜像的名字由两部分组成:repository 和 tag;

如果执行 docker build 时没有指定 tag,会使用默认值 latest;tag 常用于描述镜像的版本信息,比如 httpd 镜像:

tag 使用最佳实践

借鉴软件版本命名方式能够让用户很好地使用镜像;

假设我们现在发布了一个镜像 myimage,版本为 v1.9.1,那么我们可以给镜像打上四个 tag:1.9.1、1.9、1 和 latest;

我们可以通过 docker tag 命令方便地给镜像打 tag:

docker tag myimage-v1.9.1 myimage:1
docker tag myimage-v1.9.1 myimage:1.9
docker tag myimage-v1.9.1 myimage:1.9.1
docker tag myimage-v1.9.1 myimage:latest

过了一段时间,我们发布了 v1.9.2。这时可以打上 1.9.2 的 tag,并将 1.9、1 和 latest 从 v1.9.1 移到 v1.9.2:

docker tag myimage-v1.9.2 myimage:1
docker tag myimage-v1.9.2 myimage:1.9
docker tag myimage-v1.9.2 myimage:1.9.2
docker tag myimage-v1.9.2 myimage:latest

 之后,v2.0.0 发布了。这时可以打上 2.0.0、2.0 和 2 的 tag,并将 latest 移到 v2.0.0:

docker tag myimage-v2.0.0 myimage:2
docker tag myimage-v2.0.0 myimage:2.0
docker tag myimage-v2.0.0 myimage:2.0.0
docker tag myimage-v2.0.0 myimage:latest

这种 tag 方案使镜像的版本很直观,用户在选择非常灵活:

  1. myimage:1 始终指向 1 这个分支中最新的镜像。
  2. myimage:1.9 始终指向 1.9.x 中最新的镜像。
  3. myimage:latest 始终指向所有版本中最新的镜像。
  4. 如果想使用特定版本,可以选择 myimage:1.9.1、myimage:1.9.2 或 myimage:2.0.0

Docker Hub 上很多 repository 都采用这种方案;

二、使用公共 Registry

保存和分发镜像的最直接方法就是使用 Docker Hub;

Docker Hub官方网址:https://hub.docker.com/

Docker Hub 是 Docker 公司维护的公共 Registry;用户可以将自己的镜像保存到 Docker Hub 免费的 repository 中。如果不希望别人访问自己的镜像,也可以购买私有 repository;

下面介:绍如何用 Docker Hub 存取我们的镜像:

第一步:在 Docker Hub 上注册一个账号

第二步:在 Docker Host 上登录3

第三步:修改镜像的 repository 使之与 Docker Hub 账号匹配

Docker Hub 为了区分不同用户的同名镜像,镜像的 registry 中要包含用户名,完整格式为:[username]/xxx:tag
我们通过 docker tag 命令重命名镜像

第四步:通过 docker push 将镜像上传到 Docker Hub

第五步:登录 https://hub.docker.com,在Public Repository 中就可以看到上传的镜像

第六步:这个镜像可被其他 Docker host 下载使用了

三、搭建本地 Registry

Docker Hub 虽然非常方便,但还是有些限制,比如:

  1. 需要 internet 连接,而且下载和上传速度慢。
  2. 上传到 Docker Hub 的镜像任何人都能够访问,虽然可以用私有 repository,但不是免费的。
  3. 安全原因很多组织不允许将镜像放到外网。

解决方案就是搭建本地的 Registry;

第一步:启动 registry 容器

第二步:通过 docker tag 重命名镜像,使之与 registry 匹配

第三步:通过 docker push上传镜像

第四步:可通过 docker pull 从本地 registry 下载镜像了

以上是搭建本地 registry 的简要步骤。当然 registry 也支持认证,https 安全传输等特性,具体可以参考官方文档 https://docs.docker.com/registry/configuration/

四、Docker 镜像小结

首先学习了镜像的分层结构,然后学习了如何构建镜像,最后实践使用 Docker Hub 和本地 registry。

下面是镜像的常用操作子命令:

images    显示镜像列表

history   显示镜像构建历史

commit    从容器创建新镜像

build     从 Dockerfile 构建镜像

tag       给镜像打 tag

pull      从 registry 下载镜像

push      将 镜像 上传到 registry

rmi       删除 Docker host 中的镜像

search    搜索 Docker Hub 中的镜像

除了 rmi 和 search,其他命令都已经用过了:

rmi

只能删除 host 上的镜像,不会删除 registry 的镜像

如果一个镜像对应了多个 tag,只有当最后一个 tag 被删除时,镜像才被真正删除;

search

search 让我们无需打开浏览器,在命令行中就可以搜索 Docker Hub 中的镜像;