在 Docker Swarm 中,每个容器都有一个任务 ID 和一个容器 ID。既然编排器知道它们运行的容器及其容器 ID,为什么它们还要为它们分配一个任务 ID?
这两个标识符对于同一个容器都是唯一的,因此它们之间存在 1 对 1 的关联。可以看出这里您可以通过以下方式从 Swarm 中的任务 ID 获取容器 ID:
docker inspect -f "{{.Status.ContainerStatus.ContainerID}}" <task_id>
正如所见这里您可以通过以下方式获得相反的结果:
docker inspect --format '{{ index .Config.Labels "com.docker.swarm.task.id"}}' <container_id>
我理解,对于连接到编排器的容器,将有更多相关数据与之相关,但在我看来,编排器可以根据容器 ID 呈现这些数据,不需要另一个标识符。那么任务 ID 有什么用呢?您可以用它完成哪些原本无法实现的任务?
在 AWS ECS 中也有类似的事情,但是在 ECS 中,每个任务定义可以有多个容器,并且这些容器将共享一个任务 ID,因此相关性不一定是 1 对 1。
答案1
此答案基于 Bret Fisher 的回答以及与朋友的对话。我只能承担部分责任。
基本上,TaskID 是一个 Swarm 对象,而 ContainerID 是一个 dockerd 引擎对象。Swarm 在容器启动之前需要某种对象 ID,因此它创建了 TaskID。可以在docker 文档,任务页面中的前三个阶段是在分配容器 ID 之前,因为 Swarm 甚至不知道它将在哪个节点上运行。
下面这个可爱的实验可以展示这一点:
第三阶段必须最后运行,前两个阶段可以互换。
- 在 1 节点群中打开三个终端窗口。
- 第一次运行
watch docker service ps testTask
- 第二次运行
watch docker ps
- 在第三次也是最后一次运行中
docker service create -e MYSQL_ROOT_PASSWORD=my-secret-pw --name testTask mariadb
*
您将会在看到 ContainerID 之前几秒看到 TaskID。
*这很可能也可以通过其他图像实现,但我会尝试使用相对较大的图像。