一、Linux網(wǎng)絡(luò)設(shè)備的基本概念
在學(xué)習(xí)docker網(wǎng)絡(luò)管理之前先要了解一些Linux網(wǎng)絡(luò)設(shè)備的基本概念:
Linux Bridge,即Linux網(wǎng)橋設(shè)備,是Linux提供的一種虛擬網(wǎng)絡(luò)設(shè)備之一。其工作方式非常類似于物理的網(wǎng)絡(luò)交換機(jī)設(shè)備。Linux Bridge可以工作在二層,也可以工作在三層,默認(rèn)工作在二層。工作在二層時(shí),可以在同一網(wǎng)絡(luò)的不同主機(jī)間轉(zhuǎn)發(fā)以太網(wǎng)報(bào)文;一旦你給一個(gè)Linux Bridge分配了IP地址,也就開啟了該Bridge的三層工作模式。在Linux下,你可以用iproute2工具包或brctl命令對(duì)Linux bridge進(jìn)行管理。
VETH(Virtual Ethernet )是Linux提供的另外一種特殊的網(wǎng)絡(luò)設(shè)備,中文稱為虛擬網(wǎng)卡接口。它總是成對(duì)出現(xiàn),要?jiǎng)?chuàng)建就創(chuàng)建一個(gè)Pair。一個(gè)Pair中的veth就像一個(gè)網(wǎng)絡(luò)線纜的兩個(gè)端點(diǎn),數(shù)據(jù)從一個(gè)端點(diǎn)進(jìn)入,必然從另外一個(gè)端點(diǎn)流出。每個(gè)veth都可以被賦予IP地址,并參與三層網(wǎng)絡(luò)路由過程。
Network namespace,網(wǎng)絡(luò)名字空間,允許你在Linux創(chuàng)建相互隔離的網(wǎng)絡(luò)視圖,每個(gè)網(wǎng)絡(luò)名字空間都有獨(dú)立的網(wǎng)絡(luò)配置,比如:網(wǎng)絡(luò)設(shè)備、路由表等。新建的網(wǎng)絡(luò)名字空間與主機(jī)默認(rèn)網(wǎng)絡(luò)名字空間之間是隔離的。我們平時(shí)默認(rèn)操作的是主機(jī)的默認(rèn)網(wǎng)絡(luò)名字空間。
關(guān)于Linux Bridge和VETH的具體工作原理,可以參考IBM developerWorks上的這篇文章《Linux 上的基礎(chǔ)網(wǎng)絡(luò)設(shè)備詳解》。
關(guān)于namespace的知識(shí)補(bǔ)充:docker容器本質(zhì)上是宿主機(jī)的進(jìn)程,Docker通過namespace實(shí)現(xiàn)了資源隔離,通過cgroups實(shí)現(xiàn)了資源限制,通過寫時(shí)復(fù)制機(jī)制(copy-on-write)實(shí)現(xiàn)了高效的文件操作。namespace在linux中是實(shí)現(xiàn)資源隔離的一種手段,也是輕量級(jí)虛擬化的一種手段??梢詫?shí)現(xiàn)多個(gè)用戶,也可以實(shí)現(xiàn)多個(gè)網(wǎng)絡(luò)設(shè)備訪問(虛擬化網(wǎng)絡(luò)),但是實(shí)體網(wǎng)絡(luò)卻只有一個(gè)。資源隔離意味著比如不通PID命名空間看到的PID進(jìn)程是不一樣的,不通命名空間看到的IPC通信是不一樣的。命名空間分類:

二、Docker網(wǎng)絡(luò)拓?fù)鋱D
通常情況下,Docker使用網(wǎng)橋(bridge)和NAT的通信模式(還有其他模式,暫時(shí)只學(xué)習(xí)這一種),其網(wǎng)絡(luò)拓?fù)鋱D如下:


如圖所示:
- 默認(rèn)情況下,我們?cè)谒拗鳈C(jī)上看到的都是
default network namespace的視圖,Docker在安裝完以后,Docker Daemon會(huì)在default network namespace創(chuàng)建一個(gè)名字為docker0的虛擬網(wǎng)橋,其IP默認(rèn)為172.17.0.1/16,負(fù)責(zé)容器與容器之間(網(wǎng)橋)、容器訪問外部網(wǎng)絡(luò)(SNAT轉(zhuǎn)換)、外部網(wǎng)絡(luò)訪問容器(DNAT轉(zhuǎn)換)的通信,同時(shí)也會(huì)創(chuàng)建一個(gè)新的network namespace。 - 每當(dāng)運(yùn)行一個(gè)容器,Docker就會(huì)將容器放入新建的network namespace中,同時(shí)會(huì)創(chuàng)建一個(gè)虛擬網(wǎng)卡接口(VETH),一端連接在網(wǎng)橋docker0上面,另一端插在容器上充當(dāng)eth0,用于連接兩個(gè)不同的network namespace。
三、Docker網(wǎng)絡(luò)模式的修改
3-1、Docker進(jìn)程網(wǎng)絡(luò)修改

3-2、Docker容器網(wǎng)絡(luò)修改

3-3、暴露端口修改

3-4、docker0網(wǎng)橋網(wǎng)絡(luò)修改

3-5、docker設(shè)置遠(yuǎn)程訪問

四、網(wǎng)絡(luò)隔離
創(chuàng)建一個(gè)容器時(shí),會(huì)默認(rèn)放在一個(gè)網(wǎng)絡(luò)命名空間內(nèi),所以可以互相訪問。為了安全起見可以將不同的容器放入不同的網(wǎng)絡(luò)命名空間中相互隔離。
4-1、常見隔離
隔離容器與容器之間的訪問

創(chuàng)建不同的網(wǎng)橋(不同的網(wǎng)絡(luò)命名空間)

創(chuàng)建容器時(shí)將不同容器放入不同的網(wǎng)橋(其實(shí)是放入不同的網(wǎng)絡(luò)命名空間)

4-2、連接不同宿主機(jī)上面的docker容器
創(chuàng)建網(wǎng)橋

修改網(wǎng)卡以及網(wǎng)橋配置

下載安裝pipework工具

使用pipework工具修改容器的IP
