docker互联网连接与iptables = false

我放弃。 我在ubuntu 16.04下使用Docker 1.12.0加强了UFW。

该机器有两个接口 – 一个公共(eth0)和一个专用networking(eth1)

Server Version: 1.12.3 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 15 Dirperm1 Supported: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: null bridge host overlay Swarm: inactive Runtimes: runc Default Runtime: runc Security Options: apparmor seccomp Kernel Version: 4.4.0-47-generic Operating System: Ubuntu 16.04.1 LTS OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 488.5 MiB Name: image-base ID: 2473:FGJQ:MEEC:CEWY:BSLR:SYB5:EXMO:WJBE:7MMM:DIZH:NJQF:L5NA Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ WARNING: No swap limit support Insecure Registries: 127.0.0.0/8 

就像我以前的版本一样,我将“iptables”configuration为false,因此docker不会更改我的防火墙。

但是在最新版本的docker(11+)中,这个命令有一个副作用 – 重启后,docker容器停止访问networking(ping www.google.com)。

我一遍又一遍地证实了这一点。 如何重现: – 停止docker守护进程

 sudo systemctl stop docker 

我通过添加文件/etc/docker/daemon.json来configurationiptables = false:

 { "iptables" : false } 

(这是唯一的configuration)

启动守护进程:

 sudo systemctl start docker docker run --rm python ping www.google.com 

即使它会为你工作 – 如果你重新启动系统 – 它将停止工作…你有任何解决scheme?

我检查了我的iptables规则,重新启动系统后,我错过了这些规则:

 :PREROUTING ACCEPT [8:496] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :DOCKER - [0:0] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE -A POSTROUTING -s 172.18.0.0/16 ! -o br-a0b355ce53ac -j MASQUERADE -A DOCKER -i docker0 -j RETURN -A DOCKER -i br-a0b355ce53ac -j RETURN # same :DOCKER - [0:0] :DOCKER-ISOLATION - [0:0] # same -A FORWARD -j DOCKER-ISOLATION -A FORWARD -o docker0 -j DOCKER -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i docker0 ! -o docker0 -j ACCEPT -A FORWARD -i docker0 -o docker0 -j ACCEPT -A FORWARD -o br-a0b355ce53ac -j DOCKER -A FORWARD -o br-a0b355ce53ac -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i br-a0b355ce53ac ! -o br-a0b355ce53ac -j ACCEPT -A FORWARD -i br-a0b355ce53ac -o br-a0b355ce53ac -j ACCEPT # same -A DOCKER-ISOLATION -i br-a0b355ce53ac -o docker0 -j DROP -A DOCKER-ISOLATION -i docker0 -o br-a0b355ce53ac -j DROP -A DOCKER-ISOLATION -j RETURN 

谢谢!

dockernetworking模型使用iptables为您的容器设置互联网连接。 我只会设置iptables = false,如果你明确不希望你的容器使用网桥或覆盖networking驱动程序有任何networking连接。

当你使用iptables = true启动守护进程时,它会在防火墙中设置所需的规则。 当docker停靠的时候,我不相信它会把这些规则撕下来,所以他们会坚持下去。 这就是为什么你启动docker备份与iptables = false后,互联网连接。 如果要在重新启动后在下一个docker启动时保留这些规则,最好的方法是保持iptables = true。