最近有幾個(gè)已經(jīng)就業(yè)的小伙伴,過(guò)來(lái)問(wèn)千鋒健哥關(guān)于Docker網(wǎng)絡(luò)配置的問(wèn)題,他們?cè)趯?shí)際開(kāi)發(fā)中還是有些疑問(wèn)。關(guān)于Docker網(wǎng)絡(luò)這一塊的內(nèi)容確實(shí)很多,為了讓大家搞清楚這個(gè)問(wèn)題,健哥準(zhǔn)備搞幾篇系列文章,來(lái)為各位小伙伴解惑。這次健哥帶來(lái)的是Docker網(wǎng)絡(luò)的Bridge模式,接下來(lái)我們直接上干貨?。。?/p>
Docker容器和服務(wù)之所以強(qiáng)大的原因之一,是可以將它們連接在一起,或者將它們連接到非Docker的工作負(fù)載上。而Docker容器和服務(wù)甚至都不需要知道它們部署在Docker容器上。無(wú)論Docker主機(jī)是運(yùn)行在Linux、window上,或者兩者混合運(yùn)行,都可以使用Docker以與平臺(tái)無(wú)關(guān)的方式來(lái)管理它們。
而這一切的基礎(chǔ),都是緣于Docker網(wǎng)絡(luò)提供的強(qiáng)大功能和良好設(shè)計(jì)!
一. 操作環(huán)境
我們先說(shuō)一下運(yùn)行所需要的環(huán)境,如下:
centos 7.x版本
docker版本:Docker version 20.10.18, build b40c2f6
xshell 7
二. Docker network 常用命令
我們先來(lái)看看Docket中提供的常用network命令。
1.查看docker network幫助手冊(cè)
[root@hecs-215393?~]#?docker?network?--help??#?查看docker?network?幫助手冊(cè)
Usage:??docker?network?COMMAND
Manage?networks
Commands:
??#?通過(guò)網(wǎng)絡(luò)連接容器
??connect?????Connect?a?container?to?a?network
??#?創(chuàng)建一個(gè)網(wǎng)絡(luò)連接
??create??????Create?a?network
??#?關(guān)閉容器連接
??disconnect??Disconnect?a?container?from?a?network
??#?顯示一個(gè)或多個(gè)網(wǎng)絡(luò)上的詳細(xì)信息
??inspect?????Display?detailed?information?on?one?or?more?networks
??#?列出所有網(wǎng)絡(luò)
??ls??????????List?networks
??#?刪除所有未使用的網(wǎng)絡(luò)
??prune???????Remove?all?unused?networks
??#?刪除一個(gè)或者多個(gè)網(wǎng)絡(luò)
??rm??????????Remove?one?or?more?networks
Run?'docker?network?COMMAND?--help'?for?more?information?on?a?command.
[root@hecs-215393?~]#?
2.列出docker網(wǎng)絡(luò)
[root@hecs-215393?~]#?docker?network?ls?#?列出docker網(wǎng)絡(luò)
NETWORK?ID?????NAME??????DRIVER????SCOPE
5b15d96cf179???bridge????bridge????local
12bf219add93???host??????host??????local
66b6768156e6???none??????null??????local
[root@hecs-215393?~]#?
3.通過(guò)docker network create創(chuàng)建一個(gè)網(wǎng)絡(luò)
[root@VM-8-11-centos?~]#?docker?network?ls
NETWORK?ID?????NAME??????DRIVER????SCOPE
52f8e50a864d???bridge????bridge????local
5534ad5d6eca???host??????host??????local
d60aa65de36e???none??????null??????local
#?創(chuàng)建一個(gè)docker網(wǎng)絡(luò)
[root@VM-8-11-centos?~]#?docker?network?create?qf
6fc2499a6dd26591e1b61f1d20e3c9c61f4b64e3de77b7a832be0f68572ec279
#?再次查看一下當(dāng)前的網(wǎng)絡(luò)狀態(tài)
[root@VM-8-11-centos?~]#?docker?network?ls
NETWORK?ID?????NAME??????DRIVER????SCOPE
52f8e50a864d???bridge????bridge????local
5534ad5d6eca???host??????host??????local
d60aa65de36e???none??????null??????local
6fc2499a6dd2???qf????????bridge????local
[root@VM-8-11-centos?~]#?
4.查看qf網(wǎng)絡(luò)的詳細(xì)信息
[root@VM-8-11-centos?~]#?docker?network?inspect?qf
[
????{
????????"Name":?"qf",
????????"Id":?"6fc2499a6dd26591e1b61f1d20e3c9c61f4b64e3de77b7a832be0f68572ec279",
????????"Created":?"2022-10-09T16:41:48.505578412+08:00",
????????"Scope":?"local",
????????"Driver":?"bridge",
????????"EnableIPv6":?false,
????????"IPAM":?{
????????????"Driver":?"default",
????????????"Options":?{},
????????????"Config":?[
????????????????{
????????????????????"Subnet":?"172.19.0.0/16",
????????????????????"Gateway":?"172.19.0.1"
????????????????}
????????????]
????????},
????????"Internal":?false,
????????"Attachable":?false,
????????"Ingress":?false,
????????"ConfigFrom":?{
????????????"Network":?""
????????},
????????"ConfigOnly":?false,
????????"Containers":?{},
????????"Options":?{},
????????"Labels":?{}
????}
]
[root@VM-8-11-centos?~]#??
三. Docker網(wǎng)絡(luò)的作用
在開(kāi)始學(xué)習(xí)Docker網(wǎng)絡(luò)用法之前,我們?cè)賮?lái)了解一下Docker網(wǎng)絡(luò)的作用,主要作用如下:
Docker網(wǎng)絡(luò)可以負(fù)責(zé)容器間的相互連接和通信,以及端口映射;
當(dāng)容器`ip`地址發(fā)生更改時(shí),可以通過(guò)服務(wù)名稱(chēng)進(jìn)行網(wǎng)絡(luò)通信,不會(huì)因?yàn)閌ip`的更改導(dǎo)致服務(wù)不可用。
四. 網(wǎng)絡(luò)模式
Docker的網(wǎng)絡(luò)有以下幾種網(wǎng)絡(luò)模式。
網(wǎng)絡(luò)模式 | 說(shuō)明 |
bridge, 虛擬網(wǎng)橋, 默認(rèn)模式 |
每一個(gè)容器有獨(dú)立的ip, 并將容器連接到docker0網(wǎng)橋上 |
host |
使用宿主機(jī)的ip和端口號(hào), 容器不會(huì)虛擬出自己的網(wǎng)卡、配置ip |
none |
有獨(dú)立的network namespace,但是并未對(duì)其進(jìn)行任何網(wǎng)絡(luò)設(shè)置 |
container |
和一個(gè)指定的容器共享ip和端口號(hào), 不會(huì)虛擬出網(wǎng)卡、配置ip等操作. |
1.?bridge模式
網(wǎng)橋模式,是docker默認(rèn)的網(wǎng)絡(luò)模式。
1.1 案例說(shuō)明
我們可以創(chuàng)建兩臺(tái)centos容器,分別進(jìn)入這兩臺(tái)容器中查看網(wǎng)絡(luò)情況,查看ip是否相同。
進(jìn)入容器,查看各自的ip地址。
結(jié)論:通過(guò)觀察可以發(fā)現(xiàn),這兩個(gè)centos容器的ip地址并不相同。docker服務(wù)默認(rèn)會(huì)創(chuàng)建一個(gè)docker0網(wǎng)橋,它在內(nèi)核層連通了其它物理或者虛擬網(wǎng)卡,它會(huì)將所有容器和本機(jī)放到同一個(gè)物理網(wǎng)絡(luò)。docker默認(rèn)指定了docker0接口的ip地址和子網(wǎng)掩碼,讓主機(jī)和容器之間通過(guò)互相通信。
1.2 在宿主機(jī)中查看docker0網(wǎng)橋
[root@VM-8-11-centos?~]#?ifconfig
br-6fc2499a6dd2:?flags=4099<UP,BROADCAST,MULTICAST>??mtu?1500
????????inet?172.19.0.1??netmask?255.255.0.0??broadcast?172.19.255.255
????????ether?02:42:4d:db:86:7e??txqueuelen?0??(Ethernet)
????????RX?packets?0??bytes?0?(0.0?B)
????????RX?errors?0??dropped?0??overruns?0??frame?0
????????TX?packets?0??bytes?0?(0.0?B)
????????TX?errors?0??dropped?0?overruns?0??carrier?0??collisions?0
docker0:?flags=4163<UP,BROADCAST,RUNNING,MULTICAST>??mtu?1500
????????inet?172.17.0.1??netmask?255.255.0.0??broadcast?172.17.255.255
????????inet6?fe80::42:51ff:fe04:52a8??prefixlen?64??scopeid?0x20<link>
????????ether?02:42:51:04:52:a8??txqueuelen?0??(Ethernet)
????????RX?packets?38121??bytes?10882894?(10.3?MiB)
????????RX?errors?0??dropped?0??overruns?0??frame?0
????????TX?packets?37569??bytes?6650084?(6.3?MiB)
????????TX?errors?0??dropped?0?overruns?0??carrier?0??collisions?0
eth0:?flags=4163<UP,BROADCAST,RUNNING,MULTICAST>??mtu?1500
????????inet?10.0.8.11??netmask?255.255.252.0??broadcast?10.0.11.255
????????inet6?fe80::5054:ff:fe78:5b59??prefixlen?64??scopeid?0x20<link>
????????ether?52:54:00:78:5b:59??txqueuelen?1000??(Ethernet)
????????RX?packets?4294502??bytes?424094659?(404.4?MiB)
????????RX?errors?0??dropped?0??overruns?0??frame?0
????????TX?packets?4245669??bytes?638810894?(609.2?MiB)
????????TX?errors?0??dropped?0?overruns?0??carrier?0??collisions?0
lo:?flags=73<UP,LOOPBACK,RUNNING>??mtu?65536
????????inet?127.0.0.1??netmask?255.0.0.0
????????inet6?::1??prefixlen?128??scopeid?0x10<host>
????????loop??txqueuelen?1000??(Local?Loopback)
????????RX?packets?11??bytes?1488?(1.4?KiB)
????????RX?errors?0??dropped?0??overruns?0??frame?0
????????TX?packets?11??bytes?1488?(1.4?KiB)
????????TX?errors?0??dropped?0?overruns?0??carrier?0??collisions?0
veth0593288:?flags=4163<UP,BROADCAST,RUNNING,MULTICAST>??mtu?1500
????????inet6?fe80::6434:bff:fe38:6a0c??prefixlen?64??scopeid?0x20<link>
????????ether?66:34:0b:38:6a:0c??txqueuelen?0??(Ethernet)
????????RX?packets?0??bytes?0?(0.0?B)
????????RX?errors?0??dropped?0??overruns?0??frame?0
????????TX?packets?9??bytes?698?(698.0?B)
????????TX?errors?0??dropped?0?overruns?0??carrier?0??collisions?0
veth340b971:?flags=4163<UP,BROADCAST,RUNNING,MULTICAST>??mtu?1500
????????inet6?fe80::dcb5:69ff:fe5a:d5e2??prefixlen?64??scopeid?0x20<link>
????????ether?de:b5:69:5a:d5:e2??txqueuelen?0??(Ethernet)
????????RX?packets?19??bytes?1714?(1.6?KiB)
????????RX?errors?0??dropped?0??overruns?0??frame?0
????????TX?packets?23??bytes?2670?(2.6?KiB)
????????TX?errors?0??dropped?0?overruns?0??carrier?0??collisions?0???
docker使用linux進(jìn)行橋接,在宿主機(jī)上虛擬一個(gè)docker網(wǎng)橋「docker0」。docker啟動(dòng)一個(gè)容器會(huì)根據(jù)docker網(wǎng)橋的網(wǎng)段,分配給容器一個(gè)ip地址,稱(chēng)為container-ip。
docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān),同一臺(tái)宿主機(jī)內(nèi)的容器都會(huì)接入一個(gè)網(wǎng)橋,這樣容器之間就能通過(guò)container-ip進(jìn)行通信了。
當(dāng)創(chuàng)建容器的時(shí)候,如果沒(méi)有指定網(wǎng)絡(luò)模式,默認(rèn)會(huì)使用bridge,使用的就是docker0。在宿主機(jī)執(zhí)行ifconfig時(shí),可以查看到docker0或者自己創(chuàng)建的網(wǎng)絡(luò)。
eth0, eth1… 代表網(wǎng)卡一,網(wǎng)卡二…
lo, 表示本地回環(huán)網(wǎng)絡(luò)。
inet ip用來(lái)表示網(wǎng)卡的ip地址。
2. bridge模式詳解
整個(gè)宿主機(jī)的網(wǎng)橋模式都是docker0,類(lèi)似于一個(gè)交換機(jī)有一大堆接口,每個(gè)接口都可以稱(chēng)為veth。在宿主機(jī)和容器內(nèi)分別創(chuàng)建一個(gè)虛擬接口,并讓他們彼此連通「veth pair」;
每個(gè)實(shí)例內(nèi)部都有一塊網(wǎng)卡,每個(gè)接口可以稱(chēng)為eth0。
docker0上面每個(gè)veth,匹配某個(gè)容器內(nèi)部的eth0,一一配對(duì) 或 兩兩配對(duì)。
重要結(jié)論:將宿主機(jī)上的所有容器都連接到這個(gè)內(nèi)部網(wǎng)絡(luò)上,兩個(gè)容器在同一個(gè)網(wǎng)絡(luò)下,會(huì)從這個(gè)網(wǎng)卡拿到分配的ip,此時(shí)兩個(gè)容器的網(wǎng)絡(luò)是互通的。
2.1 驗(yàn)證案例
啟動(dòng)兩臺(tái)centos容器,在宿主機(jī)當(dāng)中查看網(wǎng)絡(luò)在情況. ip addr
進(jìn)入mycentos01容器。
進(jìn)入mycentos02容器。
宿主機(jī)eth0, docker0與容器內(nèi)eth0之間的對(duì)應(yīng)關(guān)系。
完整圖示:
2.2 bridge使用的正確姿勢(shì)
#?啟動(dòng)容器的時(shí)候,顯示的指定為bridge模式
--network?bridge或者--network=bridge
五. 總結(jié)
各位小伙伴,今天千鋒健哥為大家?guī)?lái)的birdge模式就是這些內(nèi)容了,是不是很容易理解呢?
docker網(wǎng)絡(luò)作為整個(gè)docker體系中極為重要的一個(gè)知識(shí)點(diǎn),在生產(chǎn)中經(jīng)常被用到,尤其是網(wǎng)絡(luò)模式當(dāng)中的bridge模式和host模式更是應(yīng)該重點(diǎn)掌握。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-424049.html
自定義網(wǎng)絡(luò),可以通過(guò)服務(wù)名稱(chēng)「容器名稱(chēng)」進(jìn)行容器間的通信。自動(dòng)處理了容器名稱(chēng)與ip地址的映射關(guān)系,這樣使得容器間通信更為可靠和容易。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-424049.html
到了這里,關(guān)于Docker中的bridge模式,可以這么設(shè)置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!