为什么swarm节点中运行容器的镜像,无法查看到的tag信息?

最近今天,在研究docker swarm中服务的部署,发现一个非常奇怪的现象······
 
通过docker service create命令创建service,比如:
 
docker service create \
  --with-registry-auth \
  --name=nginx \
  --replicas=3 \
  --publish published=8080,target=80 \
  172.20.58.152/middleware/nginx:1.21.4  
 
 
正常的逻辑,是不是每个节点上,都要拉取这个镜像,然后运行呢?
 
没错,在k8s里面也是这样的,不过,在swarm中不是这样的
 
登录其中一个task所在的主机
 
[root@nccztsjb-node-05 ~]# docker images
REPOSITORY                       TAG       IMAGE ID       CREATED         SIZE
172.20.58.152/middleware/nginx   <none>    9a8e1ec1235e   9 months ago    309MB
172.20.58.152/middleware/nginx   <none>    ea335eea17ab   10 months ago   141MB
[root@nccztsjb-node-05 ~]# 
 
 
奇怪不?明明在创建的service的时候,指定了镜像的tag:
 
172.20.58.152/middleware/nginx:1.21.4
 
可是work节点拉取之后,咋就没了呢?
 
百思不得其解之时,看到了官方的一个解释:
 

If you specify a tag, the manager (or the Docker client, if you use content trust) resolves that tag to a digest. When the request to create a container task is received on a worker node, the worker node only sees the digest, not the tag.

 

也就是说,如果指定了镜像的tag,manager节点会将tag解析成镜像的摘要。然后,worker节点接收到运行task的命令时,它只能看到镜像摘要,而不是tag.

 
所以,理解了吗
 
这个也是swarm集群中镜像的一个特点。
 
那要怎么看看镜像的摘要?
 
docker inspect <IMAGE_ID>就能查看镜像的ID了。
[root@nccztsjb-node-05 ~]# docker images
REPOSITORY                       TAG       IMAGE ID       CREATED         SIZE
172.20.58.152/middleware/nginx   <none>    9a8e1ec1235e   9 months ago    309MB
172.20.58.152/middleware/nginx   <none>    ea335eea17ab   10 months ago   141MB
[root@nccztsjb-node-05 ~]# docker inspect 9a8e1ec1235e -f $"{{.RepoDigests}}"
[172.20.58.152/middleware/nginx@sha256:7d0dd4475eacf253250a9712fa1333b93755611c05f3b7dcf9a48d03a699d867]
[root@nccztsjb-node-05 ~]# 
[root@nccztsjb-node-05 ~]# docker inspect ea335eea17ab -f $"{{.RepoDigests}}"
[172.20.58.152/middleware/nginx@sha256:2f14a471f2c2819a3faf88b72f56a0372ff5af4cb42ec45aab00c03ca5c9989f]
[root@nccztsjb-node-05 ~]# 
 
 
OK,那以后在swarm集群中部署service,再看到没有tag的镜像信息,就不要大惊小怪了哟!
 
posted @ 2022-09-19 14:27  Zhai_David  阅读(159)  评论(0编辑  收藏  举报