如何使用端口映射来管理 Docker 容器?

如何使用端口映射来管理 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            

乔,看起来不错。

这是 KVM 客户机的外部接口,Docker 容器驻留在其中:

marius@elk:~$ ifconfig eth0 eth0 链路封装:以太网 HWaddr 52:54:00:15:cf:f2
inet addr:192.168.100.134 Bcast:192.168.100.255 掩码:255.255.255.0

但是 KVM 网络接口中的端口 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 容器的新 IP172.17.42.10.4

marius@elk:~$ /sbin/ifconfig docker0 链接封装:以太网 HWaddr a6:3d:01:38:7a:6a
inet addr:172.17.42.1 Bcast:0.0.0.0 掩码:255.255.0.0

那么,我该如何重启/管理 Docker 容器,以免遇到 IPtables 冲突

我应该如何修复这个问题而不每次都造成 Docker / IPtables 混乱?我不想手动清除 Docker 的 iptables。

答案1

首先,这是因为你的操作有点误解。Docker 容器在 docker 网络内具有动态 IP 寻址。如果你尝试依赖静态 IP 寻址,那你就是在自找麻烦。

所以不要 - 习惯这个想法:虽然容器必须有 IP 地址才能工作,但你永远不应该直接引用它们。你有许多方法可以避免这种情况:

  • docker inspect+ 将环境变量传递给容器。
  • 使用较新的docker(1.10+),你有一个名称服务
  • haproxy 可以动态地将流量重新路由到一系列 IP 地址,因此您可以使用类似haproxy++confd之类的东西etcd来“检测”容器位置,并动态地将新条目添加到 haproxy 配置中。

相关内容