Docker容器網(wǎng)絡(luò)配置全攻略之橋接、Host、container詳解
一、引言
Docker網(wǎng)絡(luò)是在Docker容器中實(shí)現(xiàn)網(wǎng)絡(luò)通信和連接的重要組成部分。它提供了多種網(wǎng)絡(luò)模式和配置選項(xiàng),使得容器可以與其他容器、主機(jī)以及外部網(wǎng)絡(luò)進(jìn)行通信,在實(shí)際應(yīng)用中,通過(guò)選擇合適的網(wǎng)絡(luò)類型和配置參數(shù),可以構(gòu)建高效、安全、可擴(kuò)展的Docker網(wǎng)絡(luò)解決方案。
二、Docker網(wǎng)絡(luò)模式(Network Modes)
1、橋接模式(Bridge Network)
Docker的bridge網(wǎng)絡(luò)模式是Docker的默認(rèn)網(wǎng)絡(luò)模式。當(dāng)Docker進(jìn)程啟動(dòng)時(shí),它會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋。此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。這個(gè)虛擬網(wǎng)橋的工作方式類似于物理交換機(jī),使得主機(jī)上的所有容器都通過(guò)交換機(jī)連接在一個(gè)二層網(wǎng)絡(luò)中。
在這種模式下,Docker會(huì)為每個(gè)新創(chuàng)建的容器分配獨(dú)立的Network Namespace和IP段等,同時(shí)文件系統(tǒng)、進(jìn)程等也是隔離的。容器內(nèi)部會(huì)有一個(gè)虛擬網(wǎng)卡,名為eth0,容器之間可以通過(guò)這個(gè)虛擬網(wǎng)卡和內(nèi)部的IP地址進(jìn)行通信。另外,從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。
然而,處于橋接模式的容器和宿主機(jī)網(wǎng)絡(luò)不在同一個(gè)網(wǎng)段,容器一般使用172.16.0.xx/24這種網(wǎng)段。因此,容器不能直接和宿主機(jī)以外的網(wǎng)絡(luò)進(jìn)行通信,而必須要經(jīng)過(guò)NAT轉(zhuǎn)換。同時(shí),容器需要在宿主機(jī)上競(jìng)爭(zhēng)端口,完成端口映射的配置后,從外部到容器內(nèi)的網(wǎng)絡(luò)訪問(wèn)tcp流量將會(huì)通過(guò)DNAT從宿主機(jī)端口轉(zhuǎn)發(fā)到容器內(nèi)對(duì)應(yīng)的端口上。此外,容器對(duì)于宿主機(jī)以外是不可見(jiàn)的,從容器發(fā)出的網(wǎng)絡(luò)請(qǐng)求會(huì)通過(guò)SNAT從已對(duì)接的虛擬網(wǎng)橋(如宿主機(jī)的docker0)上統(tǒng)一發(fā)出。
如服務(wù)器未安裝docker,可以參考在CentOS系統(tǒng)中輕松安裝和配置Docker指南這篇文章
2、Host 網(wǎng)絡(luò)
Docker的host網(wǎng)絡(luò)模式是另一種網(wǎng)絡(luò)模式,與bridge模式不同,它將容器直接融入到主機(jī)的網(wǎng)絡(luò)棧中,使得容器直接使用主機(jī)的網(wǎng)絡(luò)接口和IP地址。在這種模式下,容器不會(huì)獲得一個(gè)獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個(gè)Network Namespace。因此,容器內(nèi)部的服務(wù)可以使用宿主機(jī)的網(wǎng)絡(luò)地址和端口,無(wú)需進(jìn)行NAT轉(zhuǎn)換,網(wǎng)絡(luò)性能較好。
使用host網(wǎng)絡(luò)模式的一個(gè)典型場(chǎng)景是需要容器與宿主機(jī)共享網(wǎng)絡(luò)資源或者容器需要快速訪問(wèn)宿主機(jī)網(wǎng)絡(luò)服務(wù)的場(chǎng)景。例如,如果需要在容器內(nèi)部運(yùn)行一些網(wǎng)絡(luò)相關(guān)的應(yīng)用,如網(wǎng)絡(luò)監(jiān)控、日志收集等,這些應(yīng)用需要直接訪問(wèn)宿主機(jī)的網(wǎng)絡(luò)接口和IP地址,此時(shí)就可以使用host網(wǎng)絡(luò)模式。
需要注意的是,由于容器與宿主機(jī)共用一個(gè)網(wǎng)絡(luò)棧,因此容器的網(wǎng)絡(luò)隔離性較差,可能存在安全隱患。如果需要在不同主機(jī)上運(yùn)行容器并實(shí)現(xiàn)跨主機(jī)通信,則不能使用host網(wǎng)絡(luò)模式。
總的來(lái)說(shuō),Docker的host網(wǎng)絡(luò)模式提供了一種將容器與宿主機(jī)網(wǎng)絡(luò)棧直接融合的方式,使得容器可以直接使用宿主機(jī)的網(wǎng)絡(luò)接口和IP地址,適用于一些需要快速訪問(wèn)宿主機(jī)網(wǎng)絡(luò)服務(wù)的場(chǎng)景。但是需要注意的是,該模式下容器的網(wǎng)絡(luò)隔離性較差,需要謹(jǐn)慎使用
3、None 網(wǎng)絡(luò)
- Docker的none網(wǎng)絡(luò)模式是Docker提供的一種特殊網(wǎng)絡(luò)模式,它將容器與宿主機(jī)隔離開(kāi)來(lái),不提供任何網(wǎng)絡(luò)能力。在這種模式下,容器內(nèi)部沒(méi)有網(wǎng)卡、IP地址、路由等信息,只有一個(gè)回環(huán)網(wǎng)絡(luò)(loopback)接口。這意味著容器不能訪問(wèn)外部網(wǎng)絡(luò),也不能被外部網(wǎng)絡(luò)訪問(wèn)。
- none網(wǎng)絡(luò)模式通常用于一些特殊場(chǎng)景,比如需要在容器內(nèi)部運(yùn)行一些獨(dú)立的、與網(wǎng)絡(luò)無(wú)關(guān)的應(yīng)用程序,或者需要進(jìn)行一些網(wǎng)絡(luò)調(diào)試。由于容器與外部網(wǎng)絡(luò)完全隔離,這種模式可以增加容器的安全性。
4、container 模式
Docker的container網(wǎng)絡(luò)模式是指新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。這意味著新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡、配置自己的IP地址,而是和一個(gè)已存在的容器共享IP地址、端口范圍等網(wǎng)絡(luò)資源。同時(shí),這兩個(gè)容器的進(jìn)程可以通過(guò)lo網(wǎng)卡設(shè)備通信。然而,這兩個(gè)容器在其他方面,如文件系統(tǒng)、進(jìn)程列表等,仍然是隔離的。
使用container網(wǎng)絡(luò)模式的一個(gè)典型場(chǎng)景是,當(dāng)需要多個(gè)容器之間共享網(wǎng)絡(luò)配置時(shí),可以使用該模式。例如,可以使用該模式創(chuàng)建一個(gè)nginx容器,并指定其網(wǎng)絡(luò)模型為container模式,和另一個(gè)已經(jīng)存在的容器共享網(wǎng)絡(luò)命名空間。這樣,nginx容器就可以直接使用另一個(gè)容器的IP地址和端口,無(wú)需進(jìn)行額外的網(wǎng)絡(luò)配置。
三、Docker網(wǎng)絡(luò)驅(qū)動(dòng)程序
Docker使用Linux內(nèi)核的一些特性來(lái)實(shí)現(xiàn)其網(wǎng)絡(luò)功能,而這些功能是通過(guò)不同的網(wǎng)絡(luò)驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)的。Docker支持多種網(wǎng)絡(luò)驅(qū)動(dòng)程序,每種驅(qū)動(dòng)程序都有其特定的用途和場(chǎng)景。
- bridge(橋接):這是Docker的默認(rèn)網(wǎng)絡(luò)驅(qū)動(dòng)程序。它會(huì)在宿主機(jī)上創(chuàng)建一個(gè)虛擬網(wǎng)橋(通常是docker0),并將容器連接到這個(gè)網(wǎng)橋上。容器之間以及容器與宿主機(jī)之間可以通過(guò)這個(gè)網(wǎng)橋進(jìn)行通信。bridge模式適用于單個(gè)宿主機(jī)上的容器互聯(lián)場(chǎng)景。
- host:host網(wǎng)絡(luò)驅(qū)動(dòng)程序?qū)⑷萜髦苯尤谌胫鳈C(jī)的網(wǎng)絡(luò)棧中,容器將共享主機(jī)的網(wǎng)絡(luò)接口和IP地址。這意味著容器內(nèi)部的服務(wù)可以直接使用主機(jī)的網(wǎng)絡(luò)地址和端口,無(wú)需進(jìn)行NAT轉(zhuǎn)換。host模式適用于需要容器與宿主機(jī)共享網(wǎng)絡(luò)資源的場(chǎng)景,但需要注意安全性和隔離性問(wèn)題。
- overlay:overlay網(wǎng)絡(luò)驅(qū)動(dòng)程序用于創(chuàng)建跨多個(gè)Docker守護(hù)進(jìn)程的分布式網(wǎng)絡(luò)。它通過(guò)內(nèi)置的DNS服務(wù)實(shí)現(xiàn)容器之間的跨主機(jī)通信。overlay模式適用于需要構(gòu)建分布式應(yīng)用程序的場(chǎng)景,可以讓容器在不同宿主機(jī)之間進(jìn)行通信。
- macvlan:macvlan網(wǎng)絡(luò)驅(qū)動(dòng)程序允許容器使用宿主機(jī)的物理網(wǎng)絡(luò)接口,并為其分配一個(gè)MAC地址。這樣,容器可以像虛擬機(jī)一樣直接連接到物理網(wǎng)絡(luò)上,并與其他設(shè)備通信。macvlan模式適用于需要容器直接訪問(wèn)物理網(wǎng)絡(luò)的場(chǎng)景。
- ipvlan:ipvlan是另一種類似于macvlan的網(wǎng)絡(luò)驅(qū)動(dòng)程序,但它基于IP地址而不是MAC地址來(lái)分配網(wǎng)絡(luò)。ipvlan模式提供了更好的擴(kuò)展性和靈活性,適用于不同的網(wǎng)絡(luò)場(chǎng)景。
- none:none網(wǎng)絡(luò)驅(qū)動(dòng)程序不提供任何網(wǎng)絡(luò)功能,容器將處于完全隔離的狀態(tài)。它通常用于一些特殊場(chǎng)景,如運(yùn)行與網(wǎng)絡(luò)無(wú)關(guān)的應(yīng)用程序或進(jìn)行網(wǎng)絡(luò)調(diào)試。
四、Docker網(wǎng)絡(luò)配置
創(chuàng)建網(wǎng)絡(luò):docker network create
docker network create 命令用于在 Docker 中創(chuàng)建一個(gè)新的網(wǎng)絡(luò)。這個(gè)命令允許指定網(wǎng)絡(luò)的名稱、驅(qū)動(dòng)程序以及其他選項(xiàng),以滿足不同的網(wǎng)絡(luò)需求。
語(yǔ)法:
docker network create [OPTIONS] NETWORK
- OPTIONS:這是可選參數(shù),可以用來(lái)指定網(wǎng)絡(luò)的屬性,如網(wǎng)絡(luò)驅(qū)動(dòng)程序、子網(wǎng)、網(wǎng)關(guān)等。
- NETWORK:這是你要?jiǎng)?chuàng)建的網(wǎng)絡(luò)的名稱,可以根據(jù)實(shí)際需求進(jìn)行命名。
創(chuàng)建一個(gè)默認(rèn)的 bridge 網(wǎng)絡(luò)
docker network create my-network
指定網(wǎng)絡(luò)驅(qū)動(dòng)程序
docker network create --driver overlay my-overlay-network
指定其他網(wǎng)絡(luò)選項(xiàng)
docker network create \ --driver bridge \ --subnet=172.25.0.0/16 \ --gateway=172.25.0.1 \ --ip-range=172.25.50.0/24 \ --aux-address="my-router=172.25.50.10" \ my-custom-network
這將創(chuàng)建一個(gè)名為 my-custom-network 的自定義 bridge 網(wǎng)絡(luò),具有指定的子網(wǎng)、網(wǎng)關(guān)、IP 地址范圍和輔助地址。
- --driver 或 -d:指定網(wǎng)絡(luò)驅(qū)動(dòng)程序,如 bridge 或 overlay。
- --subnet:指定網(wǎng)絡(luò)的子網(wǎng)地址。
- --gateway:指定網(wǎng)絡(luò)的網(wǎng)關(guān)地址。
- --ip-range:指定網(wǎng)絡(luò)的 IP 地址范圍。
- --aux-address:指定網(wǎng)絡(luò)的輔助地址。
連接容器到網(wǎng)絡(luò):--network
在Docker中,可以使用--network選項(xiàng)來(lái)將容器連接到指定的網(wǎng)絡(luò)。這個(gè)選項(xiàng)允許指定容器應(yīng)該使用的網(wǎng)絡(luò),并且可以與docker run命令一起使用來(lái)創(chuàng)建并啟動(dòng)容器
語(yǔ)法:
docker run --network <網(wǎng)絡(luò)名稱> <其他選項(xiàng)> <鏡像名稱>
其中,<網(wǎng)絡(luò)名稱>是想要容器連接的網(wǎng)絡(luò)的名稱,<其他選項(xiàng)>是創(chuàng)建和啟動(dòng)容器時(shí)可能需要的其他參數(shù)(如容器名稱、端口映射等),<鏡像名稱>是要運(yùn)行的Docker鏡像的名稱。
例如,要將名為running-container的容器連接到my-network網(wǎng)絡(luò),可以運(yùn)行
docker network connect my-network running-container
五、Docker網(wǎng)絡(luò)服務(wù)發(fā)現(xiàn)與負(fù)載均衡
1、Docker Swarm
Docker的網(wǎng)絡(luò)服務(wù)發(fā)現(xiàn)與負(fù)載均衡功能在Docker Swarm模式下特別有用。Swarm是Docker的一個(gè)集群管理工具,它允許將多個(gè)Docker主機(jī)組合成一個(gè)單一的、可伸縮的、高可用的集群。
在這個(gè)集群中,可以部署和管理服務(wù),而Docker Swarm會(huì)負(fù)責(zé)在集群節(jié)點(diǎn)之間分配和調(diào)度容器。
服務(wù)發(fā)現(xiàn)
服務(wù)發(fā)現(xiàn)是Swarm的一個(gè)核心功能,它允許服務(wù)自動(dòng)找到彼此,而不需要硬編碼主機(jī)名或IP地址。Swarm使用DNS和VIP(虛擬IP地址)來(lái)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)。每個(gè)服務(wù)在Swarm中都會(huì)被分配一個(gè)唯一的名稱和VIP,其他服務(wù)可以通過(guò)這個(gè)名稱或VIP來(lái)訪問(wèn)該服務(wù),而不需要知道底層容器的實(shí)際IP地址。
負(fù)載均衡
當(dāng)服務(wù)有多個(gè)副本(即多個(gè)容器實(shí)例)在Swarm集群中運(yùn)行時(shí),Docker Swarm會(huì)自動(dòng)處理負(fù)載均衡。它使用內(nèi)置的負(fù)載均衡器來(lái)將流量分發(fā)到不同的容器實(shí)例上,從而實(shí)現(xiàn)高可用性和擴(kuò)展性。這個(gè)負(fù)載均衡器是基于Docker的網(wǎng)絡(luò)驅(qū)動(dòng)和iptables(Linux內(nèi)核的包過(guò)濾技術(shù))實(shí)現(xiàn)的。
總結(jié)來(lái)說(shuō)
Docker等容器平臺(tái)提供了多種網(wǎng)絡(luò)模式和網(wǎng)絡(luò)配置選項(xiàng),以滿足不同場(chǎng)景下的需求。用戶可以根據(jù)實(shí)際應(yīng)用場(chǎng)景選擇合適的網(wǎng)絡(luò)模式和網(wǎng)絡(luò)配置,以實(shí)現(xiàn)容器間的有效通信和服務(wù)的對(duì)外訪問(wèn)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- docker修改容器網(wǎng)絡(luò)舉例詳解
- Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐
- Docker容器網(wǎng)絡(luò)地址的創(chuàng)建修改
- Docker容器網(wǎng)絡(luò)基礎(chǔ)概述
- Docker容器網(wǎng)絡(luò)更改的實(shí)現(xiàn)
- docker 容器網(wǎng)絡(luò)模式詳解
- Docker容器網(wǎng)絡(luò)端口配置過(guò)程詳解
- docker之點(diǎn)到點(diǎn)的容器網(wǎng)絡(luò)的配置
- Docker中的容器網(wǎng)絡(luò)以及其配置說(shuō)明
相關(guān)文章
關(guān)于Docker?Desktop的WSL報(bào)錯(cuò)問(wèn)題解決辦法
這篇文章主要介紹了關(guān)于Docker?Desktop的WSL報(bào)錯(cuò)問(wèn)題解決辦法的相關(guān)資料,排查發(fā)現(xiàn)是因清理%temp%文件夾誤刪關(guān)鍵WSL文件,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03Docker快速部署SpringBoot項(xiàng)目介紹
大家好,本篇文章主要講的是Docker快速部署SpringBoot項(xiàng)目介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下哦,方便下次瀏覽2021-12-12Rabbitmq heartbea心跳檢測(cè)機(jī)制原理解析
這篇文章主要介紹了Rabbitmq heartbea心跳檢測(cè)機(jī)制原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11詳解如何用docker安裝laravel開(kāi)發(fā)環(huán)境
本篇文章主要介紹了詳解如何用docker安裝laravel開(kāi)發(fā)環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02