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

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

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

docker inspect -f "{{.Status.ContainerStatus.ContainerID}}"

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

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

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

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

0
задан 14 April 2020 в 14:11
1 ответ

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

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

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

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

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

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

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

0
ответ дан 17 April 2020 в 16:17

Теги

Похожие вопросы