基本方式

(1)使用相同的 Dockerfile 在其他的 host 构建镜像。

(2)将镜像上传到公共 Registry(Docker Hub),host 直接下载使用。

(3)搭建私有的 Registry 供本地使用。

为镜像命名

  1. docker build -t ubuntu-with-vim //前例,见构建镜像。
  2. docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. ubuntu-with-vim latest d2041646583c 19 hours ago 176MB
  5. golang latest 3abbb425095a 8 days ago 964MB
  6. 注意到第一个镜像的 TAG,我们在 build 时没有说明,自动设为 lastest,可通过以下方式设置 TAG 标记:
  7. docker build -t ubuntu-with-vim:tag . 方式修改标签。

镜像名是由两部分组成的即:[REPOSITORY ] : [TAG] ,TAG 常用于描述版本信息,可以为任意字符串。

latest tag

latest 本身没有什么特殊含义,当没有指定镜像 tag 时,Docker 会默认使用 latest。

Docker Hub 很多 repository 将 latest 作为最新稳定版的别名,但这只是一种约定,而非强制。所以构建镜像时最好避免使用 latest,直接知名某个 tag。

tag 使用实践

  1. #使用 docker tag 为镜像打标签,起别名:
  2. docker tag my-image:latest my-image:new
  3. docker tag my-image:latest my-image-new:v22.3.28
  4. docker images
  5. my-image-new v22.3.28 dbb83d9955d8 15 hours ago 1.24MB
  6. my-image latest dbb83d9955d8 15 hours ago 1.24MB
  7. my-image new dbb83d9955d8 15 hours ago 1.24MB

高效版本命名方案可以让用户清楚的知道当前使用的是那个镜像,同时保持足够的灵活性。每个 repository 可以有多个 tag,多个 tag 对应的可能是同一个镜像。

使用公共 Registry

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

(1)首先,注册一个自己的账户,注意注册时使用的 ID,之后登录要用 ID,邮箱不能成功登录。

(2)在 Docker Host 上登录,如果登陆了 Docker Desktop,直接使用命令:docker login 即可。如果没有登录,则:docker login -u [Docker Hub ID],输入密码即可,注意这里的 ID 字母通通小写。

(3)修改镜像的 ID,Docker Hub 为了区分不同用户的镜像,镜像的 registry 中要包含用户名,完整格式为:[ID]/[image] : [tag],通过 docker tag 命令重命名镜像。

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. my-image latest dbb83d9955d8 19 hours ago 1.24MB
  4. my-image 0.0.0 dbb83d9955d8 19 hours ago 1.24MB
  5. docker tag my-image:latest wangying200110/my-image:0.0.0
  6. #这里可以使用 IMAGE ID 代替
  7. docker push wangying200110/my-image:0.0.0
  8. #成功之后进入 DOcker Hub 查看,可看到上传的镜像。相同 REPOSITORY 的镜像会被放到一起,按照 tag 进行区分。
  9. #想如果想上传同一 REPOSITORY 的所有镜像,忽略 TAG 即可:
  10. docker push wangying200110/my-image

image.png
Docker 会上传镜像的每一层,当上传镜像与官方镜像完全一致时,真正上传的数据很少。同样,如果上传的镜像是基于 base 镜像,也只有新增加的镜像层才会被上传。

如果删除上传过的镜像,只能在 Docker Hub 界面上操作。

搭建本地 Registry

Docker Hub 的多方面限制:需要联网,公共库都可以访问,由于安全原因,很多组织不允许将镜像放到外网。于是有了本地 Registry 。Docker 已经将 Registry 开源,而且 Docker Hub 上也有官方镜像 registry 。

启动 registry 容器

  1. docker run -d -p 5000:5000 --restart always --name registry registry:2
  2. -d 后台启动容器
  3. -p 将容器的5000端口映射到 Host 5000端口,该端口是 registry 的服务端口。
  4. docker tag ubuntu localhost:5000/ubuntu
  5. docker push localhost:5000/ubuntu
  6. #未添加标签,使用的是默认的 latest

docker 向本地 registry 中 push 或是从中 pull 都要保证该容器是运行的状态,本节未介绍将容器目录映射到本地的方式,在容器存储部分介绍。