2 votes

Comment gérer un conteneur Docker avec le mappage des ports ?

J'ai installé le conteneur Docker ELK .

Je l'exécute avec les paramètres suivants :

sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 5000:5000 -it --name elk sebp/elk

Vérifier vérifier :

sudo docker ps

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                                                                                      NAMES
4f42137c954d        sebp/elk:latest     "/usr/local/bin/star   22 hours ago        Up 22 hours         0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp, 0.0.0.0:5601->5601/tcp, 0.0.0.0:9200->9200/tcp, 9300/tcp   elk            

Jo, ça a l'air bien.

Voici l'interface externe de l'invité KVM, dans lequel résident les conteneurs Docker :

marius@elk:~$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 52:54:00:15:cf:f2
inet addr:192.168.100.134 Bcast:192.168.100.255 Mask:255.255.255.0

Mais le port 5044 (pour Elastic Beats par exemple) est fermé dans l'interface réseau KVM :

marius@elk:~$ nc -v 192.168.100.134 5044
nc: connect to 192.168.100.134 port 5044 (tcp) failed: Connection refused

La raison en est, semble-t-il, que j'ai créé le chaos :

marius@elk:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:5000
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:5044
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:5601
ACCEPT     tcp  --  anywhere             172.17.0.4           tcp dpt:9200

Et la nouvelle IP du conteneur Docker après un redémarrage est la suivante 172.17.42.1 y 0.4

marius@elk:~$ /sbin/ifconfig docker0 Link encap:Ethernet HWaddr a6:3d:01:38:7a:6a
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0

Alors, comment redémarrer / gérer un conteneur Docker de manière à ne pas rencontrer de conflits IPtables ?

Et comment résoudre ce problème sans créer un chaos Docker / IPtables à chaque fois ? Je ne veux pas rincer manuellement les iptables de Docker.

2voto

Sobrique Points 3695

Tout d'abord, c'est parce que vous vous faites des idées fausses. Les conteneurs Docker disposent d'un adressage IP dynamique au sein du réseau Docker. Vous vous exposez à des problèmes si vous essayez de compter sur le fait que cela soit statique.

Il faut donc se faire à l'idée que si les conteneurs doivent avoir des adresses IP pour fonctionner, il ne faut jamais s'y référer directement. Il existe plusieurs façons d'éviter cela :

  • docker inspect + transmettre des variables d'environnement aux conteneurs.
  • Avec les dernières versions de Docker (1.10+), vous disposez d'une fonction service des noms
  • haproxy peut réacheminer dynamiquement le trafic vers une série d'adresses IP, de sorte que vous pouvez utiliser quelque chose comme haproxy + confd + etcd pour "détecter" l'emplacement des conteneurs et ajouter dynamiquement de nouvelles entrées à la configuration de haproxy.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X