目錄
- 1.Docker網(wǎng)絡(luò)
- 1.1 Docker網(wǎng)絡(luò)模型概述
- 1.2 Docker網(wǎng)絡(luò)驅(qū)動(dòng)程序
- 1.2.1 host模式
- 1.2.2 bridge模式
- 1.2.3 container模式
- 1.2.4 none模式
- 1.3 Docker網(wǎng)絡(luò)命令示例
- 1.3.1 創(chuàng)建一個(gè)自定義網(wǎng)絡(luò)
- 1.3.2 列出所有網(wǎng)絡(luò)
- 1.3.3 連接容器到網(wǎng)絡(luò)
- 1.3.4 斷開(kāi)容器與網(wǎng)絡(luò)的連接
1.Docker網(wǎng)絡(luò)
1.1 Docker網(wǎng)絡(luò)模型概述
Docker是一種容器化平臺(tái),它提供了一種輕量級(jí)的虛擬化解決方案,使得應(yīng)用程序能夠以容器的形式運(yùn)行。在Docker中,每個(gè)容器都有自己的網(wǎng)絡(luò)棧,可以與其他容器或主機(jī)進(jìn)行通信。Docker網(wǎng)絡(luò)模型為容器提供了靈活的網(wǎng)絡(luò)配置和連接選項(xiàng)。
Docker網(wǎng)絡(luò)模型基于Linux內(nèi)核的網(wǎng)絡(luò)命名空間和虛擬以太網(wǎng)橋技術(shù)。每個(gè)Docker容器都有自己的網(wǎng)絡(luò)命名空間,這意味著每個(gè)容器都有自己的網(wǎng)絡(luò)接口、IP地址和路由表。Docker還提供了一些網(wǎng)絡(luò)驅(qū)動(dòng)程序,用于實(shí)現(xiàn)容器之間的通信和與外部網(wǎng)絡(luò)的連接。
Docker網(wǎng)絡(luò)模型是一個(gè)三層的網(wǎng)絡(luò)模型,它允許容器之間的通信,并提供了多種網(wǎng)絡(luò)驅(qū)動(dòng)程序供用戶選擇。Docker網(wǎng)絡(luò)模型的核心組件包括:
-
Docker網(wǎng)絡(luò):Docker網(wǎng)絡(luò)是一組容器的虛擬網(wǎng)絡(luò),它允許容器之間進(jìn)行通信。每個(gè)Docker網(wǎng)絡(luò)都有自己的IP地址范圍和子網(wǎng)掩碼。
-
Docker網(wǎng)橋:Docker網(wǎng)橋是一個(gè)虛擬交換機(jī),它連接了Docker網(wǎng)絡(luò)和物理網(wǎng)絡(luò),并負(fù)責(zé)容器之間的通信。
-
容器網(wǎng)絡(luò)接口(CNI):CNI是一個(gè)插件接口,用于配置容器的網(wǎng)絡(luò)。它定義了一組標(biāo)準(zhǔn)接口和一套配置規(guī)范,使得不同的網(wǎng)絡(luò)驅(qū)動(dòng)程序可以無(wú)縫切換。
1.2 Docker網(wǎng)絡(luò)驅(qū)動(dòng)程序
Docker提供了多種網(wǎng)絡(luò)驅(qū)動(dòng)程序,用于實(shí)現(xiàn)不同的網(wǎng)絡(luò)連接方式。以下是一些常用的網(wǎng)絡(luò)驅(qū)動(dòng)程序:
1.2.1 host模式
host驅(qū)動(dòng)程序?qū)⑷萜髋c主機(jī)網(wǎng)絡(luò)共享,容器將直接使用主機(jī)的網(wǎng)絡(luò)棧和IP地址。這意味著容器可以通過(guò)主機(jī)的IP地址與外部網(wǎng)絡(luò)進(jìn)行通信,但容器之間無(wú)法直接通信。使用host模式的容器可以直接使用宿主機(jī)的IP地址與外界通信,容器內(nèi)部的服務(wù)端口也可以使用宿主機(jī)的端口,host最大的優(yōu)勢(shì)就是網(wǎng)絡(luò)性能比較好,但是docker host上已經(jīng)使用的端口就不能再用了,網(wǎng)絡(luò)的隔離性不好。
使用host驅(qū)動(dòng)程序創(chuàng)建一個(gè)容器網(wǎng)絡(luò),只需運(yùn)行以下命令:
$ docker run --name mycontainer --network host nginx
1.2.2 bridge模式
bridge驅(qū)動(dòng)程序是Docker默認(rèn)的網(wǎng)絡(luò)驅(qū)動(dòng)程序。它基于Linux內(nèi)核的bridge技術(shù),創(chuàng)建一個(gè)虛擬的以太網(wǎng)橋,用于連接容器和主機(jī)網(wǎng)絡(luò)。每個(gè)容器都會(huì)分配一個(gè)獨(dú)立的IP地址,并通過(guò)橋接方式與其他容器通信。bridge模式是docker的默認(rèn)網(wǎng)絡(luò)模式,不寫–net參數(shù),就是bridge模式。
當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器都會(huì)連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過(guò)交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。
從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備,Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中,以vethxxx這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。如下圖:
從上圖中我們可以看到,可以看到容器內(nèi)部和Linux主機(jī)都會(huì)創(chuàng)建一個(gè)新的網(wǎng)卡,而這兩個(gè)網(wǎng)卡都是成對(duì)的。使用的技術(shù)就是evth-pair。evth-pair 就是一對(duì)的虛擬設(shè)備接口,他們是成對(duì)出現(xiàn)的,一段連著協(xié)議,一段彼此相連。evth-pair充當(dāng)一個(gè)橋梁,連接各種虛擬網(wǎng)絡(luò)設(shè)備。
Docker容器完成bridge網(wǎng)絡(luò)配置的過(guò)程如下:
1. 在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備。veth設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入,就會(huì)從另一個(gè)設(shè)備出來(lái)。因此,veth設(shè)備常用來(lái)連接兩個(gè)網(wǎng)絡(luò)設(shè)備。
2. Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0。另一端放在主機(jī)中,以veth這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。
3. 從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。一般在docker中docker0的IP地址就相當(dāng)于localhost。
使用bridge驅(qū)動(dòng)程序創(chuàng)建一個(gè)容器網(wǎng)絡(luò)非常簡(jiǎn)單,只需運(yùn)行以下命令:
$ docker run --name mycontainer --network bridge nginx
1.2.3 container模式
這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace (網(wǎng)絡(luò)命名空間),而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò)lo網(wǎng)卡設(shè)備通信。
1.2.4 none模式
使用none模式,Docker 容器擁有自己的Network Namespace ,但是,并不為Docker 容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè)Docker 容器沒(méi)有網(wǎng)卡、IP、路由等信息。這種網(wǎng)絡(luò)模式下容器只有l(wèi)o回環(huán)網(wǎng)絡(luò),沒(méi)有其他網(wǎng)卡。這種類型的網(wǎng)絡(luò)沒(méi)有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。
1.3 Docker網(wǎng)絡(luò)命令示例
1.3.1 創(chuàng)建一個(gè)自定義網(wǎng)絡(luò)
$ docker network create mynetwork
1.3.2 列出所有網(wǎng)絡(luò)
$ docker network ls
1.3.3 連接容器到網(wǎng)絡(luò)
$ docker network connect mynetwork mycontainer
1.3.4 斷開(kāi)容器與網(wǎng)絡(luò)的連接
$ docker network disconnect mynetwork mycontainer
1.3.5 查看容器的網(wǎng)絡(luò)信息
$ docker network inspect mynetwork