【摘要】本文介绍docker网络原理和设置,以及在docker集群中需要解决的问题。最后介绍flannel在解决docker网络问题中的作用。
1 基础
在介绍docker的网络之前,必须先认识docker所依赖的几个linux技术,这对理解docker的网络有帮助。因水平有限这一节仅简单介绍,对linux网络原理感兴趣的TX可以继续深入研究。
1.1 网络命名空间:
Linux Namespaces机制提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都不可见。Linux提供6中命名空间, 现在讲的网络命名空间是其中的一种。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器“通常”会分配一个独立的NetworkNamespace。“通常”的意思是如果docker以host模式启动则与主机在同一个命名空间,后面还会讲到。
这样每个docker容器就好像拥有了一套独立的网络环境,甚至以为自己霸占了全部的主机,也许这也是使人们经常认为容器就是虚机的原因之一吧~~~
1.2 Veth设备对
Veth设备对可以在不同的网络命名空间之间通信,用他们可以连接两个网络命名空间。一对veth设备就像网线的两头一样。
1.3 网桥
简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。类似交换机。
linux内核支持网口的桥接与交换机有一点点不同不同,交换机只是一个二层设备,对于接收到的报文,要么转发、要么丢弃。而运行着linux内核的机器本身就是一台主机,有可能就是网络报文的目的地。其收到的报文除了转发和丢弃,还可能被送到网络协议栈的上层(网络层),从而被自己消化。
在docker启动时,会在主机上创建一个docker0网桥。通过docker0在同一个主机上的容器之间都可以通信,外部的消息也可以经过docker0进入容器。后面还会讲到。
het@het:~$ ifconfig docker0 Link encap:以太网 硬件地址 02:42:df:66:95:96 inet 地址:172.17.0.1 广播:0.0.0.0 掩码:255.255.0.0 inet6 地址: fe80::42:dfff:fe66:9596/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 |
2 Docker网络模式
Docker有以下4种网络模式:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默认设置。
2.1 Bridge模式
2.1.1 模式介绍
我们重点讲这个模式。Bridge是默认模式,正常docker启动时都已这个模式启动。在这个模式下当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。Docker0拥有一个自己的ip地址,有的书上说是172.17.42.1,但是我的机器上是172.17.0.1。总之是个172段的内部地址,机器外是访问不了的。
het@het:~$ ifconfig docker0 Link encap:以太网 硬件地址 02:42:df:66:95:96 inet 地址:172.17.0.1 广播:0.0.0.0 掩码:255.255.0.0 inet6 地址: fe80::42:dfff:fe66:9596/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 跃点数:1 接收数据包:7 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:30 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:480 (480.0 B) 发送字节:4909 (4.9 KB) eth0 Link encap:以太网 硬件地址 08:00:27:02:6c:8b inet 地址:10.43.86.110 广播:10.43.86.255 掩码:255.255.255.0 inet6 地址: fe80::a00:27ff:fe02:6c8b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:140296 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:30286 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:9847208 (9.8 MB) 发送字节:2946052 (2.9 MB) lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536& |