web-dev-qa-db-fra.com

Comment puis-je transférer le port localhost de mon conteneur vers localhost sur mon hôte?

J'ai un démon sur mon hôte fonctionnant sur un port (c'est-à-dire 8008) et mon code interagit normalement avec le démon en contactant localhost: 8008 par exemple.

J'ai maintenant conteneurisé mon code mais pas encore le démon. Comment puis-je transférer le localhost: 8008 sur mon conteneur vers localhost: 8008 sur l'hôte exécutant le conteneur (et donc le démon également).

Ce qui suit est netstat -tlnp sur mon hôte. J'aimerais que le conteneur transfère localhost: 2009 vers localhost: 2009 sur l'hôte

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name            
tcp        0      0 127.0.0.1:2009          0.0.0.0:*               LISTEN      22547/ssh       
tcp6       0      0 :::22                   :::*                    LISTEN      -               
tcp6       0      0 ::1:2009                :::*                    LISTEN      22547/ssh            
25
Setheron

Donc, la façon dont vous devez penser à cela est que les conteneurs Docker ont leur propre pile réseau (sauf si vous lui demandez explicitement de partager la pile de l'hôte avec --net=Host). Cela signifie que les ports doivent être exposés à la fois à l'intérieur du conteneur Docker et également à l'extérieur ( documentation ), lorsqu'ils sont liés à l'hôte ports. Les ports exposés sur le conteneur doivent être liés aux ports hôtes explicitement (avec -p xxxx:yyyy dans ton docker run) ou implicitement (en utilisant EXPOSE dans votre Dockerfile et en utilisant -P sur la ligne de commande), comme il est dit ici . Si votre Dockerfile ne contient pas EXPOSE 8008, ou vous ne spécifiez pas --expose 8008 dans ton docker run commande, votre conteneur ne peut pas parler au monde extérieur, même si vous utilisez ensuite -p 8008:8008 dans ton docker run commande!

Donc, pour obtenir tcp/8008 sur l'hôte lié à tcp/8008 sur le conteneur, vous avez besoin de EXPOSE 8008 dans votre Dockerfile (puis docker build votre conteneur) OR --expose 8008 dans ton docker run command. En outre, vous devez soit utiliser -P à implicitement ou -p 8008:8008 pour lier explicitement ce port de conteneur exposé au port d'hôte. Un exemple docker run la commande pour ce faire pourrait ressembler à:

docker run -it --expose 8008 -p 8008:8008 myContainer

Il est utile de se rappeler que dans le -p 8008:8008 option de ligne de commande, l'ordre de cette opération est -p Host_PORT:CONTAINER_PORT. Aussi, n'oubliez pas que vous ne pourrez pas SSH dans votre conteneur à partir d'une autre machine sur Internet à moins que ce port ne soit également débloqué dans iptables sur l'hôte . Je finis toujours par oublier ça et je perds une demi-heure avant de me souvenir que j'ai oublié de iptables -A INPUT ... pour ce port TCP spécifique sur la machine hôte. Mais vous devriez pouvoir SSH de votre hôte dans le conteneur sans la règle iptables, car il utilise le bouclage pour les connexions locales. Bonne chance!

20
L0j1k

Après avoir vérifié les réponses et fait une enquête, je pense qu'il y a 2 façons de le faire et ces 2 ne fonctionnent que dans l'environnement Linux.

Le premier est dans ce post Comment accéder au port hôte à partir du conteneur Docker

La seconde doit être définie votre --network=Host quand vous docker run ou docker container create. Dans ce cas, votre docker utilisera la même interface réseau que vous utilisez sur Mac.

Cependant, les deux façons ci-dessus ne peuvent pas être utilisées dans Mac, donc je pense qu'il n'est pas possible de transférer du conteneur vers l'hôte dans l'environnement Mac. Corrigez-moi si je me trompe.

2
StevenR

Je ne sais pas si vous pouvez le faire uniquement avec les paramètres de docker. Si ma compréhension est correcte, exposer le port n'est pas ce que vous recherchez. Au lieu de cela, établir la redirection de port ssh du conteneur vers l'hôte pourrait être la réponse.

0
Yigang M