Como gerenciar um contêiner Docker com mapeamento de porta?

1

Eu instalei o contêiner do Docker do ELK .

Eu corri com esses parâmetros:

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

Verifique a verificação:

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, parece ser bom.

Aqui está a interface externa do convidado KVM, na qual residem os contêineres 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 Máscara: 255.255.255.0

Mas a porta 5044 (para o Elastic Beats, por exemplo) é fechada na interface de rede do KVM:

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

A razão para isso parece ser que eu criei o caos:

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

E o novo IP do contêiner do Docker após a reinicialização é 172.17.42.1 e 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 Máscara: 255.255.0.0

Então, como faço para reiniciar / gerenciar um contêiner do Docker de uma maneira, para que eu não entre em conflitos de IPtables

E como corrijo isso sem criar um caos Docker / IPtables a cada vez? Eu não quero limpar manualmente o iptables do Docker.

    
por wishi 16.03.2016 / 13:20

1 resposta

1

Em primeiro lugar - isso é porque você está operando com um conceito equivocado. Os contêineres Docker possuem endereçamento IP dinâmico na rede docker. Você está pedindo dor, se você tentar e confiar em ser estático.

Portanto, não se acostume com a idéia de que, embora os contêineres precisem ter endereços IP para funcionar, você nunca deve se referir a eles diretamente. Você tem várias maneiras de evitar isso:

  • docker inspect + passar variáveis de ambiente para contêineres.
  • Com a nova janela de encaixe (1.10+), você tem um serviço de nomes
  • O haproxy pode redirecionar dinamicamente o tráfego para um intervalo de endereços IP, para que você possa usar algo como haproxy + confd + etcd para "detectar" locais de contêiner e adicionar dinamicamente novas entradas à configuração haproxy.
por 21.03.2016 / 12:34