Docker的基本学习 ~ Docker的网络
总结在单个主机上 Docker 网络的机制。
整体图像
![DockerNetwork.png](https://cdn.silicloud.com/blog-img/blog/img/657d206a37434c4406c1f0f7/2-0.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入门:容器虚拟化技术的原理和用法