60 votes

Que fait vraiment l'option --net = host dans la commande Docker?

Je suis un peu débutant à Docker. Je ne pouvais pas trouver toute description claire de ce que cette option dans le panneau de commande exécuter dans une profonde et peu confus à ce sujet.

Pouvons-nous l'utiliser pour accéder aux applications en cours d'exécution sur les conteneurs docker sans spécifier de port? Comme un exemple, si je lance une application web déployée par l'intermédiaire d'une image docker dans le port 8080 par l'utilisation de l'option -p 8080:8080 dans le panneau de commande exécuter, je sais que je vais avoir accès sur le port 8080 sur les conteneurs Docker ip /theWebAppName. Mais je ne peux pas vraiment penser à un moyen --net=host option fonctionne.

102voto

lvthillo Points 8424

Après le panneau d'installation, vous avez 3 réseaux par défaut:

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3be8b1ef7ce        bridge              bridge              local
fbff927877c1        host                host                local
023bb5940080        none                null                local

J'essaie de garder cela simple. Donc, si vous commencez un conteneur par défaut, il sera créé à l'intérieur de la passerelle (docker0) du réseau.

$ docker run -d jenkins
1498e581cdba        jenkins             "/bin/tini -- /usr..."   3 minutes ago       Up 3 minutes        8080/tcp, 50000/tcp   friendly_bell

Dans le dockerfile de jenkins les ports 8080 et 50000 sont exposés. Ces ports sont ouverts pour le conteneur sur son pont réseau. Donc, tout à l'intérieur de ce pont réseau peut accéder au conteneur sur le port 8080 et 50000. Tout dans le pont réseau est dans le privé gamme de "Subnet": "172.17.0.0/16", Si vous voulez y accéder de l'extérieur, vous devez mapper les ports -p 8080:8080. Cela permettra de mapper le port de votre conteneur au port de votre serveur réel (le réseau de l'hôte). L'accès à votre serveur en 8080 route pour votre bridgenetwork sur le port 8080.

Maintenant vous avez aussi votre réseau hôte. Qui n'a pas de placer les conteneurs de réseautage. Donc, si vous commencez un conteneur dans le réseau de l'hôte, il ressemblera à ceci (c'est le premier):

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1efd834949b2        jenkins             "/bin/tini -- /usr..."   6 minutes ago       Up 6 minutes                              eloquent_panini
1498e581cdba        jenkins             "/bin/tini -- /usr..."   10 minutes ago      Up 10 minutes       8080/tcp, 50000/tcp   friendly_bell

La différence avec les ports. Votre conteneur est maintenant à l'intérieur de votre réseau hôte. Donc, si vous ouvrez le port 8080 sur votre hôte vous permettra d'accéder au conteneur immédiatement.

$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT

J'ai ouvert le port 8080 dans mon pare-feu, et lorsque je suis maintenant accès aux mon serveur sur le port 8080 je suis à accéder à mon jenkins. Je pense que ce blog est également utile de mieux le comprendre.

0voto

Abhishek D K Points 323
  1. vous pouvez créer votre propre nouveau réseau comme --net = "n'importe quel nom"
  2. Ceci est fait pour isoler les services de différents conteneurs.
  3. supposons que le même service s'exécute dans des conteneurs différents, mais que le mappage de ports reste identique, que le premier conteneur démarre correctement, mais que le même service du deuxième conteneur échoue. aussi, pour éviter cela, changez les mappages de ports ou créez un réseau.

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