Из экземпляра AWS ec2 (который запускает docker
), Я пытаюсь curl
мой веб-сервис, размещенный в контейнере Docker.
Дано:
[ec2-user]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b56fa0d76d5c $REGISTRY/$WORK/metrics:v0.1.0 "/bin/sh -c 'sh /root" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:9000->9000/tcp insane_leakey
Я могу попасть в веб-службу из контейнера:
[ec2-user]$ docker exec -it b56fa0d76d5c bash
root@b56fa0d76d5c:/# curl 'http://localhost/health'
Request is missing required query parameter 'apiName'
Но я не могу попасть в него с хоста:
[ec2-user]$ curl 'http://localhost/health'
curl: (56) Recv failure: Connection reset by peer
Я посмотрел на это подробно ответ на этом curl
ошибка, но я не знаю, как отладить эту проблему.
Сброс подключения к контейнеру Docker обычно означает, что вы определили сопоставление портов для контейнера, который не указывает на приложение.
Итак, если вы определили отображение 80:80, убедитесь, что ваш процесс внутри экземпляра докера действительно работает на порту 80 (netstat -an | grep LISTEN).
Вы получаете сброс, когда «прокси» Docker выбирает соединение, пытается подключиться к процессу внутри контейнера, терпит неудачу, поэтому сбрасывает соединение.
Вы можете исследовать это, установив tshark на контейнер, а затем выполните tshark -i any
:
Если вы затем выполните внешний запрос, вы должны увидеть что-то вроде следующего:
root@618910b515f0:/code# tshark -i any
Running as user "root" and group "root". This could be dangerous.
Capturing on 'any'
tshark: cap_set_proc() fail return: Operation not permitted
tshark: cap_set_proc() fail return: Operation not permitted
1 0.000000000 172.18.0.1 → 172.18.0.3 TCP 76 45844 → 8001 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=820044004 TSecr=0 WS=128
2 0.000019457 172.18.0.3 → 172.18.0.1 TCP 56 8001 → 45844 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
Пришел сетевой пакет, но он ответил RST
, что означает, что он был отклонен.
Скорее всего вы слушаете 127.0.0.1
скорее, чем 0.0.0.0
- все IP.