Docker   发布时间:2019-11-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Docker 网络之理解 bridge 驱动大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

https://www.cnblogs.com/sparkdev/p/9198109.html" target="_blank">Docker 网络之进阶篇》中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式。为了深入理解 CNM 及最常用的 bridge 驱动,本文将探索 bridge 驱动的实现机制。

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/311f2f0df363d4a0b4ef650b4b0bae2f.png" >

有了这个网卡,宿主机还会在内核的路由表中添加一条到达相应网络的静态路由记录:

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/2821c9aa801eff2524f341dd5e2ec6e7.png" >

我们创建一个名为 mycon 的容器,并观察其网络配置:

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/4ce81ff7a64d128582b6d694b2681871.png" width="746" height="148">

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/b5db9fe87af91bd2af43fb36b3193e10.png" >

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/3e41a3f45fe66a120b0103b91a56720f.png" >

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

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/c0550972accee489f299cb0d51e2812e.png" >

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

  • 可以获取的 IP 地址范围。Docker 容器默认可以获取的 IP 范围为 docker 网桥的整个子网范围,此参数可以将其缩小到某个子网范围内,所以这个参数必须在 docker 网桥的子网范围内。

可以创建一个自定义网桥 br0:

$ br0 .

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/26fa6248b4a02057ec28643a6aed2ef7.png" >

即可。

outING 链上的有这么一条规则:

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

怎么办呢?接下来我们将启动一个简单的 web 服务器:

$ 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 -

WARD 规则允许所有的外部 IP 访问容器,我们可以通过在 filter 的 DOCKER 链上添加规则来对外部的 IP 访问做出限制,比如只允许源 IP 为 192.168.21.212(笔者是在局域网内演示的)的数据包访问容器,添加的规则如下:

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

WARD 链中增加一条  ACCEPT 的规则(--icc=truE)

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

false 时,上面的规则被设置为 DROP,容器间的相互通信就被禁止了,这时如果想让两个容器通信就需要在 docker run 命令中使用 --link 选项。

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

$ /proc/sys/net/ipv4/ip_forWARD

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/b0161145a9b31bfdefa235a10e8a3afa.png" >

WARD 功能已经打开。

Name)

可以创建很多个 docker 容器,但是这些容器的 hostname 并不相同,也就是说 hostname 并没有被写入到镜像中。实际上容器中的 /etc 目录下有 3 个文件是在容器启动后被虚拟文件覆盖掉的,分别是 /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=ordered) /dev/mapper/ubuntu--vg-root on /etc/ type ext4 (rw,data=ordered) /dev/mapper/ubuntu--vg-root on /etc/hosts type ext4 (rw,data=ordered) …

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

  • 和 /etc/hosts 文件中,也可以在容器的 bash 提示符中看到。

如下面的 demo:

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

title="Docker 网络之理解 bridge 驱动" alt="Docker 网络之理解 bridge 驱动" src="https://cn.js-code.com/res/2019/02-09/09/5d7304ca4ebfecd72dc3528075165d01.png" >

WARD 以及 iptables 等核心功能的。因此在学习 docker 的过程中,适当的补充 linux 相关的知识也是十分必要的!

考:

大佬总结

以上是大佬教程为你收集整理的Docker 网络之理解 bridge 驱动全部内容,希望文章能够帮你解决Docker 网络之理解 bridge 驱动所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: