Docker網(wǎng)絡(luò)實現(xiàn)

《docker入門與實踐》筆記
Docker的網(wǎng)絡(luò)其實是利用Linux上的網(wǎng)絡(luò)命名空間和虛擬網(wǎng)絡(luò)設(shè)備(veth pair)實現(xiàn)的。

一、基本原理

  • 直觀上看疾宏,要實現(xiàn)網(wǎng)絡(luò)通信,機器需要至少一個網(wǎng)絡(luò)接口(物理網(wǎng)絡(luò)接口或虛擬網(wǎng)絡(luò)接口)與外界相通触创,并可以收發(fā)數(shù)據(jù)包坎藐;此外,如果要實現(xiàn)不同子網(wǎng)之間的通信哼绑,需額外配置路由岩馍。
  • Docker 中的網(wǎng)絡(luò)接口默認都是虛擬的接口。虛擬接口的優(yōu)勢就是轉(zhuǎn)發(fā)效率極高抖韩。這是因為Linux通過內(nèi)核中進行數(shù)據(jù)復(fù)制來實現(xiàn)虛擬接口之間的數(shù)據(jù)轉(zhuǎn)發(fā)蛀恩,即發(fā)送接口的發(fā)送緩存中的數(shù)據(jù)包將被直接復(fù)制到接收皆苦的接受緩存中,無需通過外部物理網(wǎng)絡(luò)設(shè)備進行交換茂浮。這個拷貝實在內(nèi)核態(tài)直接完成双谆,不需要兩態(tài)切換。
  • Docker容器網(wǎng)絡(luò)很好的利用了Linux的虛擬網(wǎng)絡(luò)技術(shù)席揽,它在本地主機和容器內(nèi)分別創(chuàng)建一個虛擬接口顽馋,并讓它們彼此連同。
Docker的網(wǎng)絡(luò)實現(xiàn)

二幌羞、網(wǎng)絡(luò)創(chuàng)建過程

  1. 創(chuàng)建一對虛擬接口寸谜,分別放到本地主機和新容器的命名空間中。
// 創(chuàng)建一個容器
docker run -it --rm busybox 
  1. 本地主機一端的虛擬接口連接到默認的docker0網(wǎng)橋或指定的網(wǎng)橋上属桦,并具有一個以veth開頭的唯一名字熊痴,如:veth22f630c
// 查看主機分配的veth接口
ifconfig 或者ip addr show
ifconfig
// 查看veth22f630c接口連接到docker0網(wǎng)橋上
brctl show
brctl show
  1. 容器一端的虛擬接口將放到新創(chuàng)建的容器中,并修改名字為eth0地啰。這個接口只有容器的命名空間可見愁拭。
ifconfig
  1. 從網(wǎng)橋可用地址段中獲取一個空閑的地址分配給容器的eth0(例如: 172.17.0.2/16),并配置默認網(wǎng)關(guān)為docker0網(wǎng)卡的內(nèi)部接口docker0的IP地址(例如:172.17.0.1/16)
// 查看docker0的IP
ifconfig docker0
ifconfig docker0
// 查看容器的IP亏吝,網(wǎng)關(guān)
docker inspect fc8da94bafdd(containerid)
docker inspect containerid
  1. 完成這些之后岭埠,容器就可以使用eth0虛擬網(wǎng)卡來連接其他容器和訪問外部網(wǎng)絡(luò)了。

三蔚鸥、網(wǎng)絡(luò)配置

docker運行的時候通過--net參數(shù)指定容器的網(wǎng)絡(luò)配置惜论,有4個可選值bridge、host止喷、container馆类、none:

  • --net=bridge:默認值,在Docker網(wǎng)橋上為容器創(chuàng)建新的網(wǎng)絡(luò)棧。
  • --net=host:告訴 Docker不要將容器網(wǎng)絡(luò)放到隔離的命名空間中弹谁,即不要容器化容器內(nèi)的網(wǎng)絡(luò)乾巧。此時容器使用本地主機的網(wǎng)絡(luò),它擁有完全的本地主機接口訪問權(quán)限句喜。容器進程可以跟主機其他root進程一樣打開低范圍的端口,可以訪問本地網(wǎng)絡(luò)服務(wù)比如D-bus,還可以讓容器做一些影響整個主機系統(tǒng)的事情,比如重啟主機沟于。因此使用這個選項的時候要非常小心咳胃。如果進一步的使用-- privileged=true參數(shù),
    容器甚至?xí)辉试S直接配置主機的網(wǎng)絡(luò)堆棧旷太。
  • --net=container:讓Docker將新建容器的進程放到一個已存在容器的網(wǎng)絡(luò)棧中展懈,新容器進程有自己的文件系統(tǒng)、進程列表和資源限制供璧,但會和已存在的容器共享IP地址和端口等網(wǎng)絡(luò)資源存崖,兩者進程可以直接通過lo環(huán)回接口通信。
  • --net=none:讓Docker將新容器放到隔離的網(wǎng)絡(luò)棧中睡毒,但是不進行網(wǎng)絡(luò)配置来惧。之后,用戶可以自己進行配置演顾。

四违寞、網(wǎng)絡(luò)配置細節(jié)

用戶使用--net=none后,Docker將不對容器網(wǎng)絡(luò)進行配置偶房。下面趁曼,將手動完成配置網(wǎng)絡(luò)的整個過程。

  1. --net=none創(chuàng)建一個容器:
// 創(chuàng)建容器(containerid:fc1f71546394)
docker run -it --rm --net=none busybox
  1. 在本地主機查找容器的進程id棕洋,并為它創(chuàng)建網(wǎng)絡(luò)命名空間:
// 查看容器的進程id
docker inspect -f "{{.State.Pid}}" fc1f71546394
docker inspect -f "{{.State.Pid}} fc1f71546396"
// 為容器創(chuàng)建網(wǎng)絡(luò)命名空間
pid=58930
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
  1. 查看橋接網(wǎng)卡的IP和子網(wǎng)掩碼信息:
```
ip addr show docker0
```
ip addr show docker0
  1. 創(chuàng)建一對"veth pair"接口veth_host和veth_container挡闰,綁定veth_host到網(wǎng)橋docker0,并啟動veth_host:
// 創(chuàng)建一對veth pair
sudo ip link add veth_host type veth peer name veth_container
// 將veth_host接口添加到docker0網(wǎng)橋上
sudo brctl addif docker0 veth_host
// 激活veth_host接口
sudo ip link set veth_host up
// 查看veth_host接口信息
ifconfig veth_host
// 查看docker0情況
brctl show
創(chuàng)建veth pair
  1. 將veth_container接口放到容器的網(wǎng)絡(luò)命名空間掰盘,命名為eth0摄悯,啟動它并配置一個可用IP(172.17.0.3/16)和默認網(wǎng)關(guān)(172.17.0.1):
// 將veth_container接口放到容器的網(wǎng)絡(luò)命名空間
sudo ip link set veth_container netns $pid
// veth_container 設(shè)置容器內(nèi)的別名eth0
sudo ip netns exec $pid ip link set dev veth_container name eth0
// 激活容器內(nèi)的eth0接口 
sudo ip netns exec $pid ip link set eth0 up
 // 給容器內(nèi)的eth0設(shè)置ip
sudo ip netns exec $pid ip addr add 172.17.0.3/16 dev eth0
 // 給容器內(nèi)的設(shè)置默認網(wǎng)關(guān)
sudo ip netns exec $pid ip route add default via 172.17.0.1
設(shè)置veth_container
  1. 以上就是Docker配置網(wǎng)絡(luò)的具體過程
    當容器終止后,Docker會清空容器愧捕,容器內(nèi)的網(wǎng)絡(luò)接口會隨著網(wǎng)絡(luò)命名空間一起被清除奢驯,veth_host 接口也會自動從docker0卸載并清除。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次绘,一起剝皮案震驚了整個濱河市瘪阁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邮偎,老刑警劉巖管跺,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禾进,居然都是意外死亡豁跑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門泻云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艇拍,“玉大人狐蜕,你說我怎么就攤上這事⌒断Γ” “怎么了馏鹤?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娇哆。 經(jīng)常有香客問我,道長勃救,這世上最難降的妖魔是什么碍讨? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蒙秒,結(jié)果婚禮上勃黍,老公的妹妹穿的比我還像新娘。我一直安慰自己晕讲,他們只是感情好覆获,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓢省,像睡著了一般弄息。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勤婚,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天摹量,我揣著相機與錄音,去河邊找鬼馒胆。 笑死缨称,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的祝迂。 我是一名探鬼主播睦尽,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼型雳!你這毒婦竟也來了当凡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纠俭,失蹤者是張志新(化名)和其女友劉穎宁玫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柑晒,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡欧瘪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匙赞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛掖。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡妖碉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芥被,到底是詐尸還是另有隱情欧宜,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布拴魄,位于F島的核電站冗茸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匹中。R本人自食惡果不足惜夏漱,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顶捷。 院中可真熱鬧挂绰,春花似錦、人聲如沸服赎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽重虑。三九已至践付,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缺厉,已是汗流浹背荔仁。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芽死,地道東北人乏梁。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像关贵,于是被迫代替她去往敵國和親遇骑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348