Подключение нескольких контейнеров Docker к хосту

#docker #networking

#docker #сеть

Вопрос:

TL; DR: мне просто нужен способ пересылки трафика localhost на хост без использования --net=host

Я запускаю несколько контейнеров на одном хосте, и они нужны мне для доступа к экземпляру Redis, который доступен по адресу localhost: 6379. Кроме того, мне нужно использовать переадресацию портов, поэтому использование --net=host не вариант.

Как я могу запустить несколько контейнеров и разрешить всем им пересылать трафик localhost на хост?

Я также пытался docker run --add-host localhost:<private ip address> -p <somehostport>:<somecontainerport> my_image , но безуспешно (я все еще получаю 127.0.0.1:6379 отказ в подключении, как если localhost бы не был разрешен для частного IP-адреса хоста)

Ответ №1:

Я запускаю несколько контейнеров на одном хосте, и они нужны мне для доступа к экземпляру Redis, который доступен по адресу localhost: 6379.

Вы не можете.

Если что-то прослушивается только localhost , вы не сможете подключиться к нему с другого компьютера, с виртуальной машины или из контейнера. Однако, если ваша служба прослушивает любой другой адрес на вашем хосте, вы можете просто указать свои контейнеры на этот адрес.

Одним из решений является настройка вашей службы Redis для прослушивания адреса docker0 моста, а затем указание ваших контейнеров на этот адрес.

Ответ №2:

Это лучше решить с помощью небольшого редизайна. Переместите redis в контейнер. Подключайте контейнеры через контейнерную сеть и публикуйте порт redis на localhost для всего, что еще не находится в контейнере. Например.

 docker network create redis
docker run -d --net redis -p 127.0.0.1:6379:6379 --name redis redis
docker run -d --net redis -e REDIS_URL=redis:6379 your_app
  

Контейнеры должны обмениваться данными по имени контейнера через созданную пользователем сеть, поэтому для вашего приложения необходимо настроить новый URL-адрес redis (изменить localhost на redis).

Единственное другое решение, которое я видел для этого, включает взлом правил iptables, что не очень стабильно при повторном развертывании контейнеров.