單host下Docker的默認網(wǎng)絡(luò)配置

本文用到的環(huán)境如下:
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撥號上網(wǎng)跋核,網(wǎng)卡eth0固定IP為192.168.0.200粥庄,網(wǎng)關(guān)為路由器的IP 192.168.0.1。
在host上安裝docker豺妓,并運行容器惜互。

docker0的作用

通過以下命令安裝docker,
yum install -y docker
啟用docker琳拭,
systemctl start docker
然后在host主機運行ifconfigip a命令训堆,可以看到除去host原有的網(wǎng)卡eth0和回環(huán)lo外,多了個docker0白嘁。

QQ20160901-2@2x.png

docker0 IP為172.17.0.1坑鱼,所在的網(wǎng)段默認為B類私網(wǎng)地址172.17.0.0/16。可以將docker0看做是host主機的一塊虛擬網(wǎng)卡鲁沥。這樣host主機就等同于配置了雙網(wǎng)卡呼股,兩塊網(wǎng)卡之間可以通信,但前提是啟用ip_forward画恰。
這是docker0的第一個身份彭谁。

運行兩個容器docker1,docker2允扇,然后在host主機上運行brctl show查看缠局,

QQ20160901-8@2x.png

這里可以看出docker0的第二個身份,一個虛擬交換機考润。每運行一個容器狭园,就會產(chǎn)生一對veth,其中一端連接到docker0上糊治,另一端連接到容器的eth0上唱矛。這樣,所有連接到docker0的容器組成了一個局域網(wǎng)俊戳。如下圖:

QQ20160901-9@2x.png

在host主機上運行ifconfig揖赴,也會發(fā)現(xiàn)多了兩個veth這樣的網(wǎng)絡(luò)接口。

在host主機上運行ip addr show veth6d9a691抑胎,可以查看到該veth具有mac地址燥滑,這也正說明了docker0的虛擬交換機的身份,交換機是通過mac地址通信的阿逃,連接到交換機的設(shè)備必須具有mac地址铭拧。

QQ20160901-10@2x.png

由于docker0自身也具有mac地址,這個與純二層交換機是不同的恃锉,并且綁定了IP 172.17.0.1搀菩,容器默認把docker0作為了網(wǎng)關(guān)。也就是docker0還兼具路由的功能破托,因此可以把docker0看做是一個三層交換機肪跋,可以做二層數(shù)據(jù)包轉(zhuǎn)發(fā),也可以做三層路由轉(zhuǎn)發(fā)土砂。

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

QQ20160901-3@2x.png

在host主機上運行route -n查看路由如下:

QQ20160901-4@2x.png

在host中州既,訪問本網(wǎng)段192.168.0.0是通過eth0轉(zhuǎn)發(fā)數(shù)據(jù)包的,訪問172.17.0.0網(wǎng)段是通過docker0轉(zhuǎn)發(fā)數(shù)據(jù)包的萝映,而對于其他如公網(wǎng)是通過eth0將數(shù)據(jù)包轉(zhuǎn)發(fā)給網(wǎng)關(guān)192.168.0.1吴叶,再由該網(wǎng)關(guān)進行數(shù)據(jù)包轉(zhuǎn)發(fā)的,比如上網(wǎng)序臂。

容器是如何連接到外部網(wǎng)絡(luò)的

在容器中運行ping sohu.comping 192.168.0.200都可以ping通蚌卤。

默認情況下,不需要再額外做任何配置,在一臺host主機上逊彭,通過docker0咸灿,各容器之間可以互通,并且可以通過host的eth0連接外網(wǎng)诫龙。
通俗的講析显,通過docker0組成了一個網(wǎng)段為172.17.0.0/16的以太網(wǎng),docker容器發(fā)起請求時签赃,如果是相同網(wǎng)段則經(jīng)由docker0轉(zhuǎn)發(fā)到目標機器谷异,如果是不同網(wǎng)段,則經(jīng)由docker0锦聊,轉(zhuǎn)發(fā)到host的另一塊網(wǎng)卡eth0上歹嘹,由eth0負責下一步的數(shù)據(jù)包轉(zhuǎn)發(fā),比如公網(wǎng)地址孔庭。

下面進一步分析一下報文是怎么發(fā)送到外面的尺上。

容器內(nèi)部發(fā)送一條公網(wǎng)請求報文,通過eth0圆到,在veth被接收怎抛。此時報文已經(jīng)來到了主機上,通過查詢主機的路由表(route -n)芽淡,如果發(fā)現(xiàn)報文應(yīng)該通過主機的eth0马绝,從默認網(wǎng)關(guān)發(fā)送出去,那么報文就被從docker0轉(zhuǎn)發(fā)給主機的eth0挣菲,但前提是首先啟用ip_forward功能富稻,才能在host主機的docker0和eth0兩個網(wǎng)卡間傳遞數(shù)據(jù)包。

由于目標地址并不屬于host主機所在網(wǎng)段白胀,那么會匹配機器上的 iptables中的nat表POSTROUTING鏈中的規(guī)則椭赋。
在host主機運行命令iptables -L -n -t nat --line-numbers,查看nat表或杠,這里只看POSTROUTING鏈:

QQ20160901-6@2x.png

第一行中說明哪怔,對于源地址為172.17.0.0/16網(wǎng)段的數(shù)據(jù)包,發(fā)出去之前通過MQSQUERADE偽裝向抢。linux內(nèi)核會修改數(shù)據(jù)包源地址為host主機eth0的地址(也就是192.168.0.200)认境,然后把報文轉(zhuǎn)發(fā)出去。對于外部來說笋额,報文是從主機eth0發(fā)送出去的。

局域網(wǎng)內(nèi)的機器由于都是私有IP篷扩,是無法直接訪問互聯(lián)網(wǎng)的(數(shù)據(jù)包可以發(fā)出去兄猩,但回不來。)如果要上網(wǎng),除了可以通過硬件路由器枢冤,也可以通過軟件路由鸠姨,在iptables的nat表中的POSTROUTING鏈中添加SNAT規(guī)則。

測試一下淹真,在host主機運行命令iptables -t nat -D POSTROUTING 1將第一條規(guī)則刪掉讶迁,那么在容器中就運行命令ping sohu.com就ping不通了。但仍然可以ping通host主機核蘸。

在host主機運行命令以下命令恢復(fù):
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

關(guān)于SNAT和MASQUERADE巍糯,這篇文章已經(jīng)有過描述,可以參考:Docker前傳之linux iptables

外部網(wǎng)絡(luò)如何訪問容器提供的服務(wù)

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

在host主機運行構(gòu)建命令構(gòu)建鏡像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規(guī)則:

QQ20160902-1@2x.png

也就是在容器啟動時通過-p 80將host主機192.168.0.200:32773映射為容器172.17.0.4:80祟峦。
注意:docker容器每次啟動時獲取的IP地址未必是一樣的,而且-p 80是在host主機上隨機選擇一個端口號進行映射徙鱼,每次啟動的端口號也未必是一樣的宅楞。但iptables中相關(guān)的規(guī)則是自動變更的。

在host主機運行curl localhost:32773或者在其他主機運行curl 192.168.0.200:32773結(jié)果如下:

QQ20160902-2@2x.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袱吆,一起剝皮案震驚了整個濱河市厌衙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绞绒,老刑警劉巖婶希,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異处铛,居然都是意外死亡饲趋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門撤蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奕塑,“玉大人,你說我怎么就攤上這事家肯×渑椋” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵讨衣,是天一觀的道長换棚。 經(jīng)常有香客問我,道長反镇,這世上最難降的妖魔是什么固蚤? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮歹茶,結(jié)果婚禮上夕玩,老公的妹妹穿的比我還像新娘你弦。我一直安慰自己,他們只是感情好燎孟,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布禽作。 她就那樣靜靜地躺著,像睡著了一般揩页。 火紅的嫁衣襯著肌膚如雪旷偿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天爆侣,我揣著相機與錄音萍程,去河邊找鬼。 笑死累提,一個胖子當著我的面吹牛尘喝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斋陪,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼朽褪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了无虚?” 一聲冷哼從身側(cè)響起缔赠,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎友题,沒想到半個月后嗤堰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡度宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年踢匣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戈抄。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡离唬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出划鸽,到底是詐尸還是另有隱情输莺,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布裸诽,位于F島的核電站嫂用,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丈冬。R本人自食惡果不足惜嘱函,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埂蕊。 院中可真熱鬧往弓,春花似錦橄浓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匀们。三九已至缴淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泄朴,已是汗流浹背重抖。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祖灰,地道東北人钟沛。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像局扶,于是被迫代替她去往敵國和親恨统。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容