如何通过端口映射来pipe理Docker容器?

我安装了ELK Docker容器 。

我用这些参数运行它:

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

检查检查:

 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 

乔,看起来不错。

以下是Docker容器驻留的KVM guest虚拟机的外部接口:

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

但是在KVMnetworking接口中closures了端口5044(用于Elastic Beats):

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

原因似乎是,我创造了混乱:

 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 

而重启后Docker容器的新IP为172.17.42.10.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掩码:255.255.0.0

那么,如何以某种方式重新启动/pipe理Docker容器,这样我就不会遇到IPtables冲突

如何解决这个问题,而不是每次都创build一个Docker / IPtables混沌? 我不想手动清除Docker的iptables。

首要的是 – 这是因为你有一点误解。 Docker容器在Dockernetworking中具有dynamicIP地址。 如果你试图依靠这种静态的方式,你就会痛苦的。

所以不要 – 只是习惯于容器必须有IP地址工作的想法,你不应该直接引用它们。 你有很多避免这种情况的方法:

  • docker inspect +将环境variables传递给容器。
  • 随着更新的docker(1.10 +),你有一个名字服务
  • haproxy可以将stream量dynamic地重新路由到一系列IP地址,因此您可以使用haproxy + confd + etcd来“检测”容器位置,并dynamic地将新条目添加到haproxyconfiguration中。