0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker容器的四種網(wǎng)絡(luò)模式

jf_ro2CN3Fa ? 來(lái)源:博客園 ? 作者:博客園 ? 2022-10-17 14:53 ? 次閱讀

docker 容器網(wǎng)絡(luò)

Docker 在安裝后自動(dòng)提供 3 種網(wǎng)絡(luò),可以使用 docker network ls 命令查看

[root@localhost~]#dockernetworkls
NETWORKIDNAMEDRIVERSCOPE
cd97bb997b84bridgebridgelocal
0a04824fc9b6hosthostlocal
4dcb8fbdb599nonenulllocal

Docker 使用 Linux 橋接,在宿主機(jī)虛擬一個(gè) Docker 容器網(wǎng)橋(docker0),Docker 啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù) Docker 網(wǎng)橋的網(wǎng)段分配給容器一個(gè) IP 地址,稱為 Container-IP,同時(shí) Docker 網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的 Container-IP 直接通信。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

docker 的 4 種網(wǎng)絡(luò)模式

網(wǎng)絡(luò)模式 配置 說(shuō)明
host --network host 容器和宿主機(jī)共享Network namespace
container --network container:NAME_OR_ID 容器和另外一個(gè)容器共享Network namespace
none --network none 容器有獨(dú)立的Network namespace,但并沒(méi)有對(duì)其進(jìn)行任何網(wǎng)絡(luò)設(shè)置,如分配veth pair 和網(wǎng)橋連接,配置IP等
bridge --network bridge默認(rèn)模式

d1760a14-4cfe-11ed-a3b6-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

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)橋中??梢酝ㄟ^(guò) brctl show 命令查看。

bridge 模式是 docker 的默認(rèn)網(wǎng)絡(luò)模式,不寫(xiě)--network 參數(shù),就是 bridge 模式。使用 docker run -p 時(shí),docker 實(shí)際是在 iptables 做了 DNAT 規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能??梢允褂?iptables -t nat -vnL 查看。

bridge 模式如下圖所示:

d2214a28-4cfe-11ed-a3b6-dac502259ad0.png

假設(shè)上圖的 docker2 中運(yùn)行了一個(gè) nginx,大家來(lái)想幾個(gè)問(wèn)題:

同主機(jī)間兩個(gè)容器間是否可以直接通信?比如在 docker1 上能不能直接訪問(wèn)到 docker2 的 nginx 站點(diǎn)?

在宿主機(jī)上能否直接訪問(wèn)到 docker2 的 nginx 站點(diǎn)?

在另一臺(tái)主機(jī)上如何訪問(wèn) node1 上的這個(gè) nginx 站點(diǎn)呢?DNAT 發(fā)布?

Docker 網(wǎng)橋是宿主機(jī)虛擬出來(lái)的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無(wú)法尋址到的,這也意味著外部網(wǎng)絡(luò)無(wú)法通過(guò)直接 Container-IP 訪問(wèn)到容器。如果容器希望外部訪問(wèn)能夠訪問(wèn)到,可以通過(guò)映射容器端口到宿主主機(jī)(端口映射),即 docker run 創(chuàng)建容器時(shí)候通過(guò) -p 或 -P 參數(shù)來(lái)啟用,訪問(wèn)容器的時(shí)候就通過(guò)[宿主機(jī) IP]:[容器端口]訪問(wèn)容器。

container 模式

這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè) Network Namespace,而不是和宿主機(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è)備通信。

container 模式如下圖所示:

d24ab1f6-4cfe-11ed-a3b6-dac502259ad0.png

host 模式

如果啟動(dòng)容器的時(shí)候使用 host 模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的 Network Namespace,而是和宿主機(jī)共用一個(gè) Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的 IP 等,而是使用宿主機(jī)的 IP 和端口。但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。

使用 host 模式的容器可以直接使用宿主機(jī)的 IP 地址與外界通信,容器內(nèi)部的服務(wù)端口也可以使用宿主機(jī)的端口,不需要進(jìn)行 NAT,host 最大的優(yōu)勢(shì)就是網(wǎng)絡(luò)性能比較好,但是 docker host 上已經(jīng)使用的端口就不能再用了,網(wǎng)絡(luò)的隔離性不好。

Host 模式如下圖所示:

d2599220-4cfe-11ed-a3b6-dac502259ad0.png

none 模式

使用 none 模式,Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker 容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè) Docker 容器沒(méi)有網(wǎng)卡、IP、路由等信息。需要我們自己為 Docker 容器添加網(wǎng)卡、配置 IP 等。

這種網(wǎng)絡(luò)模式下容器只有 lo 回環(huán)網(wǎng)絡(luò),沒(méi)有其他網(wǎng)卡。none 模式可以在容器創(chuàng)建時(shí)通過(guò)--network none 來(lái)指定。這種類型的網(wǎng)絡(luò)沒(méi)有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。

應(yīng)用場(chǎng)景

啟動(dòng)一個(gè)容器處理數(shù)據(jù),比如轉(zhuǎn)換數(shù)據(jù)格式

一些后臺(tái)的計(jì)算和處理任務(wù)

none 模式如下圖所示:

d28c8b94-4cfe-11ed-a3b6-dac502259ad0.png

dockernetworkinspectbridge#查看bridge網(wǎng)絡(luò)的詳細(xì)配置

docker 容器網(wǎng)絡(luò)配置

Linux 內(nèi)核實(shí)現(xiàn)名稱空間的創(chuàng)建

ip netns 命令

可以借助 ip netns 命令來(lái)完成對(duì) Network Namespace 的各種操作。ip netns 命令來(lái)自于 iproute 安裝包,一般系統(tǒng)會(huì)默認(rèn)安裝,如果沒(méi)有的話,請(qǐng)自行安裝。

注意:ip netns 命令修改網(wǎng)絡(luò)配置時(shí)需要 sudo 權(quán)限。

可以通過(guò) ip netns 命令完成對(duì) Network Namespace 的相關(guān)操作,可以通過(guò) ip netns help 查看命令幫助信息:

[root@localhost~]#ipnetnshelp
Usage:ipnetnslist
ipnetnsaddNAME
ipnetnssetNAMENETNSID
ip[-all]netnsdelete[NAME]
ipnetnsidentify[PID]
ipnetnspidsNAME
ip[-all]netnsexec[NAME]cmd...
ipnetnsmonitor
ipnetnslist-id

默認(rèn)情況下,Linux 系統(tǒng)中是沒(méi)有任何 Network Namespace 的,所以 ip netns list 命令不會(huì)返回任何信息。

創(chuàng)建 Network Namespace

通過(guò)命令創(chuàng)建一個(gè)名為 ns0 的命名空間:

[root@localhost~]#ipnetnslist
[root@localhost~]#ipnetnsaddns0
[root@localhost~]#ipnetnslist
ns0

新創(chuàng)建的 Network Namespace 會(huì)出現(xiàn)在/var/run/netns/目錄下。如果相同名字的 namespace 已經(jīng)存在,命令會(huì)報(bào) Cannot create namespace file "/var/run/netns/ns0": File exists 的錯(cuò)誤。

[root@localhost~]#ls/var/run/netns/
ns0
[root@localhost~]#ipnetnsaddns0
Cannotcreatenamespacefile"/var/run/netns/ns0":Fileexists

對(duì)于每個(gè) Network Namespace 來(lái)說(shuō),它會(huì)有自己獨(dú)立的網(wǎng)卡、路由表、ARP 表、iptables 等和網(wǎng)絡(luò)相關(guān)的資源。

操作 Network Namespace

ip 命令提供了 ip netns exec 子命令可以在對(duì)應(yīng)的 Network Namespace 中執(zhí)行命令。

查看新創(chuàng)建 Network Namespace 的網(wǎng)卡信息

[root@localhost~]#ipnetnsexecns0ipaddr
1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00

可以看到,新創(chuàng)建的 Network Namespace 中會(huì)默認(rèn)創(chuàng)建一個(gè) lo 回環(huán)網(wǎng)卡,此時(shí)網(wǎng)卡處于關(guān)閉狀態(tài)。此時(shí),嘗試去 ping 該 lo 回環(huán)網(wǎng)卡,會(huì)提示 Network is unreachable

[root@localhost~]#ipnetnsexecns0ping127.0.0.1
connect:Networkisunreachable

127.0.0.1是默認(rèn)回環(huán)網(wǎng)卡

通過(guò)下面的命令啟用 lo 回環(huán)網(wǎng)卡:

[root@localhost~]#ipnetnsexecns0iplinksetloup
[root@localhost~]#ipnetnsexecns0ping127.0.0.1
PING127.0.0.1(127.0.0.1)56(84)bytesofdata.
64bytesfrom127.0.0.1:icmp_seq=1ttl=64time=0.029ms
64bytesfrom127.0.0.1:icmp_seq=2ttl=64time=0.029ms
^C
---127.0.0.1pingstatistics---
2packetstransmitted,2received,0%packetloss,time1036ms
rttmin/avg/max/mdev=0.029/0.029/0.029/0.000ms

轉(zhuǎn)移設(shè)備

我們可以在不同的 Network Namespace 之間轉(zhuǎn)移設(shè)備(如 veth)。由于一個(gè)設(shè)備只能屬于一個(gè) Network Namespace ,所以轉(zhuǎn)移后在這個(gè) Network Namespace 內(nèi)就看不到這個(gè)設(shè)備了。

其中,veth 設(shè)備屬于可轉(zhuǎn)移設(shè)備,而很多其它設(shè)備(如 lo、vxlan、ppp、bridge 等)是不可以轉(zhuǎn)移的。

veth pair

veth pair 全稱是 Virtual Ethernet Pair,是一個(gè)成對(duì)的端口,所有從這對(duì)端口一 端進(jìn)入的數(shù)據(jù)包都將從另一端出來(lái),反之也是一樣。

引入 veth pair 是為了在不同的 Network Namespace 直接進(jìn)行通信,利用它可以直接將兩個(gè) Network Namespace 連接起來(lái)。

d2cb7296-4cfe-11ed-a3b6-dac502259ad0.png

創(chuàng)建 veth pair

[root@localhost~]#iplinkaddtypeveth
[root@localhost~]#ipa

4:veth0@veth1:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000
link/ether0ae2:2d:37:fbbrdffffff:ff
5:veth1@veth0:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000
link/ether5e:7e594fbrdffffff:ff

可以看到,此時(shí)系統(tǒng)中新增了一對(duì) veth pair,將 veth0 和 veth1 兩個(gè)虛擬網(wǎng)卡連接了起來(lái),此時(shí)這對(duì) veth pair 處于”未啟用“狀態(tài)。

實(shí)現(xiàn) Network Namespace 間通信

下面我們利用 veth pair 實(shí)現(xiàn)兩個(gè)不同的 Network Namespace 之間的通信。剛才我們已經(jīng)創(chuàng)建了一個(gè)名為 ns0 的 Network Namespace,下面再創(chuàng)建一個(gè)信息 Network Namespace,命名為 ns1

[root@localhost~]#ipnetnsaddns1
[root@localhost~]#ipnetnslist
ns1
ns0

然后我們將 veth0 加入到 ns0,將 veth1 加入到 ns1

[root@localhost~]#iplinksetveth0netnsns0
[root@localhost~]#iplinksetveth1netnsns1

然后我們分別為這對(duì) veth pair 配置上 ip 地址,并啟用它們

[root@localhost~]#ipnetnsexecns0iplinksetveth0up
[root@localhost~]#ipnetnsexecns0ipaddradd192.0.0.1/24devveth0
[root@localhost~]#ipnetnsexecns1iplinksetveth1up
[root@localhost~]#ipnetnsexecns1ipaddradd192.0.0.2/24devveth1

查看這對(duì) veth pair 的狀態(tài)

[root@localhost~]#ipnetnsexecns0ipa
1:lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
4:veth0@if5:mtu1500qdiscnoqueuestateUPgroupdefaultqlen1000
link/ether0ae2:2d:37:fbbrdffffff:fflink-netnsns1
inet192.0.0.1/24scopeglobalveth0
valid_lftforeverpreferred_lftforever
inet6fe80::8f4fe2d:37fb/64scopelink
valid_lftforeverpreferred_lftforever
[root@localhost~]#ipnetnsexecns1ipa
1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
5:veth1@if4:mtu1500qdiscnoqueuestateUPgroupdefaultqlen1000
link/ether5e:7e594fbrdffffff:fflink-netnsns0
inet192.0.0.2/24scopeglobalveth1
valid_lftforeverpreferred_lftforever
inet6fe80::5c7efe59:f04f/64scopelink
valid_lftforeverpreferred_lftforever

從上面可以看出,我們已經(jīng)成功啟用了這個(gè) veth pair,并為每個(gè) veth 設(shè)備分配了對(duì)應(yīng)的 ip 地址。我們嘗試在 ns1 中訪問(wèn) ns0 中的 ip 地址

[root@localhost~]#ipnetnsexecns1ping192.0.0.1
PING192.0.0.1(192.0.0.1)56(84)bytesofdata.
64bytesfrom192.0.0.1:icmp_seq=1ttl=64time=0.033ms
64bytesfrom192.0.0.1:icmp_seq=2ttl=64time=0.041ms
^C
---192.0.0.1pingstatistics---
2packetstransmitted,2received,0%packetloss,time1001ms
rttmin/avg/max/mdev=0.033/0.037/0.041/0.004ms
[root@localhost~]#ipnetnsexecns0ping192.0.0.2
PING192.0.0.2(192.0.0.2)56(84)bytesofdata.
64bytesfrom192.0.0.2:icmp_seq=1ttl=64time=0.025ms
64bytesfrom192.0.0.2:icmp_seq=2ttl=64time=0.025ms
^C
---192.0.0.2pingstatistics---
2packetstransmitted,2received,0%packetloss,time1038ms
rttmin/avg/max/mdev=0.025/0.025/0.025/0.000ms

可以看到,veth pair 成功實(shí)現(xiàn)了兩個(gè)不同 Network Namespace 之間的網(wǎng)絡(luò)交互。

四種網(wǎng)絡(luò)模式配置

bridge 模式配置

[root@localhost~]#dockerrun-it--nameti--rmbusybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02:4211:00:02
inetaddr:172.17.0.2Bcast:172.17.255.255Mask:255.255.0.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:12errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:1032(1.0KiB)TXbytes:0(0.0B)

loLinkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
UPLOOPBACKRUNNINGMTU:65536Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0(0.0B)TXbytes:0(0.0B)

在創(chuàng)建容器時(shí)添加--network bridge 與不加--network 選項(xiàng)效果是一致的

[root@localhost~]#dockerrun-it--namet1--networkbridge--rmbusybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02:4211:00:02
inetaddr:172.17.0.2Bcast:172.17.255.255Mask:255.255.0.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:8errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:696(696.0B)TXbytes:0(0.0B)

loLinkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
UPLOOPBACKRUNNINGMTU:65536Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0(0.0B)TXbytes:0(0.0B)

none 模式配置

[root@localhost~]#dockerrun-it--namet1--networknone--rmbusybox
/#ifconfig-a
loLinkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
UPLOOPBACKRUNNINGMTU:65536Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0(0.0B)TXbytes:0(0.0B)

container 模式配置

啟動(dòng)第一個(gè)容器

[root@localhost~]#dockerrun-dit--nameb3busybox
af5ba32f990ebf5a46d7ecaf1eec67f1712bbef6ad7df37d52b7a8a498a592a0

[root@localhost~]#dockerexec-itb3/bin/sh
/#ifconfig
eth0Linkencap:EthernetHWaddr02:4211:00:02
inetaddr:172.17.0.2Bcast:172.17.255.255Mask:255.255.0.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:11errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:906(906.0B)TXbytes:0(0.0B)

啟動(dòng)第二個(gè)容器

[root@localhost~]#dockerrun-it--nameb2--rmbusybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02:4211:00:03
inetaddr:172.17.0.3Bcast:172.17.255.255Mask:255.255.0.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:6errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:516(516.0B)TXbytes:0(0.0B)

可以看到名為 b2 的容器 IP 地址是 10.0.0.3,與第一個(gè)容器的 IP 地址不是一樣的,也就是說(shuō)并沒(méi)有共享網(wǎng)絡(luò),此時(shí)如果我們將第二個(gè)容器的啟動(dòng)方式改變一下,就可以使名為 b2 的容器 IP 與 B3 容器 IP 一致,也即共享 IP,但不共享文件系統(tǒng)。

[root@localhost~]#dockerrun-it--nameb2--rm--networkcontainer:b3busybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02:4211:00:02
inetaddr:172.17.0.2Bcast:172.17.255.255Mask:255.255.0.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:14errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:1116(1.0KiB)TXbytes:0(0.0B)

此時(shí)我們?cè)赽1容器上創(chuàng)建一個(gè)目錄

/#mkdir/tmp/data
/#ls/tmp
data

到 b2 容器上檢查/tmp 目錄會(huì)發(fā)現(xiàn)并沒(méi)有這個(gè)目錄,因?yàn)槲募到y(tǒng)是處于隔離狀態(tài),僅僅是共享了網(wǎng)絡(luò)而已。

在 b2 容器上部署一個(gè)站點(diǎn)

/#echo'helloworld'>/tmp/index.html
/#ls/tmp
index.html
/#httpd-h/tmp
/#netstat-antl
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddressForeignAddressState
tcp00:::80:::*LISTEN

在 b1 容器上用本地地址去訪問(wèn)此站點(diǎn)

/#wget-O--q172.17.0.2:80
helloworld

host 模式配置

啟動(dòng)容器時(shí)直接指明模式為 host

[root@localhost~]#dockerrun-it--nameb2--rm--networkhostbusybox
/#ifconfig
docker0Linkencap:EthernetHWaddr02:427F:8E:2C
inetaddr:172.17.0.1Bcast:172.17.255.255Mask:255.255.0.0
inet6addr:fe80::42fe7f:8e2c/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:3errors:0dropped:0overruns:0frame:0
TXpackets:20errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:116(116.0B)TXbytes:1664(1.6KiB)

ens33Linkencap:EthernetHWaddr00:0C:29:95:19:47
inetaddr:192.168.203.138Bcast:192.168.203.255Mask:255.255.255.0
inet6addr:fe80::2e61:1ea33d9b/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:9626errors:0dropped:0overruns:0frame:0
TXpackets:3950errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:3779562(3.6MiB)TXbytes:362386(353.8KiB)

loLinkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
inet6addr:::1/128Scope:Host
UPLOOPBACKRUNNINGMTU:65536Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0(0.0B)TXbytes:0(0.0B)

veth09ee47eLinkencap:EthernetHWaddrB2:10:53:7B:66:AE
inet6addr:fe80:53ff66ae/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:3errors:0dropped:0overruns:0frame:0
TXpackets:19errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:158(158.0B)TXbytes:1394(1.3KiB)

此時(shí)如果我們?cè)谶@個(gè)容器中啟動(dòng)一個(gè) http 站點(diǎn),我們就可以直接用宿主機(jī)的 IP 直接在瀏覽器中訪問(wèn)這個(gè)容器中的站點(diǎn)了。

容器的常用操作

查看容器的主機(jī)名

[root@localhost~]#dockerrun-it--namet1--networkbridge--rmbusybox
/#hostname
48cb45a0b2e7

在容器啟動(dòng)時(shí)注入主機(jī)名

[root@localhost~]#dockerrun-it--namet1--networkbridge--hostnameljl--rmbusybox
/#hostname
ljl
/#cat/etc/hosts
127.0.0.1localhost
::1localhostip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
172.17.0.3ljl
/#cat/etc/resolv.conf
#GeneratedbyNetworkManager
searchlocaldomain
nameserver192.168.203.2
/#pingwww.baidu.com
PINGwww.baidu.com(182.61.200.7):56databytes
64bytesfrom182.61.200.7:seq=0ttl=127time=31.929ms
64bytesfrom182.61.200.7:seq=1ttl=127time=41.062ms
64bytesfrom182.61.200.7:seq=2ttl=127time=31.540ms
^C
---www.baidu.compingstatistics---
3packetstransmitted,3packetsreceived,0%packetloss
round-tripmin/avg/max=31.540/34.843/41.062ms

手動(dòng)指定容器要使用的 DNS

[root@localhost~]#dockerrun-it--namet1--networkbridge--hostnameljl--dns114.114.114.114--rmbusybox
/#cat/etc/resolv.conf
searchlocaldomain
nameserver114.114.114.114
/#nslookup-type=awww.baidu.com
Server:114.114.114.114
Address:114.114.114.114:53

Non-authoritativeanswer:
www.baidu.comcanonicalname=www.a.shifen.com
Name:www.a.shifen.com
Address:182.61.200.6
Name:www.a.shifen.com
Address:182.61.200.7

手動(dòng)往/etc/hosts 文件中注入主機(jī)名到 IP 地址的映射

[root@localhost~]#dockerrun-it--namet1--networkbridge--hostnameljl--add-hostwww.a.com:1.1.1.1--rmbusybox
/#cat/etc/hosts
127.0.0.1localhost
::1localhostip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
1.1.1.1www.a.com
172.17.0.3ljl

開(kāi)放容器端口

執(zhí)行 docker run 的時(shí)候有個(gè)-p 選項(xiàng),可以將容器中的應(yīng)用端口映射到宿主機(jī)中,從而實(shí)現(xiàn)讓外部主機(jī)可以通過(guò)訪問(wèn)宿主機(jī)的某端口來(lái)訪問(wèn)容器內(nèi)應(yīng)用的目的。

-p 選項(xiàng)能夠使用多次,其所能夠暴露的端口必須是容器確實(shí)在監(jiān)聽(tīng)的端口。

-p 選項(xiàng)的使用格式:

-p containerPort

將指定的容器端口映射至主機(jī)所有地址的一個(gè)動(dòng)態(tài)端口-p hostPort : containerPort

將容器端口 containerPort 映射至指定的主機(jī)端口 hostPort

-p ip :: containerPort

將指定的容器端口 containerPort 映射至主機(jī)指定 ip 的動(dòng)態(tài)端口

-p ip : hostPort : containerPort

將指定的容器端口 containerPort 映射至主機(jī)指定 ip 的端口 hostPort

動(dòng)態(tài)端口指的是隨機(jī)端口,具體的映射結(jié)果可使用 docker port 命令查看。

[root@localhost~]#dockerrun-dit--nameweb1-p192.168.203.138::80httpd
e97bc1774e40132659990090f0e98a308a7f83986610ca89037713e9af8a6b9f
[root@localhost~]#dockerps
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
e97bc1774e40httpd"httpd-foreground"6secondsagoUp5seconds192.168.203.138:49153->80/tcpweb1
af5ba32f990ebusybox"sh"48minutesagoUp48minutesb3
[root@localhost~]#ss-antl
StateRecv-QSend-QLocalAddress:PortPeerAddress:PortProcess
LISTEN0128192.168.203.138:491530.0.0.0:*
LISTEN01280.0.0.0:220.0.0.0:*
LISTEN0128[::]:22[::]:*

以上命令執(zhí)行后會(huì)一直占用著前端,我們新開(kāi)一個(gè)終端連接來(lái)看一下容器的 80 端口被映射到了宿主機(jī)的什么端口上

[root@localhost~]#dockerportweb1
80/tcp->192.168.203.138:49153

由此可見(jiàn),容器的 80 端口被暴露到了宿主機(jī)的 49153 端口上,此時(shí)我們?cè)谒拗鳈C(jī)上訪問(wèn)一下這個(gè)端口看是否能訪問(wèn)到容器內(nèi)的站點(diǎn)

[root@localhost~]#curlhttp://192.168.203.138:49153

Itworks!

iptables 防火墻規(guī)則將隨容器的創(chuàng)建自動(dòng)生成,隨容器的刪除自動(dòng)刪除規(guī)則。

[root@localhost~]#iptables-tnat-nvL
ChainPREROUTING(policyACCEPT0packets,0bytes)
pktsbytestargetprotoptinoutsourcedestination
3164DOCKERall--**0.0.0.0/00.0.0.0/0ADDRTYPEmatchdst-typeLOCAL

ChainINPUT(policyACCEPT0packets,0bytes)
pktsbytestargetprotoptinoutsourcedestination

ChainPOSTROUTING(policyACCEPT0packets,0bytes)
pktsbytestargetprotoptinoutsourcedestination
4261MASQUERADEall--*!docker0172.17.0.0/160.0.0.0/0
00MASQUERADEtcp--**172.17.0.3172.17.0.3tcpdpt:80

ChainOUTPUT(policyACCEPT0packets,0bytes)
pktsbytestargetprotoptinoutsourcedestination
2120DOCKERall--**0.0.0.0/0!127.0.0.0/8ADDRTYPEmatchdst-typeLOCAL

ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
160RETURNall--docker0*0.0.0.0/00.0.0.0/0
160DNATtcp--!docker0*0.0.0.0/0192.168.203.138tcpdpt:49153to80

將容器端口映射到指定 IP 的隨機(jī)端口

[root@localhost~]#dockerrun-dit--nameweb1-p192.168.203.138::80httpd

在另一個(gè)終端上查看端口映射情況

[root@localhost~]#dockerportweb1
80/tcp->192.168.203.138:49153

自定義 docker0 橋的網(wǎng)絡(luò)屬性信息

自定義 docker0 橋的網(wǎng)絡(luò)屬性信息需要修改/etc/docker/daemon.json 配置文件

[root@localhost~]#cd/etc/docker/
[root@localhostdocker]#vimdaemon.json
[root@localhostdocker]#systemctldaemon-reload
[root@localhostdocker]#systemctlrestartdocker

{
"registry-mirrors":["https://4hygggbu.mirror.aliyuncs.com/"],
"bip":"192.168.1.5/24"
}
EOF

```ruby
[root@localhost~]#vim/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd-Hfd://--containerd=/run/containerd/containerd.sock-Htcp://0.0.0.0:2375-Hunix:///var/run/docker.sock
[root@localhost~]#systemctldaemon-reload
[root@localhost~]#systemctlrestartdocker

在客戶端上向 dockerd 直接傳遞“-H|--host”選項(xiàng)指定要控制哪臺(tái)主機(jī)上的 docker 容器

[root@localhost~]#docker-H192.168.203.138:2375ps
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
e97bc1774e40httpd"httpd-foreground"30minutesagoUp11seconds192.168.203.138:49153->80/tcpweb1
af5ba32f990ebusybox"sh"AboutanhouragoUp14secondsb3

創(chuàng)建新網(wǎng)絡(luò)

[root@localhost~]#dockernetworkcreateljl-dbridge
883eda50812bb214c04986ca110dbbcb7600eba8b033f2084cd4d750b0436e12
[root@localhost~]#dockernetworkls
NETWORKIDNAMEDRIVERSCOPE
0c5f4f114c27bridgebridgelocal
8c2d14f1fb82hosthostlocal
883eda50812bljlbridgelocal
85ed12d38815nonenulllocal

創(chuàng)建一個(gè)額外的自定義橋,區(qū)別于 docker0

[root@localhost~]#dockernetworkcreate-dbridge--subnet"192.168.2.0/24"--gateway"192.168.2.1"br0
af9ba80deb619de3167939ec5b6d6136a45dce90907695a5bc5ed4608d188b99
[root@localhost~]#dockernetworkls
NETWORKIDNAMEDRIVERSCOPE
af9ba80deb61br0bridgelocal
0c5f4f114c27bridgebridgelocal
8c2d14f1fb82hosthostlocal
883eda50812bljlbridgelocal
85ed12d38815nonenulllocal

使用新創(chuàng)建的自定義橋來(lái)創(chuàng)建容器:

[root@localhost~]#dockerrun-it--nameb1--networkbr0busybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02C002:02
inetaddr:192.168.2.2Bcast:192.168.2.255Mask:255.255.255.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:11errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:962(962.0B)TXbytes:0(0.0B)

再創(chuàng)建一個(gè)容器,使用默認(rèn)的 bridge 橋:

[root@localhost~]#dockerrun--nameb2-itbusybox
/#ls
bindevetchomeprocrootsystmpusrvar
/#ifconfig
eth0Linkencap:EthernetHWaddr02C001:03
inetaddr:192.168.1.3Bcast:192.168.1.255Mask:255.255.255.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:6errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:516(516.0B)TXbytes:0(0.0B)

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    490

    瀏覽量

    21986
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14256
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    446

    瀏覽量

    11738

原文標(biāo)題:5 年工作經(jīng)驗(yàn),Docker 的幾種網(wǎng)絡(luò)模式都說(shuō)不清,你敢信?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    四種不同供電模式的LED拓?fù)浣榻B

    本文中,小編將為大家介紹四種在LED供電當(dāng)中經(jīng)常使用的四種拓?fù)浣Y(jié)構(gòu)。感興趣的朋友快來(lái)看一看吧。 首先需要從了解轉(zhuǎn)換器的最小及最大輸出電壓入手。這只是將所有LED正向壓降與傳感電阻器電壓相加的總數(shù)
    發(fā)表于 10-10 15:07

    STM32芯片GPIO的四種輸入模式四種輸出模式

    STM32芯片的GPIO一共有8配置模式,對(duì)8模式的理解如下1.四種輸入模式上拉輸入:在默認(rèn)
    發(fā)表于 05-21 07:55

    docker四種網(wǎng)絡(luò)模式

    docker網(wǎng)絡(luò)模式
    發(fā)表于 10-16 08:11

    單片機(jī)四種輸入模式

    單片機(jī)四種輸入模式 MCU輸入模式有浮空、上拉、下拉、模擬輸入這四種模式,如果采用上拉或者下拉模式
    發(fā)表于 08-24 16:19

    變頻器主要支持四種模式

    變頻器主要支持四種模式:無(wú)PG的V/F模式,有PG的V/F模式,無(wú)PG的矢量控制模式,有PG的矢量模式
    發(fā)表于 09-03 06:57

    二維碼的四種主要應(yīng)用模式

    本文介紹二維碼主要的四種應(yīng)用模式,包括讀取數(shù)據(jù)模式、解碼上網(wǎng)模式、解碼驗(yàn)證模式、解碼通信模式。
    發(fā)表于 01-25 11:52 ?3373次閱讀

    WIFI模塊四種工作模式介紹_WIFI模塊工作模式淺析

    WIFI模塊常見(jiàn)的四種工作模式:透?jìng)?b class='flag-5'>模式、串口指令模式、HTTPD Client模式、GPIO模式
    發(fā)表于 01-19 14:45 ?2.8w次閱讀

    詳解docker四種網(wǎng)絡(luò)模式

    使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何
    的頭像 發(fā)表于 01-21 09:21 ?6510次閱讀

    docker的4網(wǎng)絡(luò)模式

    Docker 使用 Linux 橋接,在宿主機(jī)虛擬一個(gè) Docker 容器網(wǎng)橋(docker0),Docker 啟動(dòng)一個(gè)
    的頭像 發(fā)表于 08-14 11:50 ?1611次閱讀

    docker的4網(wǎng)絡(luò)模式配置

    Docker 使用 Linux 橋接,在宿主機(jī)虛擬一個(gè) Docker 容器網(wǎng)橋(docker0),Docker 啟動(dòng)一個(gè)
    的頭像 發(fā)表于 10-10 10:37 ?1281次閱讀

    Docker容器網(wǎng)絡(luò)的數(shù)據(jù)鏈路是什么

    單主機(jī)容器網(wǎng)絡(luò)可能存在多個(gè)docker,分屬于不同的bridge,它們之間有通信的需求。
    的頭像 發(fā)表于 02-15 09:56 ?808次閱讀
    <b class='flag-5'>Docker</b><b class='flag-5'>容器</b><b class='flag-5'>網(wǎng)絡(luò)</b>的數(shù)據(jù)鏈路是什么

    測(cè)試電容器四種方法有哪些

    測(cè)試電容器四種方法 電容器是一非常常見(jiàn)的電子元件,它具有存儲(chǔ)電能的能力。測(cè)試電容器的方法也非常多,下面我們將詳細(xì)介紹
    的頭像 發(fā)表于 09-01 15:11 ?1.2w次閱讀

    docker容器容器之間通信

    Docker容器之間的通信方式、通信過(guò)程以及常見(jiàn)的通信模式。 一、Docker容器之間的通信方式 在Do
    的頭像 發(fā)表于 11-23 09:36 ?1234次閱讀

    docker進(jìn)入容器的方法有哪些

    Docker是一流行的容器化平臺(tái),它能夠快速構(gòu)建、交付和運(yùn)行應(yīng)用程序。在使用Docker時(shí),我們經(jīng)常需要進(jìn)入容器進(jìn)行調(diào)試、管理和運(yùn)行命令等
    的頭像 發(fā)表于 11-23 09:45 ?8900次閱讀

    介紹MCUboot支持的四種升級(jí)模式(2)

    介紹MCUboot支持的四種升級(jí)模式,分別是Overwrite、Swap、Direct XIP和加載到RAM中執(zhí)行。由于FSP不支持第四種——加載到RAM中執(zhí)行,因?yàn)槲覀冎攸c(diǎn)介紹前三
    的頭像 發(fā)表于 06-13 10:56 ?514次閱讀
    介紹MCUboot支持的<b class='flag-5'>四種</b>升級(jí)<b class='flag-5'>模式</b>(2)