Docker 网络之理解 bridge 驱动

前端之家收集整理的这篇文章主要介绍了Docker 网络之理解 bridge 驱动前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

》中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式。为了深入理解 CNM 及最常用的 bridge 驱动,本文将探索 bridge 驱动的实现机制。

添加一条到达相应网络的静态路由记录:

docker0 并不是一个简单的网卡设备,而是一个网桥!下图展示了 docker bridge 网络模式的拓扑图:

这里网桥的概念等同于交换机,为连在其上的设备转发数据帧。网桥上的 veth 网卡设备相当于交换机上的端口,可以将多个容器连接在它们上面,这些端口工作在二层,所以是不需要配置 IP 信息的。上图中的 docker0 网桥就为连在其上的容器转发数据帧,使得同一台宿主机上的 docker 容器之间可以相互通信。既然 docker0 是二层设备,那么它为什么还需要 IP 呢?其实,docker0 是一个普通的 linux 网桥,是可以为它配置 IP 的,我们可以认为它的内部有一个可以用于配置 IP 的网卡。Docker0 的 IP 地址作为所连接的容器的默认网关地址

自动创建的,其默认 IP 为 172.17.0.1/16,之后通过 bridge 驱动创建的容器都会在 docker0 的子网范围内选取一个未占用的 IP 使用,并连接到 docker0 网桥上。Docker daemon 提供了如下参数可以帮助用户自定义 docker0 的设置。

    @H_301_73@用户自定义的网桥无效。 @H_301_73@获取的 IP 地址范围。Docker 容器默认可以获取的 IP 范围为 docker 网桥的整个子网范围,此参数可以将其缩小到某个子网范围内,所以这个参数必须在 docker 网桥的子网范围内。 @H_301_73@

用户还可以使用自定义的网桥,然后通过 --bridge=BRIDGE 参数传递给 docker daemon。比如我们可以创建一个自定义网桥 br0:

$ br0 .

添加一些 iptables 规则,用于 docker 容器之间已经容器与外界的通信。我们可以通过 iptables-save 命令查看到 nat 表上 POSTROUTING 链上的有这么一条规则:

-A POSTROUTING -s ./ ! -o docker0 -j MASQUERADE

$ docker run -d -p : --name=myweb ljfpower/nodedemo

$ iptables-*-A DOCKER ! -i docker0 -p tcp -m tcp --dport -j DNAT --to-destination .:*-A DOCKER -d ./ ! -i docker0 -o docker0 -p tcp -m tcp --dport -

增加来一条规则,这两条规则将访问宿主机 3000 端口的请求转发到 172.17.0.3 的 3000 端口上(提供服务的 docker 容器的 IP 和端口),所以外界访问 docker 容器是通过 iptables 做 DNAT 实现的。添加规则来对外部的 IP 访问做出限制,比如只允许源 IP 为 192.168.21.212(笔者是在局域网内演示的)的数据包访问容器,添加的规则如下:

$ iptables -I DOCKER -i docker0 ! -s . -j DROP

增加一条  ACCEPT 的规则(--icc=true):

-A FORWARD -i docker0 -o docker0 -j ACCEPT

禁止了,这时如果想让两个容器通信就需要在 docker run 命令中使用 --link 选项。

功能打开,就是把内核参数 ip_forward 设置为 1。Docker daemon 在启动的时候会执行这个操作,我们可以通过下面的命令进行检查:

$ /proc/sys/net/ipv4/ip_forward

功能已经打开。

文件是在容器启动后被虚拟文件覆盖掉的,分别是 /etc/hostname、/etc/hosts 和 /etc/resolv.conf,通过在容器中运行 mount 命令可以看到它们:

# /dev/mapper/ubuntu--vg-root on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=/dev/mapper/ubuntu--vg-root on /etc/ type ext4 (rw,data=/dev/mapper/ubuntu--vg-root on /etc/hosts type ext4 (rw,data=

解决主机名的问题,同时也能让 DNS 及时更新(改变 resolv.conf)。由于这些文件的维护方法会随着 docker 版本的升级而不断变化,所以尽量不要修改这些文件,而是通过 docker 提供的相关参数进行设置,其参数配置方式如下。

    @H_301_73@名称会写入到 /etc/hostname 和 /etc/hosts 文件中,也可以在容器的 bash 提示符中看到。 @H_301_73@文件中。

$ docker run -it --name mycon -h lion --dns=. ubuntu:

功能来探索 docker 网络中的 bridge 驱动的实现机制。从本文中不难看出,linux 系统中,docker 的 bridge 驱动是依赖于系统的 ip forward 以及 iptables 等核心功能的。因此在学习 docker 的过程中,适当的补充 linux 相关的知识也是十分必要的!

猜你在找的Docker相关文章