Как отправлять запросы на веб-сервер, работающий внутри док-контейнера внутри машины AWS EC2, из внешнего мира?

У меня есть веб-сервер Python Flask, работающий внутри док-контейнера, который работает на машине AWS EC2 Ubuntu. Контейнер работает с сетевыми настройками по умолчанию (docker0). Внутри хоста EC2 я могу отправлять запросы (Get, Post) на этот веб-сервер, используя IP-адрес докер-машины (172.x.x.x) и переадресованные порты (3000: 3000) хоста.

url: http:// 172.x.x.x:3000 / <api address>

Как я могу отправлять запросы (GET, POST) на этот веб-сервер из внешнего мира? Например, с другого веб-сервера, работающего на другой машине EC2. Или даже из Интернета с помощью моего веб-браузера?

  • Нужно ли мне получать общедоступный IP-адрес для моего хоста Docker?
  • Есть ли другой способ взаимодействовать с таким веб-сервером внутри другого веб-сервера, работающего в другом EC2?

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

Единственный способ, который я могу придумать, это написать веб-сервер на основном EC2, который прослушивает запросы и перенаправляет их на соответствующие веб-серверы контейнеров докеров?! Но это было бы слишком много избыточных кодов, и я бы предпочел просто напрямую обратиться к веб-серверу, работающему в контейнере!


person Mahshid Zeinaly    schedule 14.03.2017    source источник
comment
если localhost: 3000 работает на вашем экземпляре 0, я бы затем попытался запустить экземпляр 1 в той же группе безопасности и попытаться пропинговать службу докеров с помощью instance0-ip: 3000. Если и это работает, то стоит отладить сквозной сервис с помощью балансировщика нагрузки.   -  person Amin Suzani    schedule 16.03.2017
comment
localhost:3000 работает внутри моего экземпляра. Но даже проверка работоспособности балансировщика нагрузки не может вызвать мой веб-сервер. Таким образом, это показывает, что другой экземпляр не сможет вызывать мой веб-сервер, работающий в контейнере докеров, с текущими настройками.   -  person Mahshid Zeinaly    schedule 16.03.2017
comment
Я бы не очень доверял localhost:3000. попробуйте netstat -a | 3000. Он должен показать, что есть процесс, прослушивающий порт 3000. Если нет, это означает, что вы, вероятно, не можете вызвать его извне.   -  person Amin Suzani    schedule 18.03.2017


Ответы (1)


IP-адрес докера не является общедоступным. Однако ваш экземпляр EC2 обычно имеет общедоступный IP-адрес. Вам нужен агент, прослушивающий порт на вашем экземпляре EC2 и передающий его на ваш сервер docker/Flask. Тогда вы сможете вызывать его извне, используя ec2-instance-ip:agent-port.

Это все еще не долгосрочное решение, поскольку IP-адреса EC2 меняются, когда они останавливаются. Вам лучше использовать балансировщик нагрузки или эластичный IP-адрес, если вы хотите, чтобы IP/порт был надежным.

Правильно, это создает много избыточного кода и дополнительную точку отказа. Вот почему лучше использовать управляемую службу Docker от Amazon (https://aws.amazon.com/ecs/). Таким образом, вы просто запускаете экземпляр EC2, который является докером и имеет общедоступный IP-адрес. Он по-прежнему позволяет вам подключаться по SSH к вашему экземпляру EC2 и вносить изменения.

person Amin Suzani    schedule 16.03.2017