Docker網(wǎng)絡(luò)之單host網(wǎng)絡(luò)及使用案例
前言
前面總結(jié)了Docker基礎(chǔ)以及Docker存儲(chǔ)相關(guān)知識(shí),今天來總結(jié)一下Docker單主機(jī)網(wǎng)絡(luò)的相關(guān)知識(shí)。毋庸置疑,網(wǎng)絡(luò)絕對(duì)是任何系統(tǒng)的核心,他在Docker中也占有重要的作用。
一、Docker默認(rèn)網(wǎng)絡(luò)
在新安裝docker的主機(jī)上執(zhí)行
docker network ls
便能看到docker默認(rèn)安裝的所有網(wǎng)絡(luò),分別是none網(wǎng)絡(luò)、host網(wǎng)絡(luò)和bridge網(wǎng)絡(luò)。
1.1 none 網(wǎng)絡(luò)
none網(wǎng)絡(luò)就是什么都沒有的網(wǎng)絡(luò)。掛在這個(gè)網(wǎng)絡(luò)下的容器除了lo,沒有其他任何網(wǎng)卡。容器run時(shí),可以通過添加--network=none參數(shù)來指定該容器使用none網(wǎng)絡(luò)。那么這樣一個(gè)只有l(wèi)o的網(wǎng)絡(luò)有什么用呢?此處CloudMan指出:
none網(wǎng)絡(luò)應(yīng)用與隔離場(chǎng)景,一些對(duì)安全性要求高并且不需要聯(lián)網(wǎng)的應(yīng)用可以使用none網(wǎng)絡(luò)。
比如某個(gè)容器的唯一用途是生成隨機(jī)密碼,就可以放到none網(wǎng)絡(luò)中避免密碼被竊取。
我可以理解none網(wǎng)絡(luò)肯定是用于隔離的,然而我好奇的是生成的隨機(jī)密碼如何發(fā)送到外部呢?如何被外部調(diào)用呢?這是我沒有想明白的問題。有知道的希望不吝賜教!謝謝!
1.2 host 網(wǎng)絡(luò)
連接到host網(wǎng)絡(luò)的容器共享Docker宿主機(jī)的網(wǎng)絡(luò)棧,即容器的網(wǎng)絡(luò)配置與host宿主機(jī)完全一樣。可以通過添加--network=host參數(shù)來指定該容器使用host網(wǎng)絡(luò)。
在容器中可以看到host的所有網(wǎng)卡,并且連hostname也是host的。host網(wǎng)絡(luò)的使用場(chǎng)景又是什么呢?
直接使用Docker host的網(wǎng)絡(luò)最大的好處就是性能,如果容器對(duì)網(wǎng)絡(luò)傳輸效率有較高要求,則可以選擇host網(wǎng)絡(luò)。當(dāng)然不便之處就是犧牲一些靈活性,比如要考慮端口沖突問題,Docker host上已經(jīng)使用的端口就不能再用了。
Docker host的另一個(gè)用途是讓容器可以直接配置 host 網(wǎng)路。比如某些跨host的網(wǎng)絡(luò)解決方案,其本身也是以容器方式運(yùn)行的,這些方案需要對(duì)網(wǎng)絡(luò)進(jìn)行配置。
相當(dāng)于該容器擁有了host主機(jī)的網(wǎng)絡(luò),那么其ip等配置也相同,相當(dāng)于主機(jī)中套了一個(gè)與外部一模一樣的容器,可以直接通過host的ip地址來訪問該容器。
1.3 bridge 網(wǎng)絡(luò)
在不指定--network參數(shù)或者--network=bridge的情況下創(chuàng)建的容器其網(wǎng)絡(luò)類型都是bridge。
Docker在安裝時(shí)會(huì)在宿主機(jī)上創(chuàng)建名為docker0的網(wǎng)橋,所謂網(wǎng)橋相當(dāng)于一個(gè)虛擬交換機(jī),如果使用上述兩種方式run的容器都會(huì)掛到docker0上。
容器和docker0之間通過veth進(jìn)行連接,veth相當(dāng)于一根虛擬網(wǎng)線,連接容器和虛擬交換機(jī),這樣就使得docker0與容器連通了。
二、自定義容器網(wǎng)絡(luò)
理論上有了上述三種網(wǎng)絡(luò)已經(jīng)足夠滿足普通用戶的需求,但是有時(shí)候可能用戶需要指定自己的網(wǎng)絡(luò),以此來適應(yīng)某些配置,如ip地址規(guī)劃等等。
2.1 創(chuàng)建自定義網(wǎng)絡(luò)
Docker提供三種user-defined網(wǎng)絡(luò)驅(qū)動(dòng):bridge,overlay和macvlan。overlay和macvlan用于創(chuàng)建跨主機(jī)的網(wǎng)絡(luò),會(huì)在下一篇文章介紹。所以本文介紹創(chuàng)建bridge自定義網(wǎng)絡(luò)。命令如下:
docker network create -d bridge --subnet 172.10.0.0/24 --gateway 172.10.0.1 my_net
-d bridge表示自定義網(wǎng)絡(luò)的驅(qū)動(dòng)為bridge,--subnet 172.10.0.0/24 --gateway 172.10.0.1分別指定網(wǎng)段和網(wǎng)關(guān)。
這樣就創(chuàng)建好了一個(gè)自動(dòng)一網(wǎng)絡(luò),可以通過以下命令查看此網(wǎng)絡(luò)的信息:
docker network inspect my_net
會(huì)得到此網(wǎng)絡(luò)的配置信息,my_net是剛剛創(chuàng)建的網(wǎng)絡(luò)名稱,如果為bridge就是查看docker創(chuàng)建的默認(rèn)bridge網(wǎng)絡(luò)信息。
每創(chuàng)建一個(gè)自定義網(wǎng)絡(luò)便會(huì)在宿主機(jī)中創(chuàng)建一個(gè)網(wǎng)橋(docker0是創(chuàng)建的默認(rèn)網(wǎng)橋,其實(shí)原理是一致的,而且也是對(duì)等的。)。名字為br-<網(wǎng)絡(luò)短ID>,可以通過brctl show命令查看全部網(wǎng)橋信息。
docker的自定義網(wǎng)絡(luò)與OpenStack中的網(wǎng)絡(luò)信息倒是基本一致。所以一通百通,只要docker的明白了,所有虛擬化甚至實(shí)體的網(wǎng)絡(luò)也就基本都搞清楚了。
2.2 使用自定義網(wǎng)絡(luò)
通過以下命令為容器指定自定義網(wǎng)絡(luò):
docker run -it --network my_net --ip 172.10.0.3 busybox
其實(shí)這與使用docker默認(rèn)網(wǎng)絡(luò)是一致的,都是添加--network參數(shù)參數(shù),此處也添加了--ip參數(shù)來指定容器的ip地址。
三、不同容器之間的連通性
同一個(gè)網(wǎng)絡(luò)(默認(rèn)網(wǎng)絡(luò)或者自定義網(wǎng)絡(luò))下的容器之間是能ping通的,但是不同網(wǎng)絡(luò)之間的容器由于網(wǎng)絡(luò)獨(dú)立性的要求是無法ping通的。原因是iptables-save DROP掉了docker之間的網(wǎng)絡(luò),大概如下:
-A DOCKER-ISOLATION -i docker0 -o br-ac4fe2d72b18 -j DROP -A DOCKER-ISOLATION -i br-ac4fe2d72b18 -o docker0 -j DROP -A DOCKER-ISOLATION -i br-62f17c363f02 -o br-ac4fe2d72b18 -j DROP -A DOCKER-ISOLATION -i br-ac4fe2d72b18 -o br-62f17c363f02 -j DROP -A DOCKER-ISOLATION -i br-62f17c363f02 -o docker0 -j DROP -A DOCKER-ISOLATION -i docker0 -o br-62f17c363f02 -j DROP
那么如何讓不同網(wǎng)絡(luò)之間的docker通信呢?接下來介紹容器間通信的三種方式。
3.1 IP 通信
IP通信就是直接用IP地址來進(jìn)行通信,根據(jù)上面的分析需要保證兩個(gè)容器處于同一個(gè)網(wǎng)絡(luò),那么如果不在同一個(gè)網(wǎng)絡(luò)如何處理呢?
如果是實(shí)體機(jī)我們很容易理解,只需要為其中一臺(tái)服務(wù)器添加一塊網(wǎng)卡連接到另一個(gè)網(wǎng)絡(luò)就可以了。容器同理,只需要為其中一個(gè)容器添加另外一個(gè)容器的網(wǎng)絡(luò)就可以了。使用如下命令:
docker network connect my_net httpd
connect命令能夠?yàn)閔ttpd容器再添加一個(gè)my_net網(wǎng)絡(luò)(假設(shè)httpd原來只有默認(rèn)的bridge網(wǎng)絡(luò))。這樣上面創(chuàng)建的busybox容器就能與此次connect的httpd容器進(jìn)行通信。
3.2 Docker DNS Server
通過 IP 訪問容器雖然滿足了通信的需求,但還是不夠靈活。因?yàn)槲覀冊(cè)诓渴饝?yīng)用之前可能無法確定IP,部署之后再指定要訪問的IP會(huì)比較麻煩。對(duì)于這個(gè)問題,可以通過docker自帶的DNS服務(wù)解決。
從Docker 1.10 版本開始,docker daemon 實(shí)現(xiàn)了一個(gè)內(nèi)嵌的DNS server,使容器可以直接通過“容器名”通信。
方法很簡(jiǎn)單,只要在啟動(dòng)時(shí)用--name為容器命名就可以了。
下面的命令啟動(dòng)兩個(gè)容器bbox1和bbox2:
docker run -it --network=my_net --name=bbox1 busybox docker run -it --network=my_net --name=bbox2 busybox
然后,bbox2就可以直接ping到bbox1了,但是使用docker DNS有個(gè)限制,只能在user-defined網(wǎng)絡(luò)中使用。默認(rèn)的bridge網(wǎng)絡(luò)是無法使用的。
3.3 joined 容器
joined 容器是另一種實(shí)現(xiàn)容器間通信的方式。joined 容器非常特別,它可以使兩個(gè)或多個(gè)容器共享一個(gè)網(wǎng)絡(luò)棧,共享網(wǎng)卡和配置信息,joined容器之間可以通過127.0.0.1直接通信。host網(wǎng)絡(luò)使得容器與宿主機(jī)共用同一個(gè)網(wǎng)絡(luò),而jointed是使得兩個(gè)容器共用同一個(gè)網(wǎng)絡(luò)。
請(qǐng)看下面的例子:
先創(chuàng)建一個(gè)httpd容器,名字為web1。
docker run -d -it --name=web1 httpd
然后創(chuàng)建busybox容器并通過--network=container:web1指定jointed容器為web1:
docker run -it --network=container:web1 busybox
這樣busybox和web1的網(wǎng)卡mac地址與IP完全一樣,它們共享了相同的網(wǎng)絡(luò)棧。busybox 可以直接用127.0.0.1訪問web1的http服務(wù)。
其實(shí)也很容易理解,之前的--network參數(shù)指定了默認(rèn)網(wǎng)絡(luò)或者自定義網(wǎng)絡(luò),而此處是指定了一個(gè)容器,那么當(dāng)然意思就是使用這個(gè)容器的網(wǎng)絡(luò)。這也有點(diǎn)類似上一篇文章講到的共享存儲(chǔ)。
joined 容器非常適合以下場(chǎng)景:
不同容器中的程序希望通過loopback高效快速地通信,比如web server與app server。
希望監(jiān)控其他容器的網(wǎng)絡(luò)流量,比如運(yùn)行在獨(dú)立容器中的網(wǎng)絡(luò)監(jiān)控程序。
其實(shí)就是應(yīng)用于即需要獨(dú)立而又需要兩個(gè)容器網(wǎng)絡(luò)高度一致的場(chǎng)景。
3.4 容器與外部網(wǎng)絡(luò)的連通性
3.4.1 容器訪問外部網(wǎng)絡(luò)
容器默認(rèn)是能訪問外部網(wǎng)絡(luò)的。通過NAT,docker實(shí)現(xiàn)了容器對(duì)外網(wǎng)(此處外網(wǎng)不一定是互聯(lián)網(wǎng))的訪問。
3.4.2 外部網(wǎng)絡(luò)訪問容器
通過端口映射的方式實(shí)現(xiàn)外部網(wǎng)絡(luò)訪問容器,即通過-p參數(shù)實(shí)現(xiàn)將容器的端口映射到外部端口。
總結(jié)
以上所述是小編給大家介紹的Docker網(wǎng)絡(luò)之單host網(wǎng)絡(luò)及使用案例,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- docker網(wǎng)絡(luò)及部署集群和打包鏡像問題
- docker網(wǎng)絡(luò)配置過程詳解介紹
- Docker網(wǎng)絡(luò)原理及自定義網(wǎng)絡(luò)詳細(xì)解析
- docker網(wǎng)絡(luò)雙向連接詳解
- centos修改docker網(wǎng)絡(luò)配置方法分享
- Docker網(wǎng)絡(luò)代理設(shè)置詳解
- docker自定義網(wǎng)橋docker0及docker的開啟,關(guān)閉,重啟命令操作
- Docker如何實(shí)現(xiàn)修改Docker0網(wǎng)橋默認(rèn)網(wǎng)段
- 詳解修改docker啟動(dòng)默認(rèn)網(wǎng)橋docker0為自定義網(wǎng)橋
- Docker網(wǎng)絡(luò)及容器通信原理詳解
相關(guān)文章
docker compose安裝es+kibana 8.12.2的詳細(xì)過程
因云平臺(tái)需要改造,es7升級(jí)為es8,所以記錄一下,es8需要開啟ssl認(rèn)證,需要配置證書,全本帶你用docker安裝,便于后面es8的學(xué)習(xí),這篇文章主要介紹了docker compose安裝es+kibana 8.12.2的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧2024-05-05docker部署Vaultwarden密碼共享管理系統(tǒng)的實(shí)現(xiàn)(圖文)
Vaultwarden是一個(gè)開源的密碼管理器,它提供了類似于Bitwarden的功能,允許用戶安全地存儲(chǔ)和管理密碼、敏感數(shù)據(jù)和身份信息,本文主要介紹了docker部署Vaultwarden密碼共享管理系統(tǒng)的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10IDEA 通過docker插件發(fā)布springboot項(xiàng)目的詳細(xì)教程
這篇文章主要介紹了IDEA 通過docker插件發(fā)布springboot項(xiàng)目的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09docker安裝單點(diǎn)elasticsearch過程
這篇文章主要介紹了docker安裝單點(diǎn)elasticsearch過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07在Linux?Docker中部署RStudio?Server實(shí)現(xiàn)遠(yuǎn)程訪問的操作
下面介紹在Linux?docker中安裝RStudio?Server并結(jié)合cpolar內(nèi)網(wǎng)穿透工具,實(shí)現(xiàn)遠(yuǎn)程訪問,docker方式安裝可以避免很多問題,一鍵安裝,如設(shè)備沒有安裝docker,需提前安裝docker,對(duì)?Docker部署RStudio?Server相關(guān)知識(shí)感興趣的朋友一起看看吧2023-12-12Docker中數(shù)據(jù)卷(volume)管理的兩種方式
數(shù)據(jù)卷有兩種形式,一種是容器中的某個(gè)目錄,它可以被別的容器引用,只要有一個(gè)容器引用了這個(gè)數(shù)據(jù)卷,數(shù)據(jù)就不會(huì)被刪除;另一種數(shù)據(jù)卷是將容器中的數(shù)據(jù)卷和宿主機(jī)的目錄進(jìn)行掛載。 數(shù)據(jù)卷可以在多個(gè)容器之間共享,修改數(shù)據(jù)卷不會(huì)影響鏡像2021-07-07如何設(shè)置docker開機(jī)自啟動(dòng),并設(shè)置容器自動(dòng)重啟
這篇文章主要介紹了如何設(shè)置docker開機(jī)自啟動(dòng),并設(shè)置容器自動(dòng)重啟問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02