简介
通过 Docker 容器可以实现文件系统, 网络和内核的隔离。 Docker 网络是使用 Docker 的一个很重要的知识点。 在不了解 Docker 网络的情况下使用 Docker 部署应用可能会出现 Docker 容器跨过宿主机防火墙(iptables)的限制直接与取得外网访问权的情况。 在这篇文章中将会分析安装 Docker 对宿主机网络设备和 iptables 两个重要的网络环境的影响。 并会分析何为 Docker 容器网络的隔离性, 如何通过控制宿主机 iptables 来控制 Docker 容器的网络访问权限。
跨越宿主机防火墙示例
首先在宿主机上设置一个防火墙, 将 INPUT 链的默认策略设为 DROP
$ iptables -P INPUT DROP
然后执行查看 iptables 的命令
$ iptables-save
可以看到 filter 表的 INPUT 链的默认策略为 DROP
然后 ping 百度, 由于 INPUT 链的默认规则为 DROP , 导致 DNS 服务器返回的解析结果不能正确接受, 所以这里直接 ping 解析出的 ip 地址。
$ ping -c4 14.215.177.39
执行结果为
可以看到宿主机在不使用 iptables 手动设置 INPUT 链的情况下已经和外界网络隔绝了。
接着创建一个 Docker 容器并执行 ping -c4 www.baidu.com
的命令
$ docker run --rm debian:stretch-slim bash -c "\
echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list\
&& apt-get update > /dev/null\
&& apt-get install -y inetutils-ping >/dev/null 2>&1\
&& ping -c4 www.baidu.com"
可以看到能够正确接收 DNS 服务器返回的解析结果, 并且能够成功 ping 通。
这就是所谓的 Docker 容器网络环境和宿主机网络环境互相隔离。 接下来就会详解 Docker 是如何操作宿主机的网络设备来实现 Docker 容器和宿主机网络隔离的。
安装 Docker 对宿主机网络环境的影响
在这里需要准备一个全新安装的虚拟机(这里使用的是 debian9 gnome), 然后对比安装前后宿主机网络环境的变化。
安装前网络环境
首先查看安装 Docker 前的网络设备, 输入查看网络设备的命令
$ ip a
只有两个网络设备, 一个是主机的回环设备, 一个是主机的外接网卡。
接着查看安装 Docker 前的 iptables, 输入查看 iptables 的命令
$ iptables-save
然后输出的内容可能为空, 也可能是下面的内容