web-dev-qa-db-fra.com

Impossible d’accéder au port de conteneur Docker exposé publiquement depuis une machine externe, uniquement depuis localhost

J'ai un conteneur Docker s'exécutant sur ma machine Ubuntu Linux 14.04 qui expose publiquement un port:

docker run --name spacyapi -d -p 127.0.0.1:7091:7091 jgontrum/spacyapi:en

Je peux me connecter et exécuter des commandes sur le serveur dans le conteneur sans problème à partir de la machine locale. Par exemple:

curl http://localhost:7091/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST

La commande s'exécute fidèlement. Cependant, si j'essaie la même commande CURL depuis une machine externe, l'erreur "connexion refusée" est générée:

curl http://192.5.169.50:5000/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST
curl: (7) Failed to connect to 192.5.169.50 port 7091: Connection refused

Où 192.5.169.50 est l'adresse IP de la boîte exécutant le conteneur Docker.

Je ne pense pas avoir besoin de règles iptables car je n'ai pas eu besoin de configurer le serveur Node.JS fonctionnant sur le même boîtier. Tous les autres ordinateurs de mon réseau local peuvent accéder au serveur Node.JS sans problème. Mais pas le conteneur Docker agissant en tant que serveur.

Comment puis-je réparer cela?

7
Robert Oschler

Vous n'avez pas publié publiquement votre port avec ce drapeau:

-p 127.0.0.1:7091:7091

Cet indicateur indique de publier sur l'interface de l'hôte 127.0.0.1 (localhost), le port 7091 sur le port de conteneur 7091. Le seul moyen d'atteindre ce port consiste à utiliser l'hôte et à se connecter à l'interface de bouclage.

Pour publier publiquement le port, supprimez l'adresse IP de cet indicateur:

-p 7091:7091

ou publier explicitement sur toutes les interfaces avec:

-p 0.0.0.0:7091:7091

Ce dernier format est identique au premier tant que vous n'avez pas remplacé dockerd --ip x.x.x.x par les paramètres de votre docker, ni défini la valeur ip dans votre fichier /etc/docker/daemon.json.

7
BMitch

Je ne pense pas que l'IP du conteneur est 192.5.169.50. Essayez de faire docker inspect <container-uid> | grep IPAddress pour vérifier l’adresse IP du conteneur. Je crois que cela devrait être quelque chose comme 172.17.0.X.

Aussi, vous pouvez simplement faire docker run -d --network=Host <image> qui empile le conteneur sur le réseau de l'hôte.

Les conteneurs sont juste quelque chose au-dessus de l'hôte, l'hôte est celui qui communique réellement avec l'extérieur.

2
Bill Cheng