504 votes

Exposant un port sur un conteneur de Docker direct

Je suis en train de créer un conteneur Docker qui agit comme un plein sur la machine virtuelle. Je sais que je peux utiliser l'EXPOSER à l'instruction à l'intérieur d'un Dockerfile pour exposer un port, et je peux utiliser l'option-p avec docker run pour attribuer des ports, mais une fois que le conteneur est effectivement en cours d'exécution, est-il une commande pour ouvrir/carte de ports supplémentaires vivre?

Par exemple, disons que j'ai un panneau contenant sshd. Quelqu'un d'autre en utilisant le conteneur de ssh et installe httpd. Est-il possible d'exposer le port 80 sur le conteneur et le mapper le port 8080 sur l'hôte, de sorte que les gens peuvent visiter le site web du serveur qui s'exécute dans le conteneur, sans redémarrer?

403voto

SvenDowideit Points 568

Vous ne pouvez pas le faire via le menu fixe, mais vous pouvez accéder au conteneur des nations unies exposés au port de la machine hôte.

si vous avez un conteneur avec quelque chose sur le port 8000, vous pouvez exécuter

wget http://container_ip:8000

Pour obtenir les conteneurs adresse ip, exécutez les 2 commandes:

docker ps

docker inspect container_name | grep IPAddress

En interne, Docker shells pour appeler iptables lorsque vous exécutez une image, alors peut-être une certaine variation sur cela va fonctionner.

pour exposer la containerś le port 8000 sur votre localhosts port 8001:

 iptables -t nat -A  DOCKER -p tcp --dport 8002 -j DNAT --to-destination 172.17.0.19:8000

Une façon vous pouvez faire ce travail, est l'installation dans un autre récipient avec le mappage de port que vous voulez, et de comparer la sortie de la commande iptables-save commande (cependant, j'ai dû supprimer certaines des autres options que de forcer la circulation de passer par le panneau de proxy).

NOTE: ceci est une subversion de docker, il doit donc être fait avec la prise de conscience qu'il pourrait bien créer la fumée bleue

OU

Une autre alternative est de chercher la (nouvelle? post 0.6.6?) Option-P qui permettra d'utiliser aléatoire ports d'hôte, et puis de fil de ceux-ci.

OU

avec 0.6.5, vous pouvez utiliser la fonctionnalité des Liens pour mettre en place un nouveau conteneur qui parle à l'existant, avec quelques relais pour que les conteneurs -p drapeaux? (Je n'ai pas utilisé des Liens encore)

OU

avec le panneau de 0,11? vous pouvez utiliser docker run --net host .. pour attacher votre conteneur directement à l'hôte interfaces réseau (c'est à dire, le net n'est pas le nom interligne) et donc tous les ports à ouvrir dans le conteneur sont exposés.

160voto

bosky101 Points 301

Voici ce que je ferais.

  • commettre le conteneur direct.
  • Réexécutez le conteneur avec la nouvelle image, avec les ports ouverts (je voudrais recommander un volume partagé de montage et en ouvrant le port ssh ainsi.)

sudo docker ps

sudo docker commit containerid foo/live

docker sudo exécuter -i -p 22 - p 8000:80 -m/données : / data -t foo/vivre/bin/bash

~ B

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X