色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

docker的4種網絡模式配置

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 作者:馬哥Linux運維 ? 2022-10-10 10:37 ? 次閱讀

docker 容器網絡

Docker 在安裝后自動提供 3 種網絡,可以使用 docker network ls 命令查看

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

Docker 使用Linux 橋接,在宿主機虛擬一個 Docker容器網橋(docker0),Docker 啟動一個容器時會根據 Docker 網橋的網段分配給容器一個 IP 地址,稱為 Container-IP,同時 Docker 網橋是每個容器的默認網關。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的 Container-IP 直接通信

docker 的 4 種網絡模式

2d4ba4ac-47af-11ed-a3b6-dac502259ad0.png

2d609038-47af-11ed-a3b6-dac502259ad0.png

bridge 模式

當 Docker 進程啟動時,會在主機上創建一個名為 docker0 的虛擬網橋,此主機上啟動的 Docker 容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。

從 docker0 子網中分配一個 IP 給容器使用,并設置 docker0 的 IP 地址為容器的默認網關。在主機上創建一對虛擬網卡 veth pair 設備,Docker 將 veth pair 設備的一端放在新創建的容器中,并命名為 eth0(容器的網卡),另一端放在主機中,以 vethxxx 這樣類似的名字命名,并將這個網絡設備加入到 docker0 網橋中。可以通過brctl show命令查看。

bridge 模式是 docker 的默認網絡模式,不寫--network 參數,就是 bridge 模式。使用 docker run -p 時,docker 實際是在 iptables 做了 DNAT 規則,實現端口轉發功能。可以使用 iptables -t nat -vnL 查看。

bridge 模式如下圖所示:

2df869e4-47af-11ed-a3b6-dac502259ad0.png

假設上圖的 docker2 中運行了一個 nginx,大家來想幾個問題:

同主機間兩個容器間是否可以直接通信?比如在 docker1 上能不能直接訪問到 docker2 的 nginx 站點?

在宿主機上能否直接訪問到 docker2 的 nginx 站點?

在另一臺主機上如何訪問 node1 上的這個 nginx 站點呢?DNAT 發布?

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

container 模式

這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。

container 模式如下圖所示:

2e235b40-47af-11ed-a3b6-dac502259ad0.png

host 模式

如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。

使用 host 模式的容器可以直接使用宿主機的 IP 地址與外界通信,容器內部的服務端口也可以使用宿主機的端口,不需要進行 NAT,host 最大的優勢就是網絡性能比較好,但是 docker host 上已經使用的端口就不能再用了,網絡的隔離性不好。

Host 模式如下圖所示:

2e43923e-47af-11ed-a3b6-dac502259ad0.png

none 模式

使用 none 模式,Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker 容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、IP、路由等信息。需要我們自己為 Docker 容器添加網卡、配置 IP 等。

這種網絡模式下容器只有 lo 回環網絡,沒有其他網卡。none 模式可以在容器創建時通過--network none 來指定。這種類型的網絡沒有辦法聯網,封閉的網絡能很好的保證容器的安全性。

應用場景

啟動一個容器處理數據,比如轉換數據格式

一些后臺的計算和處理任務

none 模式如下圖所示:

2e586a7e-47af-11ed-a3b6-dac502259ad0.png

dockernetworkinspectbridge#查看bridge網絡的詳細配置

docker 容器網絡配置

Linux 內核實現名稱空間的創建

ip netns 命令

可以借助 ip netns 命令來完成對 Network Namespace 的各種操作。ip netns 命令來自于 iproute 安裝包,一般系統會默認安裝,如果沒有的話,請自行安裝。

注意:ip netns 命令修改網絡配置時需要 sudo 權限。

可以通過 ip netns 命令完成對 Network Namespace 的相關操作,可以通過 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

默認情況下,Linux 系統中是沒有任何 Network Namespace 的,所以 ip netns list 命令不會返回任何信息。

創建 Network Namespace

通過命令創建一個名為 ns0 的命名空間:

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

新創建的 Network Namespace 會出現在/var/run/netns/目錄下。如果相同名字的 namespace 已經存在,命令會報 Cannot create namespace file "/var/run/netns/ns0": File exists 的錯誤。

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

對于每個 Network Namespace 來說,它會有自己獨立的網卡、路由表、ARP 表、iptables 等和網絡相關的資源。

操作 Network Namespace

ip 命令提供了 ip netns exec 子命令可以在對應的 Network Namespace 中執行命令。

查看新創建 Network Namespace 的網卡信息

[root@localhost~]#ipnetnsexecns0ipaddr
1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000
link/loopback000000:00brd000000:00

可以看到,新創建的 Network Namespace 中會默認創建一個 lo 回環網卡,此時網卡處于關閉狀態。此時,嘗試去 ping 該 lo 回環網卡,會提示 Network is unreachable

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

127.0.0.1是默認回環網卡

通過下面的命令啟用 lo 回環網卡:

[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

轉移設備

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

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

veth pair

veth pair 全稱是 Virtual Ethernet Pair,是一個成對的端口,所有從這對端口一 端進入的數據包都將從另一端出來,反之也是一樣。

引入 veth pair 是為了在不同的 Network Namespace 直接進行通信,利用它可以直接將兩個 Network Namespace 連接起來。

2e749140-47af-11ed-a3b6-dac502259ad0.png

創建 veth pair

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

4:veth0@veth1:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000
link/ether0ae237:fbbrdffffff:ff
5:veth1@veth0:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000
link/ether5ef6f0:4fbrdffffff:ff

可以看到,此時系統中新增了一對 veth pair,將 veth0 和 veth1 兩個虛擬網卡連接了起來,此時這對 veth pair 處于”未啟用“狀態。

實現 Network Namespace 間通信

下面我們利用 veth pair 實現兩個不同的 Network Namespace 之間的通信。剛才我們已經創建了一個名為 ns0 的 Network Namespace,下面再創建一個信息 Network Namespace,命名為 ns1

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

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

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

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

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

查看這對 veth pair 的狀態

[root@localhost~]#ipnetnsexecns0ipa
1:lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000
link/loopback000000:00brd000000:00
inet127.0.0.1/8scopehostlo
valid_lftforeverpreferred_lftforever
inet6::1/128scopehost
valid_lftforeverpreferred_lftforever
4:veth0@if5:mtu1500qdiscnoqueuestateUPgroupdefaultqlen1000
link/ether0ae237:fbbrdffffff:fflink-netnsns1
inet192.0.0.1/24scopeglobalveth0
valid_lftforeverpreferred_lftforever
inet6fe80:e2ff37fb/64scopelink
valid_lftforeverpreferred_lftforever
[root@localhost~]#ipnetnsexecns1ipa
1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000
link/loopback000000:00brd000000:00
5:veth1@if4:mtu1500qdiscnoqueuestateUPgroupdefaultqlen1000
link/ether5ef6f0:4fbrdffffff:fflink-netnsns0
inet192.0.0.2/24scopeglobalveth1
valid_lftforeverpreferred_lftforever
inet6fe80:f6fff04f/64scopelink
valid_lftforeverpreferred_lftforever

從上面可以看出,我們已經成功啟用了這個 veth pair,并為每個 veth 設備分配了對應的 ip 地址。我們嘗試在 ns1 中訪問 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 成功實現了兩個不同 Network Namespace 之間的網絡交互。

四種網絡模式配置

bridge 模式配置

[root@localhost~]#dockerrun-it--nameti--rmbusybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02AC00: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)

在創建容器時添加--network bridge 與不加--network 選項效果是一致的

[root@localhost~]#dockerrun-it--namet1--networkbridge--rmbusybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02AC00: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 模式配置

啟動第一個容器

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

[root@localhost~]#dockerexec-itb3/bin/sh
/#ifconfig
eth0Linkencap:EthernetHWaddr02AC00: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)

啟動第二個容器

[root@localhost~]#dockerrun-it--nameb2--rmbusybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02AC00: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,與第一個容器的 IP 地址不是一樣的,也就是說并沒有共享網絡,此時如果我們將第二個容器的啟動方式改變一下,就可以使名為 b2 的容器 IP 與 B3 容器 IP 一致,也即共享 IP,但不共享文件系統。

[root@localhost~]#dockerrun-it--nameb2--rm--networkcontainer:b3busybox
/#ifconfig
eth0Linkencap:EthernetHWaddr02AC00: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)

此時我們在b1容器上創建一個目錄

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

到 b2 容器上檢查/tmp 目錄會發現并沒有這個目錄,因為文件系統是處于隔離狀態,僅僅是共享了網絡而已。

在 b2 容器上部署一個站點

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

在 b1 容器上用本地地址去訪問此站點

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

host 模式配置

啟動容器時直接指明模式為 host

[root@localhost~]#dockerrun-it--nameb2--rm--networkhostbusybox
/#ifconfig
docker0Linkencap:EthernetHWaddr02B88E:2C
inetaddr:172.17.0.1Bcast:172.17.255.255Mask:255.255.0.0
inet6addr:fe80:b8ff8e2c/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:EthernetHWaddr002919:47
inetaddr:192.168.203.138Bcast:192.168.203.255Mask:255.255.255.0
inet6addr:fe80: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:EthernetHWaddrB25366: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)

此時如果我們在這個容器中啟動一個 http 站點,我們就可以直接用宿主機的 IP 直接在瀏覽器中訪問這個容器中的站點了。

容器的常用操作

查看容器的主機名

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

在容器啟動時注入主機名

[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

手動指定容器要使用的 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

手動往/etc/hosts 文件中注入主機名到 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

開放容器端口

執行 docker run 的時候有個-p 選項,可以將容器中的應用端口映射到宿主機中,從而實現讓外部主機可以通過訪問宿主機的某端口來訪問容器內應用的目的。

-p 選項能夠使用多次,其所能夠暴露的端口必須是容器確實在監聽的端口。

-p 選項的使用格式:

-p containerPort

將指定的容器端口映射至主機所有地址的一個動態端口

-p hostPort : containerPort

將容器端口 containerPort 映射至指定的主機端口 hostPort

-p ip :: containerPort

將指定的容器端口 containerPort 映射至主機指定 ip 的動態端口

-p ip : hostPort : containerPort

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

動態端口指的是隨機端口,具體的映射結果可使用 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[::]:*

以上命令執行后會一直占用著前端,我們新開一個終端連接來看一下容器的 80 端口被映射到了宿主機的什么端口上

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

由此可見,容器的 80 端口被暴露到了宿主機的 49153 端口上,此時我們在宿主機上訪問一下這個端口看是否能訪問到容器內的站點

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

Itworks!

iptables 防火墻規則將隨容器的創建自動生成,隨容器的刪除自動刪除規則。

[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 的隨機端口

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

在另一個終端上查看端口映射情況

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

自定義 docker0 橋的網絡屬性信息

自定義 docker0 橋的網絡屬性信息需要修改/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”選項指定要控制哪臺主機上的 docker 容器

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

創建新網絡

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

創建一個額外的自定義橋,區別于 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

使用新創建的自定義橋來創建容器:

[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)

再創建一個容器,使用默認的 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)

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 端口
    +關注

    關注

    4

    文章

    963

    瀏覽量

    32051
  • 容器
    +關注

    關注

    0

    文章

    495

    瀏覽量

    22060
  • Docker
    +關注

    關注

    0

    文章

    457

    瀏覽量

    11846

原文標題:Docker 容器網絡及其配置詳解

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何在softAP模式配置station模式網絡SSID和密碼?

    我們打算在沒有用戶界面的環境中使用該模塊。我們需要配置WIFI站模式SSID參數和密碼才能連接到本地WIFI網絡。一方法是使用 smartconfig
    發表于 07-16 07:57

    Linux網卡配置4方案

    1、直接修改網卡配置文件 2、nmtui——基于命令行的工具 3、nm-connection-editor——圖形化界面 4、點擊虛擬機右上角小圖標配置先將虛擬機改為僅主機模式 輸入v
    發表于 07-04 08:17

    docker的四網絡模式

    docker網絡模式
    發表于 10-16 08:11

    基于 Firefly Ubuntu 20.04的Docker內核配置

    1. Docker 相關1.1. Docker 支持Firefly 發布的普通固件一般不滿足 Docker 的運行要求,如果有需求,可以使用 SDK 打開內核的相關配置,重新編譯燒錄內
    發表于 10-25 17:14

    詳解docker的四網絡模式

    使用none模式Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個
    的頭像 發表于 01-21 09:21 ?6608次閱讀

    思科網絡交換機的6命令配置模式

    我們在配置交換機的時候首先要了解的就是交換機命令模式,小編用Cisco思科交換機為例帶大家了解交換機的6配置模式
    的頭像 發表于 04-13 16:41 ?1.3w次閱讀

    國內Docker CE 鏡像源的配置

    的新名稱,Docker CE 包含了完整的 Docker 平臺,非常適合開發人員和運維團隊構建容器 APP。 ? 配置方法 Ubuntu 14.04/16.04(使用 apt-get 進行安裝
    的頭像 發表于 11-09 09:16 ?3650次閱讀

    weblogic-docker Docker配置項目

    ./oschina_soft/weblogic-docker.zip
    發表于 05-13 10:30 ?0次下載
    weblogic-<b class='flag-5'>docker</b> <b class='flag-5'>Docker</b>的<b class='flag-5'>配置</b>項目

    Docker鏡像的詳細講解

    本文是對 Docker 鏡像的詳細講解,講解了如何安裝 Docker配置 Docker 鏡像加速以及操作 Docker 鏡像。希望對大家有
    的頭像 發表于 08-02 10:00 ?2171次閱讀

    docker4網絡模式

    Docker 使用 Linux 橋接,在宿主機虛擬一個 Docker 容器網橋(docker0),Docker 啟動一個容器時會根據 Docker
    的頭像 發表于 08-14 11:50 ?1818次閱讀

    交換機的6配置模式

    我們在配置交換機的時候首先要了解的就是交換機命令模式,小編用Cisco思科交換機為例帶大家了解交換機的6配置模式
    的頭像 發表于 09-26 15:01 ?9220次閱讀

    Docker容器的四網絡模式

    Docker 在安裝后自動提供 3 網絡,可以使用 docker network ls 命令查看。
    的頭像 發表于 10-17 14:53 ?1642次閱讀

    docker容器與容器之間通信

    Docker容器之間的通信方式、通信過程以及常見的通信模式。 一、Docker容器之間的通信方式 在Docker中,容器之間可以通過多種方式進行通信,常見的通信方式有以下幾種: 容器間
    的頭像 發表于 11-23 09:36 ?1544次閱讀

    Docker網絡的基本概念和原理與用法

    橋接網絡(Bridge Network):這是 Docker 容器默認使用的網絡類型。每個獨立的容器都會連接到一個內部網絡的私有網橋。 主機
    發表于 03-18 12:26 ?739次閱讀
    <b class='flag-5'>Docker</b><b class='flag-5'>網絡</b>的基本概念和原理與用法

    docker-compose配置文件內容詳解以及常用命令介紹

    一、Docker Compose 簡介 Docker Compose是一用于定義和運行多容器Docker應用程序的工具。通過一個? docker
    的頭像 發表于 12-02 09:29 ?229次閱讀
    <b class='flag-5'>docker</b>-compose<b class='flag-5'>配置</b>文件內容詳解以及常用命令介紹
    主站蜘蛛池模板: 校花娇喘呻吟校长陈若雪视频| 亚洲精品乱码久久久久久v| 亚洲电影网址| 最新无码专区在线视频| 东京热 百度影音| 久久国产精品高清一区二区三区| 女教师の诱惑| 亚洲第一页视频| jijzzizz中国版| 狠狠躁天天躁小说| 青柠电影在线看| 亚洲一区二区三不卡高清| 拔擦拔擦8X永久华人免费播放器| 好紧好湿太硬了我太爽了小说| 欧美亚洲精品真实在线| 亚洲精品久久无码AV片银杏| 99国产这里只有精品视频| 国语对白老女人8av| 青青在线视版在线播放| 亚洲在线无码免费观看| 动漫人物差差差30分钟免费看| 久久合| 天美传媒MV高清免费看| 9277在线观看免费高清完整版| 国产精品无码人妻在线| 欧美精品华人在线| 一级做a爰片久久毛片免费| 国产大片51精品免费观看| 免费精品美女久久久久久久久| 亚洲另类中文字幕| 国产XXXXXX农村野外| 内射老妇BBX| 在线观看成年人免费视频| 国产伦精品一区二区免费| 欧美性情一线免费http| 在线中文字幕| 黑人开嫩苞| 校园全肉高h湿一女多男| 潮 喷女王cytherea| 内射少妇三洞齐开| 在线观看国产亚洲|