docker网络
介绍docker自带的几种网络模型
自去年就开始推动公司业务使用docker了, 至今也一年多了,但对docker网络的认知一直一知半解。。。
主要是太忙,加上线上业务也没出过关于网络吞吐性能方面的问题,就没太大动力去搞明白, 现在闲下来了,搞之!
环境声明
- 以下内容只针对OS: Ubuntu16.04 docker: 1.10.3的环境, 写本文时docker最新的release版本是1.11.2,还有什么CoreOS,Unikernel 之类的(表示都没玩过)。
docker更新迭代速度太快了,公司业务只用到基本功能,所以没动力跟进它的更新了 各种新时代下的产物频出啊, CoreOS为linux的发行版, 没需求,好遗憾.
docker的网络模式
一开始安装完docker, 它就会默认创建3个网络, 使用__docker network ls__查看
➜ blog git:(master) docker network ls
NETWORK ID NAME DRIVER
46416a43fbc6 bridge bridge
45398901e9f0 none null
9440a8140e68 host host
当启动一个容器时, 默认使用bridge模式, 可以通过 --net 指定其它模式。
下面先简要说明下各自的概念
- bridge 模式
容器间之所以能通信,就靠宿主机上的docker0了, docker0就是bridge模式下默认创建的虚拟设备名称
➜ blog git:(master) ✗ ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:49:56:7c:3b
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:49ff:fe56:7c3b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:78103 errors:0 dropped:0 overruns:0 frame:0
TX packets:47578 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:17485434 (17.4 MB) TX bytes:82163889 (82.1 MB)
ifocnfig可以看到很多信息, mac地址,IP等这些也可以通过参数指定成别的。
- none模式
none网络模式下的容器里是缺少网络接口的,例如eth0等,但会有一个lo设备。
没用过也没见过这样的业务场景, 不做过多说明
- host模式
容器直接操作宿主机的网络栈, 无疑是性能最好的网络模式, 可以认为是无带宽损耗的。
细说bridge模式
这也是我们线上正在在用的网络模式。
bridge模式主要利用了iptables的Masquerading和DNAT功能。
未完。。。
最后修改 January 23, 2022: 迁移陈年老文到新站 (1588b8b)