Comment puis-je transférer localhost sur le port de mon conteneur en localhost sur mon hôte?
J'ai un démon sur mon ordinateur hôte exécutant sur un port (p. 8008) et mon code normalement interagit avec le démon en communiquant avec localhost:8008 par exemple.
J'ai maintenant conteneurs mon code mais pas encore le démon.
Comment puis-je transférer le localhost:8008 sur mon conteneur à localhost:8008 sur l'ordinateur hôte exécutant le conteneur (et donc le démon).
Voici netstat -tlnp
sur mon hôte. J'aimerais que la conteneur à l'avant localhost:2009 à 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
OriginalL'auteur Setheron | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
Donc, la façon dont vous devez penser à ce sujet est que les conteneurs Docker ont leur propre réseau de pile (sauf si vous avez explicitement dire qu'il part de l'hôte de la pile avec
--net=host
). Cela signifie que les ports doivent être exposés à la fois à l'intérieur de le conteneur docker et aussi à l'extérieur (la documentation), lorsqu'ils sont liés à des ports d'hôte. Les ports exposés sur le conteneur doivent être liés à l'hôte ports explicitement (avec-p xxxx:yyyy
dans votredocker run
de commande) ou implicitement (à l'aide deEXPOSE
dans votre Dockerfile et à l'aide de-P
sur la ligne de commande), comme il est dit ici. Si votre Dockerfile ne contient pas deEXPOSE 8008
, ou vous ne spécifiez pas--expose 8008
dans votredocker run
de commande, votre conteneur ne peut pas parler pour le monde extérieur, même si vous utilisez ensuite-p 8008:8008
dans votredocker run
commande!De sorte à obtenir tcp/8008 sur l'hôte lié avec le protocole tcp/8008 sur le conteneur, vous devez
EXPOSE 8008
à l'intérieur de votre Dockerfile (et puisdocker build
votre conteneur) OU--expose 8008
dans votredocker run command
. En outre, vous devez soit utiliser-P
implicitement ou-p 8008:8008
à lier explicitement que les exposés port à conteneurs au port de l'hôte. Un exempledocker run
commande pour faire cela pourrait ressembler à:docker run -it --expose 8008 -p 8008:8008 myContainer
Il est bon de se rappeler que dans le
-p 8008:8008
option de ligne de commande, la commande pour cette opération est-p HOST_PORT:CONTAINER_PORT
. Aussi, n'oubliez pas que vous ne serez pas en mesure de SSH dans votre récipient à partir d'un autre ordinateur sur internet, sauf si vous avez aussi ce port débloqué dans iptables sur l'hôte. Je finis toujours par oublier au sujet de qui et de déchets d'une demi-heure avant de me rappeler que j'ai oublié deiptables -A INPUT ...
pour le port tcp sur la machine hôte. Mais vous devriez être capable de SSH à partir de votre hôte dans le récipient sans la règle iptables, car il utilise de bouclage pour les connexions locales. Bonne chance!J'ai ajouté un peu plus d'informations. Vous avez seulement besoin d'ajouter une règle iptables sur l'hôte si vous essayez de ssh dans votre conteneur à partir d'un autre ordinateur sur le réseau internet. Vous devriez être en mesure de ssh dans votre conteneur si vous utilisez ssh depuis la machine hôte.
Si le démon n'est à l'écoute sur localhost. Je peux me connecter à port 8008 à partir de l'IP de mon hôte, mais là j'ai besoin de transmettre ensuite à l'localhost nic
Cette réponse ne fonctionne pas si le conteneur du processus lié à localhost:8008, j'ai interprété l'original question à se poser.
Si votre récipient est un processus dit de n'écouter que pour les connexions localhost, absolument rien sera en mesure de parler à votre conteneur (à moins que je crois que vous utilisez
--net=host
dans votredocker run
commande comme je le mentionne dans ma réponse, qui partage l'hôte de la pile réseau avec votre conteneur). Menu fixe aux réseaux de traite conteneur des processus comme s'ils existaient dans leur propre univers tout entier. Si vous dites à votre processus de se lier àlocalhost:8008
par exemple dans votre Golang web app, vous avez besoin de changer que de0.0.0.0:8008
pour littéralement n'importe quoi pour être en mesure de parler.OriginalL'auteur L0j1k
Je ne suis pas sûr si vous pouvez le faire simplement avec le panneau de paramètres.
Si ma vertu permanent est correct, exposer le port n'est pas ce que vous cherchez.
Au lieu de cela, établir un port ssh transfert d'un conteneur à l'hôte mightbe la réponse.
OriginalL'auteur Yigang M
docker run -d --name <NAME OF YOUR CONTAINER> -p 8008:8008 <YOUR IMAGE>
Qui publiera port
8008
dans votre conteneur8008
sur votre hôte.Peut-être que quelque chose est déjà en écoute sur le port
8008
sur votre hôte. Vous pouvez le vérifier en tapantnetstat -tlnp
si l'hôte est un hôte Linux. Si il y a quelque chose de déjà à l'écoute sur le port8008
sur votre hôte vous aurez besoin de l'arrêter.OriginalL'auteur Matt Barlow