docker 容器網(wǎng)絡(luò )
Docker 在安裝后自動(dòng)提供 3 種網(wǎng)絡(luò ),可以使用 docker network ls 命令查看
[root@localhost~]#dockernetworkls NETWORKIDNAMEDRIVERSCOPE cd97bb997b84bridgebridgelocal 0a04824fc9b6hosthostlocal 4dcb8fbdb599nonenulllocal
Docker 使用Linux 橋接,在宿主機虛擬一個(gè) Docker容器網(wǎng)橋(docker0),Docker 啟動(dòng)一個(gè)容器時(shí)會(huì )根據 Docker 網(wǎng)橋的網(wǎng)段分配給容器一個(gè) IP 地址,稱(chēng)為 Container-IP,同時(shí) Docker 網(wǎng)橋是每個(gè)容器的默認網(wǎng)關(guān)。因為在同一宿主機內的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過(guò)容器的 Container-IP 直接通信。
docker 的 4 種網(wǎng)絡(luò )模式
bridge 模式
當 Docker 進(jìn)程啟動(dòng)時(shí),會(huì )在主機上創(chuàng )建一個(gè)名為 docker0 的虛擬網(wǎng)橋,此主機上啟動(dòng)的 Docker 容器會(huì )連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機類(lèi)似,這樣主機上的所有容器就通過(guò)交換機連在了一個(gè)二層網(wǎng)絡(luò )中。
從 docker0 子網(wǎng)中分配一個(gè) IP 給容器使用,并設置 docker0 的 IP 地址為容器的默認網(wǎng)關(guān)。在主機上創(chuàng )建一對虛擬網(wǎng)卡 veth pair 設備,Docker 將 veth pair 設備的一端放在新創(chuàng )建的容器中,并命名為 eth0(容器的網(wǎng)卡),另一端放在主機中,以 vethxxx 這樣類(lèi)似的名字命名,并將這個(gè)網(wǎng)絡(luò )設備加入到 docker0 網(wǎng)橋中??梢酝ㄟ^(guò)brctl show命令查看。
bridge 模式是 docker 的默認網(wǎng)絡(luò )模式,不寫(xiě)--network 參數,就是 bridge 模式。使用 docker run -p 時(shí),docker 實(shí)際是在 iptables 做了 DNAT 規則,實(shí)現端口轉發(fā)功能??梢允褂?iptables -t nat -vnL 查看。
bridge 模式如下圖所示:
假設上圖的 docker2 中運行了一個(gè) nginx,大家來(lái)想幾個(gè)問(wèn)題:
同主機間兩個(gè)容器間是否可以直接通信?比如在 docker1 上能不能直接訪(fǎng)問(wèn)到 docker2 的 nginx 站點(diǎn)?
在宿主機上能否直接訪(fǎng)問(wèn)到 docker2 的 nginx 站點(diǎn)?
在另一臺主機上如何訪(fǎng)問(wèn) node1 上的這個(gè) nginx 站點(diǎn)呢?DNAT 發(fā)布?
Docker 網(wǎng)橋是宿主機虛擬出來(lái)的,并不是真實(shí)存在的網(wǎng)絡(luò )設備,外部網(wǎng)絡(luò )是無(wú)法尋址到的,這也意味著(zhù)外部網(wǎng)絡(luò )無(wú)法通過(guò)直接 Container-IP 訪(fǎng)問(wèn)到容器。如果容器希望外部訪(fǎng)問(wèn)能夠訪(fǎng)問(wèn)到,可以通過(guò)映射容器端口到宿主主機(端口映射),即 docker run 創(chuàng )建容器時(shí)候通過(guò) -p 或 -P 參數來(lái)啟用,訪(fǎng)問(wèn)容器的時(shí)候就通過(guò)[宿主機 IP]:[容器端口]訪(fǎng)問(wèn)容器。
container 模式
這個(gè)模式指定新創(chuàng )建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè) Network Namespace,而不是和宿主機共享。新創(chuàng )建的容器不會(huì )創(chuàng )建自己的網(wǎng)卡,配置自己的 IP,而是和一個(gè)指定的容器共享 IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò )方面,其他的如文件系統、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò) lo 網(wǎng)卡設備通信。
container 模式如下圖所示:
host 模式
如果啟動(dòng)容器的時(shí)候使用 host 模式,那么這個(gè)容器將不會(huì )獲得一個(gè)獨立的 Network Namespace,而是和宿主機共用一個(gè) Network Namespace。容器將不會(huì )虛擬出自己的網(wǎng)卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。但是,容器的其他方面,如文件系統、進(jìn)程列表等還是和宿主機隔離的。
使用 host 模式的容器可以直接使用宿主機的 IP 地址與外界通信,容器內部的服務(wù)端口也可以使用宿主機的端口,不需要進(jìn)行 NAT,host 最大的優(yōu)勢就是網(wǎng)絡(luò )性能比較好,但是 docker host 上已經(jīng)使用的端口就不能再用了,網(wǎng)絡(luò )的隔離性不好。
Host 模式如下圖所示:
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)指定。這種類(lèi)型的網(wǎng)絡(luò )沒(méi)有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò )能很好的保證容器的安全性。
應用場(chǎng)景
啟動(dòng)一個(gè)容器處理數據,比如轉換數據格式
一些后臺的計算和處理任務(wù)
none 模式如下圖所示:
dockernetworkinspectbridge#查看bridge網(wǎng)絡(luò )的詳細配置
docker 容器網(wǎng)絡(luò )配置
Linux 內核實(shí)現名稱(chēng)空間的創(chuàng )建
ip netns 命令
可以借助 ip netns 命令來(lái)完成對 Network Namespace 的各種操作。ip netns 命令來(lái)自于 iproute 安裝包,一般系統會(huì )默認安裝,如果沒(méi)有的話(huà),請自行安裝。
注意:ip netns 命令修改網(wǎng)絡(luò )配置時(shí)需要 sudo 權限。
可以通過(guò) ip netns 命令完成對 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
默認情況下,Linux 系統中是沒(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ì )出現在/var/run/netns/目錄下。如果相同名字的 namespace 已經(jīng)存在,命令會(huì )報 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
對于每個(gè) Network Namespace 來(lái)說(shuō),它會(huì )有自己獨立的網(wǎng)卡、路由表、ARP 表、iptables 等和網(wǎng)絡(luò )相關(guān)的資源。
操作 Network Namespace
ip 命令提供了 ip netns exec 子命令可以在對應的 Network Namespace 中執行命令。
查看新創(chuàng )建 Network Namespace 的網(wǎng)卡信息
[root@localhost~]#ipnetnsexecns0ipaddr 1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000 link/loopback000000:00brd000000:00
可以看到,新創(chuàng )建的 Network Namespace 中會(huì )默認創(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是默認回環(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
轉移設備
我們可以在不同的 Network Namespace 之間轉移設備(如 veth)。由于一個(gè)設備只能屬于一個(gè) Network Namespace ,所以轉移后在這個(gè) Network Namespace 內就看不到這個(gè)設備了。
其中,veth 設備屬于可轉移設備,而很多其它設備(如 lo、vxlan、ppp、bridge 等)是不可以轉移的。
veth pair
veth pair 全稱(chēng)是 Virtual Ethernet Pair,是一個(gè)成對的端口,所有從這對端口一 端進(jìn)入的數據包都將從另一端出來(lái),反之也是一樣。
引入 veth pair 是為了在不同的 Network Namespace 直接進(jìn)行通信,利用它可以直接將兩個(gè) Network Namespace 連接起來(lái)。
創(chuàng )建 veth pair
[root@localhost~]#iplinkaddtypeveth [root@localhost~]#ipa 4:veth0@veth1:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000 link/ether0ae237:fbbrdffffff:ff 5:veth1@veth0: mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000 link/ether5ef6f0:4fbrdffffff:ff
可以看到,此時(shí)系統中新增了一對 veth pair,將 veth0 和 veth1 兩個(gè)虛擬網(wǎng)卡連接了起來(lái),此時(shí)這對 veth pair 處于”未啟用“狀態(tài)。
實(shí)現 Network Namespace 間通信
下面我們利用 veth pair 實(shí)現兩個(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
然后我們分別為這對 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 的狀態(tài)
[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
從上面可以看出,我們已經(jīng)成功啟用了這個(gè) veth pair,并為每個(gè) veth 設備分配了對應的 ip 地址。我們嘗試在 ns1 中訪(fǎng)問(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í)現了兩個(gè)不同 Network Namespace 之間的網(wǎng)絡(luò )交互。
四種網(wǎng)絡(luò )模式配置
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)
在創(chuàng )建容器時(shí)添加--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 模式配置
啟動(dòng)第一個(gè)容器
[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)
啟動(dòng)第二個(gè)容器
[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,與第一個(gè)容器的 IP 地址不是一樣的,也就是說(shuō)并沒(méi)有共享網(wǎng)絡(luò ),此時(shí)如果我們將第二個(gè)容器的啟動(dòng)方式改變一下,就可以使名為 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)
此時(shí)我們在b1容器上創(chuàng )建一個(gè)目錄
/#mkdir/tmp/data /#ls/tmp data
到 b2 容器上檢查/tmp 目錄會(huì )發(fā)現并沒(méi)有這個(gè)目錄,因為文件系統是處于隔離狀態(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 容器上用本地地址去訪(fǎng)問(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: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)
此時(shí)如果我們在這個(gè)容器中啟動(dòng)一個(gè) http 站點(diǎn),我們就可以直接用宿主機的 IP 直接在瀏覽器中訪(fǎng)問(wèn)這個(gè)容器中的站點(diǎn)了。
容器的常用操作
查看容器的主機名
[root@localhost~]#dockerrun-it--namet1--networkbridge--rmbusybox /#hostname 48cb45a0b2e7
在容器啟動(dòng)時(shí)注入主機名
[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 文件中注入主機名到 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)放容器端口
執行 docker run 的時(shí)候有個(gè)-p 選項,可以將容器中的應用端口映射到宿主機中,從而實(shí)現讓外部主機可以通過(guò)訪(fǎng)問(wèn)宿主機的某端口來(lái)訪(fǎng)問(wèn)容器內應用的目的。
-p 選項能夠使用多次,其所能夠暴露的端口必須是容器確實(shí)在監聽(tīng)的端口。
-p 選項的使用格式:
-p containerPort
將指定的容器端口映射至主機所有地址的一個(gè)動(dòng)態(tài)端口
-p hostPort : containerPort
將容器端口 containerPort 映射至指定的主機端口 hostPort
-p ip :: containerPort
將指定的容器端口 containerPort 映射至主機指定 ip 的動(dòng)態(tài)端口
-p ip : hostPort : containerPort
將指定的容器端口 containerPort 映射至主機指定 ip 的端口 hostPort
動(dòng)態(tài)端口指的是隨機端口,具體的映射結果可使用 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[::]:*
以上命令執行后會(huì )一直占用著(zhù)前端,我們新開(kāi)一個(gè)終端連接來(lái)看一下容器的 80 端口被映射到了宿主機的什么端口上
[root@localhost~]#dockerportweb1 80/tcp->192.168.203.138:49153
由此可見(jiàn),容器的 80 端口被暴露到了宿主機的 49153 端口上,此時(shí)我們在宿主機上訪(fǎng)問(wèn)一下這個(gè)端口看是否能訪(fǎng)問(wèn)到容器內的站點(diǎn)
[root@localhost~]#curlhttp://192.168.203.138:49153Itworks!
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
iptables 防火墻規則將隨容器的創(chuàng )建自動(dòng)生成,隨容器的刪除自動(dòng)刪除規則。
[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
在另一個(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
在客戶(hù)端上向 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
創(chuàng )建新網(wǎng)絡(luò )
[root@localhost~]#dockernetworkcreateljl-dbridge 883eda50812bb214c04986ca110dbbcb7600eba8b033f2084cd4d750b0436e12 [root@localhost~]#dockernetworkls NETWORKIDNAMEDRIVERSCOPE 0c5f4f114c27bridgebridgelocal 8c2d14f1fb82hosthostlocal 883eda50812bljlbridgelocal 85ed12d38815nonenulllocal
創(chuàng )建一個(gè)額外的自定義橋,區別于 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è)容器,使用默認的 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)
-
端口
+關(guān)注
關(guān)注
4文章
839瀏覽量
31707 -
容器
+關(guān)注
關(guān)注
0文章
483瀏覽量
21926 -
Docker
+關(guān)注
關(guān)注
0文章
442瀏覽量
11662
原文標題:Docker 容器網(wǎng)絡(luò )及其配置詳解
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論