Docker bridge 网络机制深入剖析-Docker商业环境实战

专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。如有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。

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:  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:  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 总结

专注于大数据及容器云核心技术解密,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。如有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。