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?
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.
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.