Docker网络实现

《docker入门与实践》笔记
Docker的网络其实是利用Linux上的网络命名空间和虚拟网络设备(veth pair)实现的。

一、基本原理

  • 直观上看,要实现网络通信,机器需要至少一个网络接口(物理网络接口或虚拟网络接口)与外界相通,并可以收发数据包;此外,如果要实现不同子网之间的通信,需额外配置路由。
  • Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高。这是因为Linux通过内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口的发送缓存中的数据包将被直接复制到接收皆苦的接受缓存中,无需通过外部物理网络设备进行交换。这个拷贝实在内核态直接完成,不需要两态切换。
  • Docker容器网络很好的利用了Linux的虚拟网络技术,它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连同。
Docker的网络实现

二、网络创建过程

  1. 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中。
// 创建一个容器
docker run -it --rm busybox 
  1. 本地主机一端的虚拟接口连接到默认的docker0网桥或指定的网桥上,并具有一个以veth开头的唯一名字,如:veth22f630c
// 查看主机分配的veth接口
ifconfig 或者ip addr show
ifconfig
// 查看veth22f630c接口连接到docker0网桥上
brctl show
brctl show
  1. 容器一端的虚拟接口将放到新创建的容器中,并修改名字为eth0。这个接口只有容器的命名空间可见。
ifconfig
  1. 从网桥可用地址段中获取一个空闲的地址分配给容器的eth0(例如: 172.17.0.2/16),并配置默认网关为docker0网卡的内部接口docker0的IP地址(例如:172.17.0.1/16)
// 查看docker0的IP
ifconfig docker0
ifconfig docker0
// 查看容器的IP,网关
docker inspect fc8da94bafdd(containerid)
docker inspect containerid
  1. 完成这些之后,容器就可以使用eth0虚拟网卡来连接其他容器和访问外部网络了。

三、网络配置

docker运行的时候通过--net参数指定容器的网络配置,有4个可选值bridge、host、container、none:

  • --net=bridge:默认值,在Docker网桥上为容器创建新的网络栈。
  • --net=host:告诉 Docker不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其他root进程一样打开低范围的端口,可以访问本地网络服务比如D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用-- privileged=true参数,
    容器甚至会被允许直接配置主机的网络堆栈。
  • --net=container:让Docker将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享IP地址和端口等网络资源,两者进程可以直接通过lo环回接口通信。
  • --net=none:让Docker将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。

四、网络配置细节

用户使用--net=none后,Docker将不对容器网络进行配置。下面,将手动完成配置网络的整个过程。

  1. --net=none创建一个容器:
// 创建容器(containerid:fc1f71546394)
docker run -it --rm --net=none busybox
  1. 在本地主机查找容器的进程id,并为它创建网络命名空间:
// 查看容器的进程id
docker inspect -f "{{.State.Pid}}" fc1f71546394
docker inspect -f "{{.State.Pid}} fc1f71546396"
// 为容器创建网络命名空间
pid=58930
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
  1. 查看桥接网卡的IP和子网掩码信息:
```
ip addr show docker0
```
ip addr show docker0
  1. 创建一对"veth pair"接口veth_host和veth_container,绑定veth_host到网桥docker0,并启动veth_host:
// 创建一对veth pair
sudo ip link add veth_host type veth peer name veth_container
// 将veth_host接口添加到docker0网桥上
sudo brctl addif docker0 veth_host
// 激活veth_host接口
sudo ip link set veth_host up
// 查看veth_host接口信息
ifconfig veth_host
// 查看docker0情况
brctl show
创建veth pair
  1. 将veth_container接口放到容器的网络命名空间,命名为eth0,启动它并配置一个可用IP(172.17.0.3/16)和默认网关(172.17.0.1):
// 将veth_container接口放到容器的网络命名空间
sudo ip link set veth_container netns $pid
// veth_container 设置容器内的别名eth0
sudo ip netns exec $pid ip link set dev veth_container name eth0
// 激活容器内的eth0接口 
sudo ip netns exec $pid ip link set eth0 up
 // 给容器内的eth0设置ip
sudo ip netns exec $pid ip addr add 172.17.0.3/16 dev eth0
 // 给容器内的设置默认网关
sudo ip netns exec $pid ip route add default via 172.17.0.1
设置veth_container
  1. 以上就是Docker配置网络的具体过程
    当容器终止后,Docker会清空容器,容器内的网络接口会随着网络命名空间一起被清除,veth_host 接口也会自动从docker0卸载并清除。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355