docker网络与veth-pair

1.docker的网络模式

1.1 Host模式

与宿主机在同一个网络中,没有独立IP地址,使用宿主机的端口资源。宿主机的ip地址就是该容器的ip地址,但是仍然使用和宿主机不同的文件系统。

1.2 Container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

1.3 None模式

该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。

1.4 Bridge模式

容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

1.4.1 虚拟Bridge

可以将其比作为总线结构,Bridge就是一根线,所有容器可以链接到该Bridge上,然后通过这根Bridge交互数据。

1.4.2 Bridge模式的实现

首先进入到容器内部,并执行ip addr命令

docker exec -it 513451b40f36  bash
root@513451b40f36:/# ip addr

得到如下输出,ip addr命令返回的是机器上存在的所有网卡信息。lo是环回地址(软件实现的硬件设备),另一个是 eth0@if29,这显然也是虚拟软件实现的。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
28: eth0@if29: <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 link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

然后再在宿主机上执行ip addr命令。其中enp0s31f6是唯一真是的物理硬件网卡,其ip地址192.168.10.135。有一个叫docker0的网桥,还有一个29: veth6e47b01@if28的接口,它的master是docker0。

archlab@GG-135:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e0:d5:5e:a1:59:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.135/24 brd 192.168.10.255 scope global dynamic enp0s31f6
       valid_lft 46129sec preferred_lft 46129sec
    inet6 fe80::8951:1f0c:6a2e:72e8/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:5f:25:3c:81 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:5fff:fe25:3c81/64 scope link
       valid_lft forever preferred_lft forever
29: veth6e47b01@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 42:6f:54:d5:de:53 brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::406f:54ff:fed5:de53/64 scope link
       valid_lft forever preferred_lft forever

宿主机中的29: veth6e47b01@if28与容器内部中的28: eth0@if29就是一对veth-pair。

在容器内部执行route命令,查看容器内部路由信息。

root@513451b40f36:/# route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

从输出可见,容器内部默认的ip转发地址是172.17.0.1,也就是说所有发往外部ip地址数据包,都会通过eth0接口,转发至172.17.0.1这个ip地址上。而172.17.0.1这个ip地址,从上面宿主机的ip add的输出中可以看到这个地址就是docker0的地址。

然后再在宿主机上面执行route命令查看宿主机的路由表

archlab@GG-135:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.10.254  0.0.0.0         UG    100    0        0 enp0s31f6
10.244.0.0      *               255.255.255.0   U     0      0        0 cni0
10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1
10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1
link-local      *               255.255.0.0     U     1000   0        0 docker0
172.17.0.0      *               255.255.0.0     U     0      0        0 docker0
192.168.10.0    *               255.255.255.0   U     100    0        0 enp0s31f6

从输出可见,宿主机内部默认的ip转发地址是192.168.10.254,也就是说所有发往外部ip地址数据包,都会通过enp0s31f6接口,转发至192.168.10.254这个ip地址上。192.168.10.254这应该是机房集群的路由网关地址。

1.4.3 容器发送数据例子
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值