Невозможно подключиться к контейнеру Docker: соединение отклонено - PullRequest
0 голосов
/ 16 мая 2019

У меня есть файл войны, развернутый как Docker контейнер на linux ec2.Но когда я пытаюсь нажать http://ec2-elastic-ip:8080/AppName, я не получаю никакого ответа.

У меня есть все security group входящие правила, настроенные как для http, так и https.Так что это не проблема.

Отладка

Я попытался отладить на ssh-ing экземпляр linux.Пробная команда curl localhost:8080, это ответ:

curl: (7) Failed to connect to localhost port 8080: Connection refused

Пробовал с 127.0.0.1:8080, но с тем же ответом.

Следующее, что я сделал, - перечислил контейнер Docker: docker ps,Я получаю:

CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS   PORTS   NAMES
<ID>        <ecr>.amazonaws.com/<my>-registry:2019-05-16.12-17-02   "catalina.sh run"   24 minutes ago      Up 24 minutes       0.0.0.0:32772->8080/tcp   ecs-app-24-name

Теперь я подключился к этому контейнеру с помощью docker exec -it <name> /bin/bash и попытался проверить журналы tomcat, которые ясно показывают, что моя война приложений уже началась, и tomcat начался.

Я когда-либопопытался проверить docker-machine ip default, но это дало мне ошибку:

Docker machine "default" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.

Теперь я застрял.Не в состоянии отладить дальше.В результате я ожидаю получить доступ к приложению через указанный выше URL.

Что делать?Это что-то не так?

Также, чтобы упомянуть, вся инфраструктура управляется через terraform.Сначала я создаю базовый образ, копирую войну в веб-приложения, используя DockerFile, выдвигаю образ реестра и, наконец, делаю terraform apply, чтобы применить любые изменения.

Ответы [ 3 ]

1 голос
/ 16 мая 2019

В настоящее время ваше приложение работает с произвольным портом хоста, т. Е. 32772, см. Вывод docker ps. Вы должны иметь доступ к своему приложению на http://ec2-ip:32772, если разрешите порт 32772 в группах безопасности.

Чтобы заставить его работать на порте хоста 8080, вам нужно привязать / выставить порт хоста во время запуска докера -

$ docker run -p 8080:8080 ......

Если вы используете ECS, в идеале вам следует использовать ALB & TG с вашим сервисом.

Однако, если вы не используете ALB и т. Д., Вы можете попробовать задать статический хост-порт в TD "hostPort": 8080 (я не пробовал этого). Если все работает нормально, вам необходимо изменить стратегию развертывания на «минимальный процент исправности = 0», иначе вы можете столкнуться с проблемами конфликта портов.

0 голосов
/ 16 мая 2019

Если приложению нужен сетевой порт, вы должны EXPOSE указать его в файле Docker.

EXPOSE <port> [<port>/<protocol>...]

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

docker run -p 8080:8080/tcp  my_app

Если вы используете запуск каждого образа отдельно, вы должны каждый раз связывать порт.Если вы не хотите делать это каждый раз, когда вы можете использовать docker-compose и добавить в него директиву ports.

ports:
 - "8080:8080/tcp"

Предположим, вы добавили expose в dockerfile, он полностьюdocker-compose.yml будет выглядеть так:

version: '1'
services:
  web:
    build:
    ports:
    - "8080:8080"
    my_app:
    image: my_app
0 голосов
/ 16 мая 2019

Убедитесь, что apache прослушивает все IP-адреса внутри контейнера Docker, а не только localhost.IP-адрес должен быть таким, как 0.0.0.0.

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

Youтакже можно попробовать запустить apache с портом 8080 и портом bind docker 8080 с портом хоста 8080

docker run apache -p 8080:8080
...