web-dev-qa-db-fra.com

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

Je suis un peu débutant chez Docker. Je n'ai pas trouvé de description claire de ce que cette option fait dans la commande d'exécution du menu fixe en profondeur et un peu confuse à ce sujet.

Pouvons-nous l'utiliser pour accéder aux applications s'exécutant sur des conteneurs Docker sans spécifier de port? Par exemple, si je lance une application Web déployée via une image de menu fixe dans le port 8080 en utilisant l'option -p 8080:8080 dans la commande d'exécution du menu fixe, je sais que je devrai y accéder sur le port 8080 sur les conteneurs Docker ip/theWebAppName. Mais je ne peux vraiment pas imaginer comment l’option --net=Host fonctionne.

33
Ravindu Fernando

Après l'installation du menu fixe, 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 démarrez un conteneur par défaut, il sera créé dans le réseau du pont (docker0).

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

Dans le fichier de docker de jenkins, les ports 8080 et 50000 sont exposés. Ces ports sont ouverts pour le conteneur sur son réseau de ponts. Ainsi, tout ce qui se trouve à l'intérieur de ce pont peut accéder au conteneur sur les ports 8080 et 50000. Tout le réseau du pont se trouve dans la plage privée de "Subnet": "172.17.0.0/16",. Si vous souhaitez y accéder de l'extérieur, vous devez mapper les ports avec -p 8080:8080. Cela mappera le port de votre conteneur sur le port de votre serveur réel (le réseau hôte). Donc, accéder à votre serveur sur 8080 vous mènera à votre pont sur le port 8080

Maintenant, vous avez également votre réseau hôte. Qui ne conteneurise pas les conteneurs en réseau. Donc, si vous démarrez un conteneur dans le réseau 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 est avec les ports. Votre conteneur est maintenant dans votre réseau hôte. Donc, si vous ouvrez le port 8080 sur votre hôte, vous accéderez immédiatement au conteneur. 

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

J'ai ouvert le port 8080 dans mon pare-feu et je suis en train d'accéder à mon serveur via le port 8080. Je pense que ce blog est également utile pour mieux le comprendre. 

69
lvthillo
  1. vous pouvez créer votre propre nouveau réseau comme --net = "anyname"
  2. ceci est fait pour isoler les services de différents conteneurs.
  3. supposons que le même service fonctionne 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. créer un réseau.
0
Abhishek D K