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