Как стать автором
Обновить

Комментарии 10

Спасибо за статью! В свое время замучился искать способ взаимодействия между контейнерами.
Спасибо за статью. Я осваиваю сейчас микросервисную архитектуру (правда с другими ЯП). К моим сервисам есть требование − они не должны «вылетать» если теряют сеть. Должны терпеливо ждать пока сеть востановится и продолжить работу.
Я это требование имплементировал. Как теперь эффективнее всего его тестировать? Как эмулировать разрыв и восстановление связи между пинг и понг контейнерами?
Как эмулировать разрыв и восстановление связи между пинг и понг контейнерами?

Потушить понг контейнер, а потом его запустить.
docker stop pong-service-container / docker start pong-service-container

Спасибо. А реально без остановки понга? У меня на самом деле два десятка контейнеров с микросервисами. Хотелось бы потушить сеть и тестировать одновременно поведение всех контейнеров. А потом ее включить и снова смотреть поведение всех контейнеров.

Ну скажем можно перечислить имена контейнеров в файле my-containers
Далее глушим сеть (убираем контейнеры из нее):
cat my-containers | xargs docker network disconnect my-net
И поднимаем (возвращаем контейнеры):
cat my-containers | xargs docker network connect my-net

Я бы порекомендовал сразу использовать docker-compose, он автоматически создаёт сеть для контейнеров, плюс в пару директив можно раскидать контейнеры по любому количеству сетей

+1, но есть один ньюанс.
Если изменится один из образов, после пересоздания контейнера из этого образа (например через docker-compose up -d), так же может измениться и его IP адрес. Но другие контейнеры об этом не узнают и будут долбиться на старый (который резолвился при их запуске). Решается перезапуском всех контейнеров из docker-compose.yaml (docker-compose restart)
Например в связке nginx+php-fpm при изменении php образа и пересоздания контейнера, nginx может начать отдавать 502 Bad gateway

А использование системы сетевого обнаружения, например Consul, это уже перебор будет?
Можно захардкодить в docker-compose.yml IPv4 и проблемы быть не должно.
Пример: pastebin.com/NUBeVbX3
Как уже писали, можно использовать что-то для управления DNS именами внутри виртуальных сетей Docker (docker swarm, k8s, etc.). Когда сам искал решение, то предлагали просто в nginx выставить resolver на IP docker DNS (в названии не уверен), но у меня не срабатывало. Вам уже дали ответ, что Consul как вариант, но если проект мелкий, то не вижу смысла тащить его.
Смущает, что в статье нет упоминания такой вещи как host.docker.internal, правда это для Mac и Windows, в более старых версиях docker.for.mac.localhost, docker.for.win.localhost. Для LINUX так же можно реализовать с помощью --add-host=host.docker.internal:host-gateway. В целом сиже на Mac, постоянно пользуюсь, когда нужно проверить взаимодействие нескольких сервисов поднятых локально.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации