参考资料: https://medium.com/@mccode/the-misunderstood-docker-tag-latest-af3babfd6375
我关于 docker 镜像的 latest tag 有一些误解, 按照我的第一印象 latest 应该是这个镜像的最新版本, 但是没那么简单, 我们来试验一下:
创建一个简单的 Doockerfile:
FROM busybox:ubuntu-14.04
ENTRYPOINT ["echo", "version 1"]
构建镜像, 不加 tag:
$ docker build -t max/test .
运行检查一下
$ docker run --rm max/test
version 1
$ docker run --rm max/test:latest
version 1
加上
--rm
是为了停止镜像之后自动删除容器, 防止多余容器产生
推送到 docker hub
$ docker push max/test
我们登录到 docker hub, 会看到镜像存在, tag 是 latest, 也就是说我没有加版本号的时候, 会默认加上 latest
我们再修改一下:
FROM busybox:ubuntu-14.04
ENTRYPOINT ["echo", "version 2"]
这次我们构建镜像加上 tag
$ docker build -t max/test:2 .
我们再次运行
$ docker run --rm max/test
version 1
$ docker run --rm max/test:latest
version 1
$ docker run --rm max/test:2
version2
我们看到加上 tag 之后并不会更新本地的 latest
我们再推送到 docker hub
$ docker push max/test
在 docker hub 上就能看到两个 tag 了: latest 和 2
我们 pull 下来再运行试试看呢:
$ docker pull
$ docker run --rm max/test
version 1
$ docker run --rm max/test:latest
version 1
有点出乎意料, 我们更新了镜像, 但是 latest 还是 version 1
不死心, 在 pull 一下 latest
$ docker pull max/test:latest
$ docker run --rm max/test
version 1
$ docker run --rm max/test:latest
version 1
还是一样的结果~~
我再修改一次, 但是这次不打 tag
FROM busybox:ubuntu-14.04
ENTRYPOINT ["echo", "version 3"]
构建
$ docker build -t max/test .
运行
$ docker run --rm max/test
version 3
$ docker run --rm max/test:latest
version 3
$ docker run --rm max/test:2
version 2
推送到 docker hub 再拉取(在这里其实我们大概就能明白了, 但是还是继续一下多此一举的动作吧)
$ docker push
$ docker pull max/test
$ docker pull max/test:2
$ docker pull max/test:latest
再次运行
$ docker run alvy/test
version 3
$ docker run alvy/test:latest
version 3
$ docker run alvy/test:2
version 2
结论
latest 是最新的不加 tag 的镜像.
如果加上了 tag, latest 和这些 tag 一样, 都是同等级的 tag, 没有关联