为什么使用DOCKER_OPTS =" - iptables = false"会破坏docker-compose的DNS发现?

Zur*_*iar 6 docker docker-compose

当我将此行添加到我的/ etc/default/docker时

DOCKER_OPTS="--iptables=false"
Run Code Online (Sandbox Code Playgroud)

然后DNS不再有效.由docker启动的一组容器不再能够找到彼此:

version: '2'
services:
    elasticsearch:
       image: elasticsearch:latest
       volumes:
          - ./esdata:/usr/share/elasticsearch/data
    kibana:
       image: kibana:latest
       environment:
          - ELASTICSEARCH_URL=http://elasticsearch:9200
Run Code Online (Sandbox Code Playgroud)

设置iptables = false时,上述操作停止.kibana容器无法"找到"elasticsearch容器.但是当删除(和docker引擎重新启动)时,这很好.

为什么是这样?

(更重要的是,当使用ufw时,为什么iptables = false不是默认设置?)

谢谢

Cam*_*lva 14

来自https://docs.docker.com/v1.5/articles/networking/#between-containers

容器是否可以与世界对话受两个因素的制约.

  1. 主机是否愿意转发IP数据包?这由ip_forward系统参数控制.如果此参数为,则数据包只能在容器之间传递1.通常,您只需将Docker服务器保留为默认设置--ip-forward=true,Docker将在服务器启动时为您设置ip_forward为1.

  2. iptables允许这个特殊的连接吗?iptables如果您--iptables=false在守护程序启动时设置,Docker将永远不会更改您的系统规则.否则,Docker服务器会将转发规则附加到DOCKER过滤器链.

Docker不会从DOCKER过滤器链中删除或修改任何预先存在的规则.这允许用户预先创建进一步限制对容器的访问所需的任何规则.

来自https://docs.docker.com/engine/installation/linux/ubuntulinux/#enable-ufw-forwarding

如果在运行Docker的同一主机上使用UFW(简单防火墙),则需要进行其他配置.Docker使用网桥来管理容器网络.默认情况下,UFW会丢弃所有转发流量.因此,要在启用UFW时运行Docker,您必须适当地设置UFW的转发策略.

我认为你的案例的整个配方将是:

  1. DEFAULT_FORWARD_POLICY="ACCEPT"
  2. DOCKER_OPTS="--iptables=false"
  3. 在iptables中配置NAT

有关更多详细信息,您可以在ufw防火墙后面看到Running Docker