À partir d'une instance AWS ec2 (qui exécute docker
), j'essaie de curl
mon service Web hébergé par conteneur Docker.
Donné:
[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
Je peux accéder au service Web depuis le conteneur:
[ec2-user]$ docker exec -it b56fa0d76d5c bash
root@b56fa0d76d5c:/# curl 'http://localhost/health'
Request is missing required query parameter 'apiName'
Mais, je ne peux pas le frapper de l'hôte:
[ec2-user]$ curl 'http://localhost/health'
curl: (56) Recv failure: Connection reset by peer
J'ai regardé cette détaillée réponse sur cette erreur curl
, mais je ne sais pas comment déboguer ce problème.
La réinitialisation de la connexion à un conteneur Docker indique généralement que vous avez défini un mappage de port pour le conteneur qui ne pointe pas vers une application.
Donc, si vous avez défini un mappage 80:80, vérifiez que votre processus à l'intérieur de l'instance de docker s'exécute bien sur le port 80 (netstat -an | grep LISTEN).
Vous obtenez une réinitialisation lorsque le "proxy" Docker récupère la connexion, tente de se connecter au processus à l'intérieur du conteneur, échoue, réinitialise donc la connexion.
Vous pouvez enquêter sur cela en installant tshark sur le conteneur, puis faites tshark -i any
:
Si vous effectuez ensuite une demande en externe, vous devriez voir quelque chose comme ci-dessous:
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
Le paquet réseau est entré mais il a répondu par un RST
, ce qui signifie qu'il a été rejeté.
Vous écoutez probablement sur 127.0.0.1
plutôt que 0.0.0.0
- toutes les adresses IP.