Docker的基本学习 ~ Docker的网络

总结在单个主机上 Docker 网络的机制。

整体图像

DockerNetwork.png

大致总结如下:
* 主机会创建一个名为docker0的虚拟桥接器。
* 容器通过veth接口连接到虚拟桥接器。
* 容器内部会显示存在一个名为eth0的网络接口(实际上是veth)。
* 容器内部的eth0会自动分配一个可用的IP地址(因此,IP地址是不确定的)。
* 为了从容器中与主机外部进行通信,会使用NAT(IP伪装)。
* 在单台主机上容器之间的通信会经过虚拟桥接器进行(因此,可以使用容器内部可见的172.17.0.0/16地址进行通信)。

再多提供一些详细信息

我尝试着查找一些不明白的地方。

虚拟桥

在Linux上配置虚拟的L2交换机的功能(比如在VMware ESXi中,可能指的是虚拟交换机)。在安装了Docker的Linux主机上,会创建名为docker0的虚拟桥接器。

# インターフェイスの表示
$ ifconfig -a
docker0   Link encap:Ethernet  HWaddr 56:84:7A:FE:97:99
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          (略...)

eth0      Link encap:Ethernet  HWaddr 06:D8:0E:5D:B8:C9
          inet addr:10.0.0.73  Bcast:10.0.0.255  Mask:255.255.255.0
          (略...)

# 仮想ブリッジの情報を表示してみる。
$ sudo yum install bridge-utils
$ brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.56847afe9799       no

獸醫助理

veth是一种虚拟网络接口(虚拟NIC)。不过,它不仅仅是普通的虚拟NIC,创建veth后会生成一对虚拟NIC,这两个NIC之间可以进行通信(类似使用交叉网线直接连接两个NIC进行通信)。

两个veth中的一个被放入容器的网络命名空间中,只能从容器内部可见。此外,在容器内部,该veth的名称也被更改为eth0。
另一个veth连接到主机端的虚拟桥接器(docker0)。

在启动容器后,可以从主机上看到以下方式创建了veth。

$ ifconfig -a
docker0   Link encap:Ethernet  HWaddr 56:84:7A:FE:97:99
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          (略...)

eth0      Link encap:Ethernet  HWaddr 06:D8:0E:5D:B8:C9
          inet addr:10.0.0.73  Bcast:10.0.0.255  Mask:255.255.255.0
          (略...)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          (略...)

# コンテナを起動したら作成された(ホスト側の veth)
vethbe8a6db Link encap:Ethernet  HWaddr E6:B0:26:46:48:C6
          inet6 addr: fe80::e4b0:26ff:fe46:48c6/64 Scope:Link
          UP BROADCAST RUNNING  MTU:9001  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:508 (508.0 b)  TX bytes:438 (438.0 b)

# たぶん、ホスト側の veth が仮想ブリッジ(docker0)に接続されていることを表している
$ brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.56847afe9799       no              vethbe8a6db

并且,在容器内能看到 eth0。此外,默认网关(DGW)是主机的 docker0 IP地址,通过该 DGW 进行 NAT 将与外部通信。

# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          (略...)

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

为容器分配IP地址

容器会从Docker管理的地址空间中自动分配未被使用的IP地址。因此,容器内的IP地址是不确定的。

因此,假设在同一主机上有两个容器,如果想要从一个容器与另一个容器进行通信,可以通过使用链接功能获取连接目标的IP地址并进行连接的方式。

参考网站

以KVM为基础构建私有云的第一步
第6篇:Linux内核的容器功能[5]─网络
Docker入门:容器虚拟化技术的原理和用法

广告
将在 10 秒后关闭
bannerAds