4种网络模式
· none模式
容器拥有自己的Network Namespace,但是并不进行任何网络配置。使用此模式创建的容器没有网卡、IP、路由等信息,需要为Docker容器添加网卡、配置IP等。
· bridge模式
默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
bridge模式单机网络拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,主机上的所有容器就通过docker0这个交换机连在了一个二层网络中。
Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。
一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(可以认为docker0是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。
· container模式
指定新创建的容器和已经存在的一个容器共享一个Network Namespace。新创建的容器不会创建自己的网卡,配置自己的IP,而是和指定的容器共享IP、端口范围等。两个容器的进程可以通过lo网卡设备通信。
· host模式
和宿主机共用一个Network Namespace,容器使用宿主机的IP和端口,在容器内看到的网卡ip是宿主机上的ip (局限:容器里启动的端口会与宿主机的端口冲突)。
跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对很多集群应用来说效率较低。按实现原理可分直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等。