26
Docker bridge 网络机制深入剖析-Docker商业环境实战
source link: https://www.tuicool.com/articles/jaYbaaE
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。如有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。
1 网络模式
- Docker 通过网络驱动来支持容器的网络通信,默认情况下,Docker 提供两种网络驱动供我们使用,一个是 bridge,一个是 overlay。
- Docker 安装时会自动在 host 上创建三个网络,我们可用docker network ls命令查看:
root@ubuntu:~# docker network ls NETWORK ID NAME DRIVER SCOPE fe6e820d51e2 bridge bridge local e91fa0de345b host host local 9fea16767e7a none null local 复制代码
2 none 网络
- none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过--network=none指定使用 none 网络。
docker run -it --network=none busybox 复制代码
3 host 网络
- host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过--network=host指定使用 host 网络。
docker run -it --network=host busybox 复制代码
- 使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。
- Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables。
4 bridge 网络
- bridge 是一个很特殊的网络,Docker 安装时会创建一个 命名为 docker0 的 linux bridge,如果不指定 --network,创建的容器默认都会挂到 docker0 上。
- 接口 docker0 是一个虚拟的以太网桥,用于连接容器和本地宿主网络。
root@ubuntu:~# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242f47922c9 no 复制代码
- Docker 每创建一个容器就会创建一组互联的网络接口。这组接口就像管道的两端(就是说,从一端发送的数据会在另一端接收到)。这组接口其中一端作为容器里的 eth0 接口,而领一端统一命名为类似 vethxxxx 这种名字,作为宿主机的一个端口。可以把 veth 接口认为是虚拟网线的一端。这个虚拟网线一端插在名为 docker0 的网桥上,另一端插到容器里。
- 通过把每个 veth 接口绑定到 docker0 网桥,Docker 创建了一个虚拟子网,这个子网由宿主机和所有的 Docker 容器共享。
5 User-defined 网络
5.1 创建 my_bridge 网络
- Docker 本身提供两种网络驱动:bridge 和 overlay。bridge 只能用于单机网络模式,overlay 用于创建跨主机的网络,我们可通过 bridge 驱动创建类似前面默认的 bridge 网络。
root@ubuntu:~# docker network create -d bridge my_bridge 423b660fbdbd5cfacc4cbf591bdf2bc977e7865261349efb6482dbdadxcda3 root@ubuntu:~# docker network ls NETWORK ID NAME DRIVER SCOPE fe6e820d51e2 bridge bridge local e91fa0de345b host host local 423b660fbdbd my_bridge bridge local 9fea16767e7a none null local 查看一下当前 host 的网络结构变化,新增了一个网桥 br-423b660fbdbd root@ubuntu:~# brctl show bridge name bridge id STP enabled interfaces br-423b660fbdbd 8000.0242cb3347fd no docker0 8000.0242f47922c9 no vethcd8f150 复制代码
5.2 自定义网络 IP 段
- 如果要自定义网络 IP 段,只需在创建网段时指定--subnet和--gateway参数:
root@ubuntu:~# docker network create -d bridge --subnet 192.168.31.0/24 --gateway 192.168.31.1 my_bridge2 43043f6bbc1a74106bef92e158daec3ea376748de2f8695541c8e93964303b5b 容器要使用新的网络,需要在启动时通过--network指定: root@ubuntu:~# docker run -it --network=my_bridge2 --name busybox1 busybox / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 42: eth0@if43: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:c0:a8:1f:02 brd ff:ff:ff:ff:ff:ff inet 192.168.31.2/24 scope global eth0 valid_lft forever preferred_lft forever 复制代码
5.3 给容器指定分配静态 IP
- 在启动容器的时候,可以通过参数 --ip 来指定特定的 IP,只有使用--subnet创建的 User-defined 网络才能指定静态 IP。
root@ubuntu:~# docker run -it --network=my_bridge2 --ip 192.168.31.25 --name busybox2 busybox 复制代码
5.4 不同网桥下的容器互通
- 如何才能让 busybox 与 httpd 通信呢?为 httpd 容器添加一块 net_bridge2 的网卡。这个可以通过docker network connect 命令实现。
查看 httpd 容器的 ID。 root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 488e6019f780 busybox "sh" About an hour ago Up 31 minutes busybox2 7bf37788f011 busybox "sh" About an hour ago Up 36 minutes busybox1 c14ec27277f6 httpd "httpd-foreground" 3 hours ago Up 3 hours docker network connect my_bridge2 c14ec27277f6 参考:https://blog.51cto.com/wzlinux/2047243,感谢原作者 复制代码
6 总结
专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。如有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK