Docker Swarm 中的任务 ID 有何用途?

Docker Swarm 中的任务 ID 有何用途?

在 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。

*这很可能也可以通过其他图像实现,但我会尝试使用相对较大的图像。

相关内容