单host下Docker的默认网络配置

本文用到的环境如下:
host: centos7
docker: 通过yum install -y docker安装,版本号为1.10.3
docker镜像:
# Version: 0.0.1 FROM ubuntu:latest MAINTAINER paul liu "pollux.liu@msn.com" RUN apt-get update RUN apt-get install -y net-tools RUN apt-get install -y iputils-ping CMD /bin/bash

场景图:


QQ20160901-7@2x.png

我的host主机接有无线路由器,通过ADSL拨号上网,网卡eth0固定IP为192.168.0.200,网关为路由器的IP 192.168.0.1。
在host上安装docker,并运行容器。

docker0的作用

通过以下命令安装docker,
yum install -y docker
启用docker,
systemctl start docker
然后在host主机运行ifconfigip a命令,可以看到除去host原有的网卡eth0和回环lo外,多了个docker0。

QQ20160901-2@2x.png

docker0 IP为172.17.0.1,所在的网段默认为B类私网地址172.17.0.0/16。可以将docker0看做是host主机的一块虚拟网卡。这样host主机就等同于配置了双网卡,两块网卡之间可以通信,但前提是启用ip_forward。
这是docker0的第一个身份。

运行两个容器docker1,docker2,然后在host主机上运行brctl show查看,

QQ20160901-8@2x.png

这里可以看出docker0的第二个身份,一个虚拟交换机。每运行一个容器,就会产生一对veth,其中一端连接到docker0上,另一端连接到容器的eth0上。这样,所有连接到docker0的容器组成了一个局域网。如下图:

QQ20160901-9@2x.png

在host主机上运行ifconfig,也会发现多了两个veth这样的网络接口。

在host主机上运行ip addr show veth6d9a691,可以查看到该veth具有mac地址,这也正说明了docker0的虚拟交换机的身份,交换机是通过mac地址通信的,连接到交换机的设备必须具有mac地址。

QQ20160901-10@2x.png

由于docker0自身也具有mac地址,这个与纯二层交换机是不同的,并且绑定了IP 172.17.0.1,容器默认把docker0作为了网关。也就是docker0还兼具路由的功能,因此可以把docker0看做是一个三层交换机,可以做二层数据包转发,也可以做三层路由转发。

在容器中运行route -n查看路由如下:

QQ20160901-3@2x.png

在host主机上运行route -n查看路由如下:

QQ20160901-4@2x.png

在host中,访问本网段192.168.0.0是通过eth0转发数据包的,访问172.17.0.0网段是通过docker0转发数据包的,而对于其他如公网是通过eth0将数据包转发给网关192.168.0.1,再由该网关进行数据包转发的,比如上网。

容器是如何连接到外部网络的

在容器中运行ping sohu.comping 192.168.0.200都可以ping通。

默认情况下,不需要再额外做任何配置,在一台host主机上,通过docker0,各容器之间可以互通,并且可以通过host的eth0连接外网。
通俗的讲,通过docker0组成了一个网段为172.17.0.0/16的以太网,docker容器发起请求时,如果是相同网段则经由docker0转发到目标机器,如果是不同网段,则经由docker0,转发到host的另一块网卡eth0上,由eth0负责下一步的数据包转发,比如公网地址。

下面进一步分析一下报文是怎么发送到外面的。

容器内部发送一条公网请求报文,通过eth0,在veth被接收。此时报文已经来到了主机上,通过查询主机的路由表(route -n),如果发现报文应该通过主机的eth0,从默认网关发送出去,那么报文就被从docker0转发给主机的eth0,但前提是首先启用ip_forward功能,才能在host主机的docker0和eth0两个网卡间传递数据包。

由于目标地址并不属于host主机所在网段,那么会匹配机器上的 iptables中的nat表POSTROUTING链中的规则。
在host主机运行命令iptables -L -n -t nat --line-numbers,查看nat表,这里只看POSTROUTING链:

QQ20160901-6@2x.png

第一行中说明,对于源地址为172.17.0.0/16网段的数据包,发出去之前通过MQSQUERADE伪装。linux内核会修改数据包源地址为host主机eth0的地址(也就是192.168.0.200),然后把报文转发出去。对于外部来说,报文是从主机eth0发送出去的。

局域网内的机器由于都是私有IP,是无法直接访问互联网的(数据包可以发出去,但回不来。)如果要上网,除了可以通过硬件路由器,也可以通过软件路由,在iptables的nat表中的POSTROUTING链中添加SNAT规则。

测试一下,在host主机运行命令iptables -t nat -D POSTROUTING 1将第一条规则删掉,那么在容器中就运行命令ping sohu.com就ping不通了。但仍然可以ping通host主机。

在host主机运行命令以下命令恢复:
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -o eth0 -j SNAT --to-source 192.168.0.200
或者
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE

关于SNAT和MASQUERADE,这篇文章已经有过描述,可以参考:Docker前传之linux iptables

外部网络如何访问容器提供的服务

新建一Dockerfile,用以运行nginx容器:
# Version: 0.0.1 FROM paulliu/ubuntu_ip RUN apt-get install -y nginx EXPOSE 80

在host主机运行构建命令构建镜像docker build -t paulliu/nginx .
在host主机运行容器启动命令docker run -d -p 80 --name nginx1 paulliu/nginx nginx -g "daemon off;"
在host主机查看容器的端口映射docker port nginx1 80

QQ20160902-0@2x.png

在host主机运行命令iptables -nat -L -n可以看到在PREROUTING链中多了以下DNAT规则:

QQ20160902-1@2x.png

也就是在容器启动时通过-p 80将host主机192.168.0.200:32773映射为容器172.17.0.4:80。
注意:docker容器每次启动时获取的IP地址未必是一样的,而且-p 80是在host主机上随机选择一个端口号进行映射,每次启动的端口号也未必是一样的。但iptables中相关的规则是自动变更的。

在host主机运行curl localhost:32773或者在其他主机运行curl 192.168.0.200:32773结果如下:

QQ20160902-2@2x.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容