Запустите Docker-контейнер для определенного узла в кластере Swarm. - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь внедрить систему резервного копирования. Эта система требует выполнения док-контейнера во время резервного копирования на конкретном узле. К сожалению, я не смог заставить его работать на нужном узле.

Это команда, которую я использую и выполняю на узле менеджера роя Docker. Он создает контейнер на узле менеджера роя, а не тот, который указан в ограничении. Чего мне не хватает?

docker run --rm -it --network cluster_02 -v "/var/lib:/srv/toBackup" \
   -e BACKUPS_TO_KEEP="5" \
   -e S3_BUCKET="backup" \
   -e S3_ACCESS_KEY="" \
   -e S3_SECRET_KEY="" \
   -e constraint:node.hostname==storageBeta \
   comp/backup create $BACKUP_NAME

1 Ответ

2 голосов
/ 08 ноября 2019

Вы используете старый классический метод Swarm, чтобы попробовать запустить свой контейнер, но почти наверняка используете Swarm Mode. Если вы установили свой рой с помощью docker swarm init и можете видеть узлы с docker node ls в диспетчере, то это именно тот случай.

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

В Swarm Mode предусмотрен менеджер HA, использующий Raft для кворума (такой же, какetcd), обрабатывает шифрование всех запросов управления, настраивает оверлейные сети и работает с декларативной моделью, предоставляя целевое состояние, а не обязательные команды для запуска. Это очень отличная модель от классического Swarm. Примечательно, что Swarm Mode работает только со службами и стеками и полностью игнорирует docker run и другие локальные команды, например:

docker service create \
  --name backup \
  --constraint node.hostname==storageBeta \
  --network cluster_02 \
  -v "/var/lib:/srv/toBackup" \
  -e BACKUPS_TO_KEEP="5" \
  -e S3_BUCKET="backup" \
  -e S3_ACCESS_KEY="" \
  -e S3_SECRET_KEY="" \
  comp/backup create $BACKUP_NAME

Обратите внимание, что задания пока плохо поддерживаются в Swarm Mode (есть открытыепроблема с поиском отзывов сообщества о включении этой функции)В настоящее время он ориентирован на запуск постоянных служб, которые обычно не завершаются, если не возникает ошибка. Если ожидается, что ваша команда завершит работу, вы можете включить опцию, например --restart-max-attempts 0, чтобы предотвратить повторный запуск режима роя. Вам также может потребоваться дополнительная работа, если сеть не охвачена роем.

Я бы также рекомендовал преобразовать это в файл docker-compose.yml и развернуть с помощью docker stack deploy, чтобы лучше документировать службу как файл конфигурации.

...