在 Docker Swarm 中,每个容器都有一个任务 ID 和一个容器 ID。鉴于编排器知道它们运行的容器及其容器 ID,为什么还要为它们分配任务 ID?
这两个标识符对于同一个容器都是唯一的,因此它们之间存在一对一的相关性。从这里可以看出,您可以通过以下方式从 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。
该答案基于 Bret Fisher 的答案以及与朋友的对话。我可以采取非常部分的功劳。
基本上,TaskID 是一个 Swarm 对象,而 ContainerID 是一个 dockerd 引擎对象。在容器启动之前,swarm 需要有某种对象 ID,因此它创建了 TaskID。在docker 文档中可以看到,Task 页面的前三个阶段是在分配容器 ID 之前,因为 Swarm 甚至还不知道它将在哪个节点上运行。
一个可爱的实验可以看到这一点:
第三阶段必须最后运行,第一阶段两个可以互换。
watch docker service ps testTask
watch docker ps
docker service create -e MYSQL_ROOT_PASSWORD=my-secret-pw --name testTask mariadb
*您将在 ContainerID 前几秒钟看到 TaskID。
*这很可能也可以通过其他图像实现,但我会尝试相对较大的图像。