Назад | Перейти на главную страницу

Для чего нужны идентификаторы задач в Docker Swarm?

В Docker Swarm каждый контейнер имеет как идентификатор задачи, так и идентификатор контейнера. Учитывая, что оркестраторы знают о контейнерах, которые они запускают, и об их идентификаторах контейнеров, почему они также назначают им идентификатор задачи?

Оба этих идентификатора уникальны для одного и того же контейнера, поэтому между ними существует корреляция 1: 1. Как можно заметить Вот вы можете получить идентификатор контейнера из идентификатора задачи в Swarm через:

docker inspect -f "{{.Status.ContainerStatus.ContainerID}}" <task_id>

И как видно Вот вы можете получить обратное с помощью:

docker inspect --format '{{ index .Config.Labels "com.docker.swarm.task.id"}}' <container_id>

Я понимаю, что для контейнера, который подключен к оркестратору, будут более релевантные данные, связанные с ним, однако мне кажется, что эти данные могут быть представлены оркестратором в соответствии с идентификатором контейнера, и нет необходимости в другом идентификатор. Так в чем же смысл идентификатора задачи? Что вы можете сделать с его помощью, чего нельзя было бы добиться иначе?

В AWS ECS есть аналогичная вещь, однако в ECS у вас может быть несколько контейнеров для каждого определения задачи, и эти контейнеры будут иметь общий идентификатор задачи, поэтому корреляция не обязательно 1 к 1.

Этот ответ основан на ответе Брета Фишера и разговоре с другом. Я могу взять очень частичную заслугу.

В основном TaskID - это объект Swarm, а ContainerID - это объект движка dockerd. У роя должен быть какой-то идентификатор объекта, прежде чем контейнер даже будет запущен, поэтому он создал TaskID. Это можно увидеть в документация докеров, первые три этапа на странице задач предшествуют присвоению идентификатора контейнера, потому что Swarm даже не знает, на каком узле он будет запускаться.

Вот милый эксперимент, чтобы увидеть это в действии:

Третий этап должен запускаться последним, первые два являются взаимозаменяемыми.

  • В рое из 1 узла откройте три окна терминала.
  • В 1-м заезде watch docker service ps testTask
  • Во 2-м прогоне watch docker ps
  • И в третьем и последнем прогоне docker service create -e MYSQL_ROOT_PASSWORD=my-secret-pw --name testTask mariadb*

Вы увидите TaskID за несколько секунд до ContainerID.

* Скорее всего, этого можно добиться и с другими изображениями, но я бы попробовал относительно большое.