docker Network(網(wǎng)絡(luò))詳解
docker為什么需要網(wǎng)絡(luò)管理?
容器的網(wǎng)絡(luò)默認(rèn)與宿主機(jī)及其他容器都是相互隔離, 但同時(shí)我們也要考慮下面的一些問(wèn)題, 比如:
- 多個(gè)容器之間是如何通信的
- 容器和宿主機(jī)是如何通信的
- 容器和外界主機(jī)是如何通信的
- 容器中要運(yùn)行一些網(wǎng)絡(luò)應(yīng)用(如 nginx、web 應(yīng)用、數(shù)據(jù)庫(kù)等),如果要讓外部也可以訪問(wèn)這些容器內(nèi)運(yùn)行的網(wǎng)絡(luò)應(yīng)用應(yīng)該如何實(shí)現(xiàn)
- 容器不想讓它的網(wǎng)絡(luò)與宿主機(jī)、與其他容器隔離應(yīng)該如何實(shí)現(xiàn)
- 容器根本不需要網(wǎng)絡(luò)的時(shí)候應(yīng)該如何實(shí)現(xiàn)
- 容器需要更高的定制化網(wǎng)絡(luò)(如定制特殊的集群網(wǎng)絡(luò)、定制容器間的局域網(wǎng))應(yīng)
- 該如何實(shí)現(xiàn)
docker網(wǎng)絡(luò)架構(gòu)簡(jiǎn)介
Docker 容器網(wǎng)絡(luò)是為應(yīng)用程序所創(chuàng)造的虛擬環(huán)境的一部分,它能讓?xiě)?yīng)用從宿主機(jī)操作系統(tǒng)的網(wǎng)絡(luò)環(huán)境中獨(dú)立出來(lái),形成容器自有的網(wǎng)絡(luò)設(shè)備、IP 協(xié)議棧、端口套接字、IP路由表、防火墻等等與網(wǎng)絡(luò)相關(guān)的模塊。
Docker 為實(shí)現(xiàn)容器網(wǎng)絡(luò),主要采用的架構(gòu)由三部分組成:CNM、Libnetwork 和驅(qū)動(dòng)。
CNM:
Docker 網(wǎng)絡(luò)架構(gòu)采用的設(shè)計(jì)規(guī)范是 CNM(Container Network Model)。CNM 中規(guī)定了 Docker 網(wǎng)絡(luò)的基礎(chǔ)組成要素:Sandbox、Endpoint、Network。
Sandbox
:提供了容器的虛擬網(wǎng)絡(luò)棧,也即端口、套接字、IP 路由表、防火墻、DNS 配置等內(nèi)容。主要用于隔離容器網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò),形成了完全獨(dú)立的容器網(wǎng)絡(luò)環(huán)境。Network
:Docker 內(nèi)部的虛擬子網(wǎng),使得網(wǎng)絡(luò)內(nèi)的參與者能夠進(jìn)行通訊。Endpoint
:就是虛擬網(wǎng)絡(luò)的接口,就像普通網(wǎng)絡(luò)接口一樣,Endpoint 的主要職責(zé)是負(fù)責(zé)創(chuàng)建連接。Endpoint 類(lèi)似于常見(jiàn)的網(wǎng)絡(luò)適配器,那也就意味著一個(gè) Endpoint 只能接入某一個(gè)網(wǎng)絡(luò), 當(dāng)容器需要接入到多個(gè)網(wǎng)絡(luò),就需要多個(gè) Endpoint。
如上圖所示,容器 B 有兩個(gè) Endpoint 并且分別接入 Networkd A 和 Network B。那么容器 A 和容器 B 之間是可以實(shí)現(xiàn)通信的,因?yàn)槎冀尤肓?NetworkA。但是容器 A 和容器 C 不可以通過(guò)容器 B 的兩個(gè) Endpoint 通信。
Libnetwork:
- Libnetwork 是 CNM 的一個(gè)標(biāo)準(zhǔn)實(shí)現(xiàn)。Libnetwork 是開(kāi)源庫(kù),采用 Go 語(yǔ)言編寫(xiě)(跨平臺(tái)的),也是 Docker 所使用的庫(kù),Docker 網(wǎng)絡(luò)架構(gòu)的核心代碼都在這個(gè)庫(kù)中。
- Libnetwork 實(shí)現(xiàn)了 CNM 中定義的全部三個(gè)組件,此外它還實(shí)現(xiàn)了本地服務(wù)發(fā)現(xiàn)、基于 Ingress 的容器負(fù)載均衡,以及網(wǎng)絡(luò)控制層和管理層等功能。
驅(qū)動(dòng):
- 驅(qū)動(dòng)主要負(fù)責(zé)實(shí)現(xiàn)數(shù)據(jù)層相關(guān)內(nèi)容,例如網(wǎng)絡(luò)的連通性和隔離性是由驅(qū)動(dòng)來(lái)處理的。驅(qū)動(dòng)通過(guò)實(shí)現(xiàn)特定網(wǎng)絡(luò)類(lèi)型的方式擴(kuò)展了 Docker 網(wǎng)絡(luò)棧,例如橋接網(wǎng)絡(luò)和覆蓋網(wǎng)絡(luò)。
- Docker 內(nèi)置了若干驅(qū)動(dòng),通常被稱(chēng)作原生驅(qū)動(dòng)或者本地驅(qū)動(dòng)。
- 例如 Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver 等等。每個(gè)驅(qū)動(dòng)負(fù)責(zé)創(chuàng)建其上所有網(wǎng)絡(luò)資源的創(chuàng)建和管理。
常見(jiàn)的網(wǎng)絡(luò)類(lèi)型
1. bridge網(wǎng)絡(luò):
- bridge 驅(qū)動(dòng)會(huì)在 Docker 管理的主機(jī)上創(chuàng)建一個(gè) Linux 網(wǎng)橋。默認(rèn)情況下,網(wǎng)橋上的容器可以相互通信。也可以通過(guò) bridge 驅(qū)動(dòng)程序配置,實(shí)現(xiàn)對(duì)外部容器的訪問(wèn)。
- Docker 容器的默認(rèn)網(wǎng)絡(luò)驅(qū)動(dòng).當(dāng)我們需要多個(gè)容器在同一個(gè) Docker 主機(jī)上通信時(shí),橋接網(wǎng)絡(luò)是最佳選擇。
2. host網(wǎng)絡(luò):
- 對(duì)于獨(dú)立容器,移除容器和 Docker 主機(jī)之間的網(wǎng)絡(luò)隔離,并直接使用主機(jī)的網(wǎng)絡(luò)。
- 當(dāng)網(wǎng)絡(luò)堆棧不應(yīng)該與 Docker 主機(jī)隔離,但是希望容器的其他資源被隔離時(shí),主機(jī)網(wǎng)絡(luò)是最佳選擇。
3. container 網(wǎng)絡(luò):
- 這個(gè)模式指定新創(chuàng)建的容器和引進(jìn)存在的一個(gè)容器共享一個(gè)網(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è)備通信。
4. none 網(wǎng)絡(luò):
- Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker 容器進(jìn)行任何網(wǎng)絡(luò)配置。
- 也就是說(shuō),這個(gè) Docker 容器沒(méi)有網(wǎng)卡、IP、路由等信息。容器完全網(wǎng)絡(luò)隔離。
5. overlay 網(wǎng)絡(luò):
- 借助 Docker 集群模塊 Docker Swarm 搭建的跨 Docker Daemon 網(wǎng)絡(luò)。將多個(gè)Docker 守護(hù)進(jìn)程連接在一起,使集群服務(wù)能夠相互通信。
- 當(dāng)我們需要運(yùn)行在不同Docker 主機(jī)上的容器進(jìn)行通信時(shí),或者當(dāng)多個(gè)應(yīng)用程序使用集群服務(wù)協(xié)同工作時(shí),覆蓋網(wǎng)絡(luò)是最佳選擇。
在 Docker 安裝時(shí),會(huì)自動(dòng)安裝一塊 Docker 網(wǎng)卡稱(chēng)為 docker0,它是一個(gè)網(wǎng)橋設(shè)備,主要用于 Docker 各容器及宿主機(jī)的網(wǎng)絡(luò)通信:
docker網(wǎng)絡(luò)管理命令
docker network create
語(yǔ)法: docker network create [OPTIONS] NETWORK
功能: 創(chuàng)建一個(gè)網(wǎng)絡(luò),不指定-d選項(xiàng),默認(rèn)是橋接網(wǎng)絡(luò)
參數(shù):
-d
: 網(wǎng)絡(luò)驅(qū)動(dòng),該選項(xiàng)接受overlay網(wǎng)絡(luò)和birdge網(wǎng)絡(luò),如果有其它第三方網(wǎng)絡(luò),在這里指定即可;–gateway
:網(wǎng)關(guān)地址–subnet
:設(shè)置網(wǎng)絡(luò)的ip地址范圍,eg:192.168.32.0/24–ipv6
:?jiǎn)⒂胕pv6
實(shí)戰(zhàn):
docker network inspect
語(yǔ)法: docker network inspect [OPTIONS] NETWORK [NETWORK…]
功能: 查看一個(gè)或多個(gè)網(wǎng)絡(luò)的詳細(xì)信息
參數(shù):
-f
: 指定格式顯示;
實(shí)戰(zhàn):
docker network connect
語(yǔ)法: docker network connect [OPTIONS] NETWORK CONTAINER
功能: 將一個(gè)容器連接進(jìn)一個(gè)網(wǎng)絡(luò)
參數(shù):
–ip
: 給容器指定ipv4地址;–ipv6
: 給容器指定ipv6地址;
實(shí)戰(zhàn):
docker network disconnect
語(yǔ)法: docker network disconnect [OPTIONS] NETWORK CONTAINER
功能: 斷開(kāi)容器與網(wǎng)絡(luò)的連接,并且在執(zhí)行該命令的時(shí)候,容器必須正在運(yùn)行;
參數(shù):
-f
:強(qiáng)制斷開(kāi);
實(shí)戰(zhàn):
docker network prune
語(yǔ)法: docker network prune [OPTIONS]
功能: 刪除所有未被容器引用的網(wǎng)絡(luò);
參數(shù):
-f
: 不要輸出提示信息
實(shí)戰(zhàn):
docker network rm
語(yǔ)法: docker network rm NETWORK [NETWORK…]
別名: docker network remove
功能: 刪除一個(gè)或多個(gè)網(wǎng)絡(luò)
參數(shù):
-f
:強(qiáng)制刪除;
實(shí)戰(zhàn):
docker network ls
語(yǔ)法: docker network ls [OPTIONS]
別名: docker network list
功能: 列出所有的網(wǎng)絡(luò)
參數(shù):
-q
: 輸出網(wǎng)絡(luò)號(hào)
實(shí)戰(zhàn):
網(wǎng)絡(luò)詳解
docker bridge網(wǎng)絡(luò)
Docker Bridge 網(wǎng)絡(luò)采用內(nèi)置的 bridge 驅(qū)動(dòng),bridge 驅(qū)動(dòng)底層采用的是 Linux 內(nèi)核中Linux bridge 技術(shù)。
就網(wǎng)絡(luò)而言,bridge 網(wǎng)絡(luò)是在網(wǎng)絡(luò)段之間轉(zhuǎn)發(fā)流量的鏈路層設(shè)備,而網(wǎng)橋可以是在主機(jī)內(nèi)核中運(yùn)行的硬件設(shè)備或軟件設(shè)備;就 Docker 而言,橋接網(wǎng)絡(luò)使用軟件網(wǎng)橋 docker0,它允許連接到同一網(wǎng)橋網(wǎng)絡(luò)的容器進(jìn)行通信,同時(shí)提供與未連接到該網(wǎng)橋網(wǎng)絡(luò)容器的隔離。
默認(rèn)情況下,創(chuàng)建的容器在沒(méi)有使用–network 參數(shù)指定要加入的 docker 網(wǎng)絡(luò)時(shí),
默認(rèn)都是加入 Docker 默認(rèn)的單機(jī)橋接網(wǎng)絡(luò),即下面的 name 為 bridge 的網(wǎng)絡(luò)。
其中,容器、bridge和Host::eth0之間的之間的關(guān)系可以參考:手機(jī)、路由器、光貓之間的關(guān)系;
在日常的生活中,我們手機(jī)發(fā)出的數(shù)據(jù)包想要發(fā)送到外網(wǎng)的話(huà),那么需要先將數(shù)據(jù)包發(fā)送給路由器,路由器的WAN口連接著光貓,因此路由器在拿到數(shù)據(jù)包過(guò)后,又會(huì)將其轉(zhuǎn)發(fā)給光貓,再由光貓將數(shù)據(jù)轉(zhuǎn)發(fā)到外網(wǎng);
默認(rèn)的 bridge 網(wǎng)絡(luò)會(huì)被映射到內(nèi)核中為 docker0 的網(wǎng)橋上。
Docker 默認(rèn)的 bridge 網(wǎng)絡(luò)和 Linux 內(nèi)核中的 docker0 網(wǎng)橋是一一對(duì)應(yīng)的關(guān)系。
bridge 是 Docker 對(duì)網(wǎng)絡(luò)的命名,而 docker0 是內(nèi)核中網(wǎng)橋的名字。
注意:
- docker run --network選項(xiàng)會(huì)使容器加入指定的網(wǎng)絡(luò),而不會(huì)加入默認(rèn)的docker0網(wǎng)絡(luò);如果沒(méi)有指定該選項(xiàng),那么容器加入的是默認(rèn)docker0網(wǎng)絡(luò);
- 對(duì)于兩個(gè)加入docker0網(wǎng)絡(luò)的容器來(lái)說(shuō),互相ping對(duì)方的容器名是ping不通的,但是對(duì)于兩個(gè)加入自定義bridge網(wǎng)絡(luò)的容器來(lái)說(shuō)互相ping容器名可以ping通;
docker Host網(wǎng)絡(luò)
Docker 容器運(yùn)行默認(rèn)都會(huì)分配獨(dú)立的 Network Namespace 隔離子系統(tǒng), 但是如果基于 host 網(wǎng)絡(luò)模式,容器將不會(huì)獲得一個(gè)獨(dú)立的 Network Namespace,而是和宿主機(jī)共用同一個(gè) Network Namespace,容器將不會(huì)虛擬出自己的網(wǎng)卡,IP 等,而是直接使用宿主機(jī)的 IP 和端口。
連接到 host 網(wǎng)絡(luò)的容器共享宿主機(jī)的網(wǎng)絡(luò)棧,容器的網(wǎng)絡(luò)配置與宿主機(jī)完全一樣。我
們可以通過(guò) --network=host 指定使用 host 網(wǎng)絡(luò)。
- 在host網(wǎng)絡(luò)下,容器和宿主機(jī)處于同一個(gè)Network Namespace下,共享宿主機(jī)的端口和網(wǎng)絡(luò)接口等資源;
- 在host模式下,不需要使用-p選項(xiàng)來(lái)指定端口映射;
- 相比于bridge類(lèi)型網(wǎng)絡(luò)的優(yōu)點(diǎn)就是,轉(zhuǎn)發(fā)效率高,因?yàn)樵趆ost網(wǎng)絡(luò)中,避免了中間層的轉(zhuǎn)發(fā);
- 相比于bridge類(lèi)型網(wǎng)絡(luò)的缺點(diǎn)就是與宿主機(jī)共享同一套Network Namespace,網(wǎng)絡(luò)資源都耦合在了一起,容器發(fā)生資源沖突;
docker Container 網(wǎng)絡(luò)
Docker Container 的 other container 網(wǎng)絡(luò)模式是 Docker 中一種較為特別的網(wǎng)絡(luò)的模式。之所以稱(chēng)為“other container 模式”,是因?yàn)檫@個(gè)模式下的 Docker Container,會(huì)使用其他容器的網(wǎng)絡(luò)環(huán)境。之所以稱(chēng)為“特別”,是因?yàn)檫@個(gè)模式下容器的網(wǎng)絡(luò)隔離性會(huì)處于 bridge 橋接模式與 host 模式之間。Docker Container 共享其他容器的網(wǎng)絡(luò)環(huán)境,則至少這兩個(gè)容器之間不存在網(wǎng)絡(luò)隔離,而這兩個(gè)容器又與宿主機(jī)以及除此之外其他的容器存在網(wǎng)絡(luò)隔離。
Docker Container 的 other container 網(wǎng)絡(luò)模式實(shí)現(xiàn)邏輯如下:
- 查找 other container(即需要被共享網(wǎng)絡(luò)環(huán)境的容器)的網(wǎng)絡(luò) namespace;
- 將新創(chuàng)建的 Docker Container(也是需要共享其他網(wǎng)絡(luò)的容器)的 namespace, 使用 other container 的 namespace
心得:
- 可以使用
docker run --network container:要加入的容器網(wǎng)絡(luò)的容器名
來(lái)加入container網(wǎng)絡(luò); - 容器2在加入容器1的網(wǎng)絡(luò)過(guò)后和容器1共用同一套Network Namespace;
- 容器2的網(wǎng)絡(luò)依賴(lài)于容器1的網(wǎng)絡(luò),一旦容器1重啟過(guò)后,容器2的網(wǎng)絡(luò)服務(wù)將不可用,只可使用本地環(huán)回網(wǎng)絡(luò);
docker none 網(wǎng)絡(luò)
none 網(wǎng)絡(luò)就是指沒(méi)有網(wǎng)絡(luò)。掛在這個(gè)網(wǎng)絡(luò)下的容器除了 lo(本地回環(huán)),沒(méi)有其他任何網(wǎng)卡。
心得:
- 針對(duì)一些對(duì)安全性要求比較高并且不需要聯(lián)網(wǎng)的應(yīng)用, 可以使用 none 網(wǎng)絡(luò), 比如生成隨機(jī)密碼, 避免生成密碼被第三方獲取;
- 一些第三方的應(yīng)用可能需要 docker 幫忙創(chuàng)建一個(gè)沒(méi)有網(wǎng)絡(luò)的容器, 網(wǎng)絡(luò)由第三方自己來(lái)配置。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- docker network 自定義網(wǎng)絡(luò)配置與管理指南詳細(xì)過(guò)程
- docker network如何創(chuàng)建橋接網(wǎng)絡(luò)
- docker-compose網(wǎng)絡(luò)設(shè)置之networks的使用
- 解決docker網(wǎng)絡(luò)錯(cuò)誤(network bridge not found)
- Docker network自定義網(wǎng)絡(luò)方式
- docker network_mode: "host" 網(wǎng)絡(luò)配置方式
- docker網(wǎng)絡(luò),docker-compose?network問(wèn)題
相關(guān)文章
docker安裝influxdb的詳細(xì)教程(性能測(cè)試)
這篇文章主要介紹了docker安裝influxdb的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07基于Docker結(jié)合Canal實(shí)現(xiàn)MySQL實(shí)時(shí)增量數(shù)據(jù)傳輸功能
這篇文章主要介紹了基于Docker結(jié)合Canal實(shí)現(xiàn)MySQL實(shí)時(shí)增量數(shù)據(jù)傳輸功能,本文給圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Docker 教程之?dāng)?shù)據(jù)管理詳細(xì)介紹
這篇文章主要介紹了Docker 教程之?dāng)?shù)據(jù)管理詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-01-01樹(shù)莓派4b ubuntu19 server 安裝docker-ce的安裝步驟
這篇文章主要介紹了樹(shù)莓派4b ubuntu19 server 安裝docker-ce的安裝步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Docker跨主機(jī)容器通信overlay實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Docker跨主機(jī)容器通信overlay實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Docker daemon 無(wú)法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法
這篇文章主要介紹了Docker daemon 無(wú)法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11在Docker中如何配置網(wǎng)絡(luò)并訪問(wèn)互聯(lián)網(wǎng)
這篇文章主要介紹了在Docker中如何配置網(wǎng)絡(luò)并訪問(wèn)互聯(lián)網(wǎng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01