Docker的四种网络模式的详解

容器的四种网络模式:
bridge 桥接模式、host 模式、container 模式和 none 模式
启动容器时可以使用 –net 参数指定,默认是桥接模式

第一种:bridge 桥接模式

这里写图片描述
Bridge 桥接模式的实现步骤主要如下:
(1) Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为
veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将
报文传输给另一方。
(2) Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
(3) Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。
如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到
Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网
络环境的隔离性。
bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,
该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致
的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了
这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器
内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层
网络上的实现手段,故肯定会影响网络的传输效率。

[root@foundation23 ~]# docker run -it --name vm3  ubuntu
root@087db1d78f8d:/# 
root@087db1d78f8d:/# 
root@087db1d78f8d:/# 
root@087db1d78f8d:/# 
root@087db1d78f8d:/# [root@foundation23 ~]# 
[root@foundation23 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.0021cc60955c   no      enp0s25
docker0     8000.024280b77f87   no      veth61bcfed
                            veth85fd065
virbr0      8000.52540084a6f7   yes     virbr0-nic
virbr1      8000.525400933c0f   yes     virbr1-nic
[root@foundation23 ~]# docker run -it --name vm4  ubuntu
root@b9891b02e536:/# 
root@b9891b02e536:/# 
root@b9891b02e536:/# [root@foundation23 ~]# 
[root@foundation23 ~]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.0021cc60955c   no      enp0s25
docker0     8000.024280b77f87   no      veth61bcfed
                            veth85fd065
                            vethc9fe6eb
virbr0      8000.52540084a6f7   yes     virbr0-nic
virbr1      8000.525400933c0f   yes     virbr1-nic

这里写图片描述

第二种:host 模式

这里写图片描述
Host 网络模式:
host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用
宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公
有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,
有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性
的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽
然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱
化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资
源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网
络模式容器的端口映射。Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用

[root@foundation23 ~]# docker run -it --name vm3 --net host  ubuntu
root@foundation23:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:21:cc:60:95:5c brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 74:e5:43:06:25:e3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.13/24 brd 192.168.43.255 scope global dynamic wlp3s0
       valid_lft 2760sec preferred_lft 2760sec
    inet6 fe80::cae6:8188:d473:639e/64 scope link 
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:21:cc:60:95:5c brd ff:ff:ff:ff:ff:ff
    inet 172.25.23.250/24 brd 172.25.23.255 scope global br0

第三种:container 模式

这里写图片描述
Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用
other container 的 namespace。
Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输
效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他
容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,
它并没有改善容器与宿主机以外世界通信的情况。

[root@foundation23 ~]# docker run -it --name vm4 --net container:vm2  ubuntu
root@7d97c628140a:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
50: eth0@if51: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

这里写图片描述
第四种:none模式
None 网络模式:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了
none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“
少即是多”
,在
没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制
开发。这也恰巧体现了 Docker 设计理念的开放。
在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟
化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。
使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则
等都是独立的,就好像进入了另外一个网络一样。

容器上进行:

[root@foundation23 ~]# docker run -it --name vm5 --net none  ubuntu
root@aa86d668b15c:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

这里写图片描述

 cd /var/run
 ip netns add test
 cd netns/
 ip netns del test
 ln -s /proc/15149/ns/net /var/run/netns/15149
 ip link add name veth0 type veth peer name veth1
ip addr
53: vethaba7efa@if52: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 32:b7:2e:60:cd:d6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::30b7:2eff:fe60:cdd6/64 scope link 
       valid_lft forever preferred_lft forever
55: veth0@if54: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP qlen 1000
    link/ether d2:64:8d:6d:48:33 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::d064:8dff:fe6d:4833/64 scope link 

 brctl show
 brctl addif docker0 veth0
 ip addr
 ip link set up veth0
 ip link set up veth1
 ip link set veth1 netns 15149

这里写图片描述

[root@foundation23 netns]# ip netns exec 15149 ip link set veth1 name eth0
[root@foundation23 netns]# ip netns exec 15149 ip link set up dev eth0
[root@foundation23 netns]# ip netns exec 15149 ip addr add 172.17.0.50/24 dev eth0
[root@foundation23 netns]# ip netns exec 15149 ip route add default via 172.17.0.1

[root@foundation23 netns]# ping baidu.com
PING baidu.com (220.181.57.216) 56(84) bytes of data.
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=1 ttl=49 time=52.4 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=2 ttl=49 time=46.2 ms
64 bytes from 220.181.57.216 (220.181.57.216): icmp_seq=3 ttl=49 time=52.1 ms
^C
--- baidu.com ping statistics ---

这里写图片描述

容器上进行:

root@aa86d668b15c:/# echo nameserver 114.114.114.114 >  /etc/resolv.conf 
root@aa86d668b15c:/# ping baidu.com
PING baidu.com (123.125.115.110) 56(84) bytes of data.
64 bytes from 123.125.115.110: icmp_seq=1 ttl=49 time=148 ms
64 bytes from 123.125.115.110: icmp_seq=2 ttl=49 time=105 ms
64 bytes from 123.125.115.110: icmp_seq=3 ttl=49 time=81.5 ms

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ningyuxuan123/article/details/81840517