curl (56) Невдача Recv: скидання з'єднання одноранговим - при натисканні на контейнер докера [закритий]


10

Із екземпляра AWS ec2 (який працює docker) я намагаюся перенести curlвеб-службу, розміщену в контейнерах.

Подано:

[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помилку, але не знаю, як налагодити цю проблему.

Відповіді:


9

Підключення Скидання до контейнера Docker зазвичай вказує на те, що ви визначили зіставлення портів для контейнера, який не вказує на додаток.

Отже, якщо ви визначили зіставлення 80:80, перевірте, чи ваш процес всередині екземпляра docker працює насправді на порт 80 (netstat -an | grep LISTEN).

Ви отримуєте скидання, коли «проксі-сервер» Докера підключає з'єднання, намагається підключитися до процесу всередині контейнера, виходить з ладу, та скидає з’єднання.


Ні netstatна контейнері, але я побіг: ss -a | grep -i LISTвивести tcp LISTEN 0 100 ::ffff:127.0.0.1:http :::*. Якщо я прочитав цей висновок правильно, то він слухає localhost:80?
Кевін Мередіт

7
Власне, stackoverflow.com/a/26553296/409976 виправив мою проблему, тобто використовуючи "0.0.0.0"як інтерфейс, ні "localhost" .
Кевін Мередіт,

5
Дякую, Джейсон. Ваше рішення не було для мене фактичним виправленням, але воно призвело до проблеми. Це сталося зі мною, оскільки сервіс запустився 127.0.0.1:9200 (всередині контейнера), і він не був "опублікований" через IP. Тому я змінив його на 0,0.0.0:9200, а потім він почав працювати ззовні контейнера. Вам потрібно виставити порт 9200, але я впевнений, що ви це вже знаєте.
Томаш Тибенський

@KevinMeredith: Дякую за це .. бореться протягом останніх 4 годин тому, що !!!
aman_novice

@KevinMeredith Я все ще не можу змусити його працювати після зміни хоста на 0.0.0.0.
RandomEli

1

Ви можете дослідити це, встановивши 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

Мережевий пакет прийшов, але він відповів знаком a RST, що означає, що його відхилено.


Швидше за все, ви слухаєте, 127.0.0.1а не 0.0.0.0всі IP-адреси.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.