Z instancji AWS ec2 (która działa docker
) próbuję do curl
mojej usługi hostowanej przez kontener dokowanej.
Dany:
[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
Mogę trafić do serwisu internetowego z poziomu kontenera:
[ec2-user]$ docker exec -it b56fa0d76d5c bash
root@b56fa0d76d5c:/# curl 'http://localhost/health'
Request is missing required query parameter 'apiName'
Ale nie mogę trafić go z hosta:
[ec2-user]$ curl 'http://localhost/health'
curl: (56) Recv failure: Connection reset by peer
Przejrzałem szczegółową odpowiedź na ten curl
błąd, ale nie jestem pewien, jak rozwiązać ten problem.
źródło
netstat
w kontenerze, ale uruchomiłem:ss -a | grep -i LIST
do wyjściatcp LISTEN 0 100 ::ffff:127.0.0.1:http :::*
. Jeśli poprawnie odczytam to wyjście, to nasłuchujelocalhost:80
?"0.0.0.0"
jako interfejs, nie"localhost"
.0.0.0.0
.Możesz to sprawdzić, instalując tshark na kontenerze, a następnie
tshark -i any
:Jeśli następnie wykonasz żądanie zewnętrznie, powinieneś zobaczyć coś takiego:
Pakiet sieciowy wszedł, ale odpowiedział „a”
RST
, co oznacza, że został odrzucony.Najprawdopodobniej słuchasz
127.0.0.1
raczej niż0.0.0.0
wszystkich adresów IP.źródło