Docker已經(jīng)上市很多年,不是什么新鮮事物了,很多企業(yè)或者開發(fā)同學(xué)以前也不多不少有所接觸,但是有實操經(jīng)驗的人不多,本系列教程主要偏重實戰(zhàn),盡量講干貨,會根據(jù)本人理解去做闡述,具體官方概念可以查閱官方教程,本章目標如下
本系列教程導(dǎo)航:
Docker深入淺出系列 | 容器初體驗
Docker深入淺出系列 | Image實戰(zhàn)演練
教程目標
- 了解Docker容器網(wǎng)絡(luò)通信原理
- 了解Linux網(wǎng)絡(luò)虛擬化技術(shù)的原理
- 了解容器在Linux上怎么進行網(wǎng)絡(luò)隔離
- 了解Docker端口映射配置
- 了解Docker的網(wǎng)絡(luò)模式
- 了解如何在Docker使用自定義網(wǎng)絡(luò)
- 了解Docker網(wǎng)絡(luò)操作的一些常用指令
準備工作
本教程是基于第一章創(chuàng)建的虛擬機、操作系統(tǒng)和Docker演示
- 虛擬機 - VirtualBox-6.0.14-133895-OSX.dmg
- 虛擬機管理工具 - Vagrant_2.2.6_x86_64.dmg
- 操作系統(tǒng) - Centos7
- 容器技術(shù) - Docker
帶著問題開車
同一主機兩個容器如何相互通信?
在同一臺主機內(nèi)的兩個容器是怎么通信的呢?
兩個容器是怎么做到網(wǎng)絡(luò)隔離的呢?

怎么從服務(wù)器外訪問容器
我怎樣才能在服務(wù)器外通過瀏覽器訪問到服務(wù)器里的端口為8080的容器的資源?

Docker的三種網(wǎng)絡(luò)模式是什么
Docker的三種網(wǎng)絡(luò)模式是什么,都有什么特點呢?

Docker網(wǎng)絡(luò)通信原理
計算機網(wǎng)絡(luò)模型回顧

在互聯(lián)網(wǎng)世界,兩臺主機要進行通信,是通過兩個網(wǎng)卡/網(wǎng)絡(luò)接口連接起來,接收和發(fā)送數(shù)據(jù)包都經(jīng)過網(wǎng)卡,兩個網(wǎng)卡之間相當(dāng)于建立了一條通信管道。

Linux中的網(wǎng)卡
查看網(wǎng)卡接口信息
1.查看鏈路層網(wǎng)卡信息
ip link show
[root@10 /]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
2.顯示應(yīng)用層網(wǎng)卡信息,可以看到更多詳細信息,例如ip地址
ip a
[root@10 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 57001sec preferred_lft 57001sec
inet6 fe80::5054:ff:fe8a:fee6/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.12/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1
valid_lft 143401sec preferred_lft 143401sec
inet6 fe80::a00:27ff:feba:a28/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
3.顯示系統(tǒng)所有的網(wǎng)卡
ls /sys/class/net
[root@10 /]# ls /sys/class/net
docker0 eth0 eth1 lo
網(wǎng)卡的操作
ip a 核心信息詳解
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.12/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1
valid_lft 143401sec preferred_lft 143401sec
inet6 fe80::a00:27ff:feba:a28/64 scope link
valid_lft forever preferred_lft forever
<BROADCAST,MULTICAST,UP,LOWER_UP> 這個配置串告訴我們:
BROADCAST 該接口支持廣播
MULTICAST 該接口支持多播
UP 網(wǎng)絡(luò)接口已啟用
LOWER_UP 網(wǎng)絡(luò)電纜已插入,設(shè)備已連接至網(wǎng)絡(luò)
其他配置信息:
mtu 1500 最大傳輸單位(數(shù)據(jù)包大?。?,500字節(jié)
qdisc pfifo_fast 用于數(shù)據(jù)包排隊
state UP 網(wǎng)絡(luò)接口已啟用
group default 接口組
qlen 1000 傳輸隊列長度
link/ether 08:00:27:ba:0a:28 接口的 MAC(硬件)地址
brd ff:ff:ff:ff:ff:ff 廣播地址
inet 192.168.100.12/24 綁定的IPv4 地址
brd 192.168.0.255 廣播地址
scope global 全局有效
dynamic eth1 地址是動態(tài)分配的
valid_lft 143401sec IPv4 地址的有效使用期限
preferred_lft 143401sec IPv4 地址的首選生存期
inet6 fe80::a00:27ff:feba:a28/64 IPv6 地址
scope link 僅在此設(shè)備上有效
valid_lft forever IPv6 地址的有效使用期限
preferred_lft forever IPv6 地址的首選生存期
網(wǎng)卡的配置文件
通過以下命令,可以查看對應(yīng)網(wǎng)卡的配置信息,ifcfg-*文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0
修改網(wǎng)卡配置,綁定一個新ip地址
這里可以修改配置文件ifcfg-*直接復(fù)制一份新的ip配置添加,但是我默認網(wǎng)絡(luò)用的是動態(tài)ip,通過命令會更方便
[root@10 /]# ip addr add 192.168.0.100/24 dev eth0
從下面可以看到,通過ip a 查看,新的ip已經(jīng)成功綁定
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 54131sec preferred_lft 54131sec
inet 192.168.0.100/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe8a:fee6/64 scope link
valid_lft forever preferred_lft forever
可以通過以下指定,把新增的ip清理掉
ip addr delete 192.168.0.100/24 dev eth0
網(wǎng)卡的重啟與啟動
重啟網(wǎng)卡
service network restart / systemctl restart network
啟動或者關(guān)閉網(wǎng)卡
ifup/ifdown eth0 or ip link set eth0 up/down
Linux網(wǎng)絡(luò)虛擬化技術(shù)
從上文我們可以知道,兩個主機通信是通過兩個網(wǎng)卡連接起來,那在同一個Linux系統(tǒng),怎么模擬多個網(wǎng)絡(luò)環(huán)境,兩個容器是怎么做到網(wǎng)絡(luò)隔離呢?

在Linux系統(tǒng)中,是通過network namespace來進行網(wǎng)絡(luò)隔離,Docker也是利用該技術(shù),創(chuàng)建一個完全隔離的新網(wǎng)絡(luò)環(huán)境,這個環(huán)境包括一個獨立的網(wǎng)卡空間,路由表,ARP表,ip地址表,iptables,ebtables,等等??傊?,與網(wǎng)絡(luò)有關(guān)的組件都是獨立的。
ip 命令提供了ip netns exec 子命令可以在對應(yīng)的network namesapce進行操作,要執(zhí)行的可以是任何命令,不只是和網(wǎng)絡(luò)相關(guān)的,創(chuàng)建network namesapce后可以通過ip ntns exec +namespace名+shell指令進行操作。例如在對應(yīng)namespace查看網(wǎng)卡信息ip ntns exec nsn1 ip a
創(chuàng)建虛擬網(wǎng)絡(luò)環(huán)境
常用的一些network namespace指令如下:
ip netns list #查看network namespace
ip netns add ns1 #添加network namespace
ip netns delete ns1 #刪除network namespace
創(chuàng)建namespace - ns1
1.創(chuàng)建network namespace - ns1
[root@10 /]# ip netns add ns1
2.查看ns1網(wǎng)卡信息
[root@10 /]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
可以看到這時候網(wǎng)卡狀態(tài)是Down,此時只有一個lo網(wǎng)卡
3.啟動ns1上的lo網(wǎng)卡
[root@10 /]# ip netns exec ns1 ifup lo
4.查看網(wǎng)卡狀態(tài)
[root@10 /]# ip netns exec ns1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state unk group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
此時網(wǎng)卡狀態(tài)已經(jīng)變成UNKOWN,lo網(wǎng)卡上也綁定了一個本地回環(huán)地址127.0.0.1/8
創(chuàng)建namespace - ns2
重復(fù)上面步驟,按照上面的指令把ns1改為ns2執(zhí)行一邊,最后可以看到網(wǎng)卡狀態(tài)也為UNKOWN
[root@10 /]# ip netns exec ns2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
經(jīng)過上面的一系列步驟,兩個network namespace的網(wǎng)絡(luò)結(jié)構(gòu)如下:

此時兩個Network Namespace只有l(wèi)o設(shè)備,互相之間是沒有關(guān)聯(lián),無法通信,只能同一Network Namesapce內(nèi)的應(yīng)用訪問。
連通兩個Network Namespace
Linux提供Virtual Ethernet Pair 技術(shù),分別在兩個namespace建立一對網(wǎng)絡(luò)接口,類似在兩個name space之間建立一條pipe,好像拉一條網(wǎng)線一樣,讓彼此之間可以通信,簡稱veth pair 。
veth pair 是成對出現(xiàn),刪除其中一個,另一個也會自動消失。

1.創(chuàng)建連一對veth虛擬網(wǎng)卡,類似pipe,發(fā)給veth-ns1的數(shù)據(jù)包veth-ns2那邊會收到,發(fā)給veth2的數(shù)據(jù)包veth0會收到。就相當(dāng)于給機器安裝了兩個網(wǎng)卡,并且之間用網(wǎng)線連接起來了,兩個虛擬網(wǎng)卡分別為veth-ns1、veth-ns2
[root@10 /]# ip link add veth-ns1 type veth peer name veth-ns2
2.查看link,可以看到連接已經(jīng)建立
[root@10 /]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
5: veth-ns2@veth-ns1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 2a:96:f4:e3:00:d2 brd ff:ff:ff:ff:ff:ff
6: veth-ns1@veth-ns2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether da:89:0e:56:03:3f brd ff:ff:ff:ff:ff:ff
3.把兩個虛擬網(wǎng)卡分別加到兩個network name space ns1、ns2中
[root@10 /]# ip link set veth-ns1 netns ns1
[root@10 /]# ip link set veth-ns2 netns ns2
4.分別查看宿主機器和兩個network namesapce的情況
ip link ip netns exec ns1 ip link ip netns exec ns2 ip link
ns1上的虛擬網(wǎng)卡信息
6: veth-ns1@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether da:89:0e:56:03:3f brd ff:ff:ff:ff:ff:ff link-netnsid 1
ns2上的虛擬網(wǎng)卡信息
5: veth-ns2@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 2a:96:f4:e3:00:d2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
通過上面指令執(zhí)行結(jié)果可以看到原來宿主機的一對虛擬網(wǎng)卡已經(jīng)移到兩個network namespace那,當(dāng)前的網(wǎng)卡狀態(tài)還是DOWN,兩個網(wǎng)卡的序列號是按順序成對的@if5、@if6
5.分別啟動這兩個虛擬網(wǎng)卡
[root@10 /]# ip netns exec ns1 ip link set veth-ns1 up
[root@10 /]# ip netns exec ns2 ip link set veth-ns2 up
執(zhí)行結(jié)果分別如下:
6: veth-ns1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether da:89:0e:56:03:3f brd ff:ff:ff:ff:ff:ff link-netnsid 1
5: veth-ns2@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 2a:96:f4:e3:00:d2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
可以看到此時兩個虛擬網(wǎng)卡狀態(tài)為UP,都已經(jīng)啟動,但還沒有IP地址,因此還不能通信
6.給虛擬網(wǎng)卡配置IP地址
[root@10 /]# ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
[root@10 /]# ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
7.通過ip a 查看ip地址是否配置成功
root@10 /]# ip netns exec ns1 ip a
root@10 /]# ip netns exec ns2 ip a
8.測試ns1和ns2是否可以互相連通
[root@10 /]# ip netns exec ns1 ping 192.168.0.12
PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=0.048 ms
[root@10 /]# ip netns exec ns2 ping 192.168.0.11
PING 192.168.0.11 (192.168.0.11) 56(84) bytes of data.
64 bytes from 192.168.0.11: icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from 192.168.0.11: icmp_seq=2 ttl=64 time=0.039 ms
64 bytes from 192.168.0.11: icmp_seq=3 ttl=64 time=0.041 ms
這時候,兩個network namespace已經(jīng)成功連通了

通過Bridege建立多個namesapce通信
以上的veth pair 只能解決兩個namesapce之間的通信問題,但是多個namesapce是不能直接互相通信,因為處于不同的網(wǎng)絡(luò),在日常生活中,我們會用到交換機去連接不同的網(wǎng)絡(luò),而在Linux,我們可以通過bridege去實現(xiàn)。

在上圖可以看到,這時候連個namespace ns3、ns4并不是直接通過veth pair 連接,而是通過bridge間接連接,接下來我會一步步教大家怎么按照上圖設(shè)置
1.創(chuàng)建Network Space
為了避免跟上面混淆,我們重新創(chuàng)建新的namespace
[root@10 /]# ip netns add ns3
[root@10 /]# ip netns add ns4
[root@10 /]# ip netns add bridge
2.創(chuàng)建一對veth pair 網(wǎng)卡
[root@10 /]# ip link add type veth
3.查看宿主機上生成的一對虛擬網(wǎng)卡
[root@10 /]# ip link
...
7: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 36:8e:bc:43:f0:4a brd ff:ff:ff:ff:ff:ff
8: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 92:c0:44:18:64:93 brd ff:ff:ff:ff:ff:ff
可以看到,宿主機已經(jīng)存在一對網(wǎng)卡veth1、veth0
4.讓veth0加入到ns3中,讓veth1加入到bridge中,并分別把虛擬網(wǎng)卡重命名為ns3-bridge、bridge-ns3
[root@10 /]# ip link set dev veth0 name ns3-bridge netns ns3
[root@10 /]# ip link set dev veth1 name bridge-ns3 netns bridge
5.在創(chuàng)建一對veth pair ,讓veth0加入到ns4中,讓veth1加入到bridge中,并分別把虛擬網(wǎng)卡重命名為ns4-bridge、bridge-ns4
[root@10 /]# ip link add type veth
[root@10 /]# ip link set dev veth0 name ns4-bridge netns ns4
[root@10 /]# ip link set dev veth1 name bridge-ns4 netns bridge
6.分別進入各個namespace查看網(wǎng)卡信息
[root@10 /]# ip netns exec ns4 ip a
...
9: ns4-bridge@if10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ea:53:ea:e6:2e:2e brd ff:ff:ff:ff:ff:ff link-netnsid 1
[root@10 /]# ip netns exec ns3 ip a
...
7: ns3-bridge@if8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 36:8e:bc:43:f0:4a brd ff:ff:ff:ff:ff:ff link-netnsid 1
[root@10 /]# ip netns exec bridge ip a
...
8: bridge-ns3@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 92:c0:44:18:64:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0
10: bridge-ns4@if9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 9e:f4:57:43:2e:2b brd ff:ff:ff:ff:ff:ff link-netnsid 1
可以看到ns3與bridge、ns4與bridge的網(wǎng)卡序號是連續(xù)的,證明是同一對veth pair
7.在bridge namespace中創(chuàng)建br設(shè)備(網(wǎng)橋)
在對bridge進行操作,需要用到bridge-utils ,可以通過以下命令安裝
yum install bridge-utils
接下來創(chuàng)建br設(shè)備
[root@10 /]# ip netns exec bridge brctl addbr br
8.啟動br設(shè)備
[root@10 /]# ip netns exec bridge ip link set dev br up
9.啟動bridge中的兩個虛擬網(wǎng)卡
[root@10 /]# ip netns exec bridge ip link set dev bridge-ns3 up
[root@10 /]# ip netns exec bridge ip link set dev bridge-ns4 up
10.把bridge中兩個虛擬網(wǎng)卡加入到br設(shè)備中
[root@10 /]# ip netns exec bridge brctl addif br bridge-ns3
[root@10 /]# ip netns exec bridge brctl addif br bridge-ns4
11.啟動ns3、ns4中的虛擬網(wǎng)卡,并加入ip
[root@10 /]# ip netns exec ns3 ip link set dev ns3-bridge up
[root@10 /]# ip netns exec ns3 ip address add 192.168.0.13/24 dev ns3-bridge
[root@10 /]# ip netns exec ns4 ip link set dev ns4-bridge up
[root@10 /]# ip netns exec ns4 ip address add 192.168.0.14/24 dev ns4-bridge
12.測試兩個namespace的連通性
[root@10 /]# ip netns exec ns3 ping 192.168.0.14
PING 192.168.0.14 (192.168.0.14) 56(84) bytes of data.
64 bytes from 192.168.0.14: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 192.168.0.14: icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 192.168.0.14: icmp_seq=3 ttl=64 time=0.042 ms
[root@10 /]# ip netns exec ns4 ping 192.168.0.13
PING 192.168.0.13 (192.168.0.13) 56(84) bytes of data.
64 bytes from 192.168.0.13: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 192.168.0.13: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.0.13: icmp_seq=3 ttl=64 time=0.081 ms
Docker容器的網(wǎng)絡(luò)

Docker常見的網(wǎng)絡(luò)模式有三種bridge、none和host
- bridge - Docker的默認網(wǎng)絡(luò)模式,有獨立的命名空間,能夠支持各種自定義網(wǎng)絡(luò), 以及實現(xiàn)網(wǎng)絡(luò)隔離,能夠滿足容器網(wǎng)絡(luò)隔離的要求
- host - 容器與主機在相同的網(wǎng)絡(luò)命名空間下面,使用相同的網(wǎng)絡(luò)協(xié)議棧,容器可以直接使用主機的所有網(wǎng)絡(luò)接口,最簡單和最低延遲的模式
- none - 使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網(wǎng)絡(luò)配置,即Docker容器沒有網(wǎng)卡、IP、路由等信息,讓開發(fā)者可以自由按需定制
Docker網(wǎng)絡(luò)相關(guān)指令
-
docker network ls - 查詢可用網(wǎng)絡(luò)
-
docker network create - 新建一個網(wǎng)絡(luò)
-
docker network rm - 移除一個網(wǎng)絡(luò)
-
docker network inspect - 查看一個網(wǎng)絡(luò)
-
docker network connect - 連接容器到一個網(wǎng)絡(luò)
-
docker network disconnect - 把容器從一個網(wǎng)絡(luò)斷開
bridge網(wǎng)絡(luò)模式實現(xiàn)
bridge是docker容器默認的網(wǎng)絡(luò)模式,它的實現(xiàn)原理跟我們網(wǎng)絡(luò)虛擬化的多namespace例子一樣,通過veth pair 和bridge進行間接連接,當(dāng) Docker 啟動時,會自動在主機上創(chuàng)建一個 docker0 虛擬網(wǎng)橋,實際上是 Linux 的一個 bridge,可以理解為一個軟件交換機。它會在掛載到它的網(wǎng)口之間進行轉(zhuǎn)發(fā),創(chuàng)建了在主機和所有容器之間一個虛擬共享網(wǎng)絡(luò)

接下來,我們以上圖tomcat容器為例,來展示下bridge模式的操作
1.啟動兩個tomcat容器(使用我們在第一章創(chuàng)建的tomcat鏡像)
[root@10 vagrant]# docker run -d --name tomcat01 -p 8081:8080 tomcat
[root@10 /]# docker run -d --name tomcat03 -p 8082:8080 tomcat
2.查看兩個tomcat容器的網(wǎng)絡(luò)接口信息
[root@10 /]# docker exec -it tomcat01 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@10 /]# docker exec -it tomcat03 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
可以看到tomcat01和tomcat03的ip分別為172.17.0.2/16 、172.17.0.3/16 ,并且有一對不連續(xù)的基于veth pair 創(chuàng)建的虛擬網(wǎng)卡eth0@if12 、eth0@if16 ,很明顯,根據(jù)我們上面學(xué)過的內(nèi)容,這兩個不是成對出現(xiàn)的虛擬網(wǎng)卡不能直接通信,應(yīng)該是通過bridge來進行連接
3.查看宿主機centos系統(tǒng)的網(wǎng)卡信息,驗證是否存在與tomcat容器對應(yīng)的虛擬網(wǎng)卡
[root@10 /]# ip a
...
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:12ff:fe9a:b1a7/64 scope link
valid_lft forever preferred_lft forever
12: veth068cc5c@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 66:1c:13:cd:b4:78 brd ff:ff:ff:ff:ff:ff link-netnsid 5
inet6 fe80::641c:13ff:fecd:b478/64 scope link
valid_lft forever preferred_lft forever
16: veth92816fa@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 0a:cf:a0:8e:78:7f brd ff:ff:ff:ff:ff:ff link-netnsid 6
inet6 fe80::8cf:a0ff:fe8e:787f/64 scope link
valid_lft forever preferred_lft forever
果然,我們可以看到宿主機上確實存在與兩個tomcat容器相對應(yīng)的虛擬網(wǎng)卡,并且還有一個虛擬網(wǎng)橋docker0的網(wǎng)絡(luò)接口,這種連接方法叫bridge模式
4.通過docker network inspect bridge 命令查看下bridge的配置
[root@10 /]# docker network inspect
...
"Containers": {
"2f3c3081b8bd409334f21da3441f3b457e243293f3180d54cfc12d5902ad4dbc": {
"Name": "tomcat03",
"EndpointID": "2375535cefdbccd3434d563ef567a1032694bdfb4356876bd9d8c4e07b1f222b",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"c13db4614a49c302121e467d8aa8ea4f008ab55f83461430d3dd46e59085937f": {
"Name": "tomcat01",
"EndpointID": "99a04efa9c7bdb0232f98d25f490682b065de1ce076b31487778fa257552a2ba",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
可以看到兩個container已經(jīng)綁定到bridge中
5.分別測試兩個tomcat容器相互連通
[root@10 /]# docker exec -it tomcat01 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.039 ms
[root@10 /]# docker exec -it tomcat03 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.039 ms
可以看到這兩個容器可以互相訪問
6.在容器訪問互聯(lián)網(wǎng)網(wǎng)站
docker容器是可以通過brige與host主機網(wǎng)絡(luò)連通,因此可以間接通過iptables實現(xiàn)NAT轉(zhuǎn)發(fā)進行互聯(lián)網(wǎng)訪問,能夠讓多個內(nèi)網(wǎng)用戶通過一個外網(wǎng)地址上網(wǎng),解決了IP資源匱乏的問題

接下來選擇其中剛才其中一個tomcat容器進行測試,如果發(fā)現(xiàn)不能訪問互聯(lián)網(wǎng),可能需要重啟下docker服務(wù)systemctl restart docker
[root@10 /]# docker exec -it tomcat01 curl -I https://www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Thu, 06 Feb 2020 06:03:48 GMT
Etag: "575e1f72-115"
Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
從上面返回信息可以看到,容器成功訪問百度網(wǎng)站
host網(wǎng)絡(luò)模式實現(xiàn)
host模式是共享宿主機器網(wǎng)絡(luò),因此使用的是同一個network namespace

1.創(chuàng)建一個容器,命名為tomcat-host,網(wǎng)絡(luò)模式選擇host
[root@10 /]# docker run -d --name tomcat-host --network host tomcat
ee3c6d2a5f61caa371088f40bc0c5d11101d12845cdee24466322a323b11ee11
2.查看容器的網(wǎng)絡(luò)接口信息會發(fā)現(xiàn)跟宿主centos的一樣
[root@10 /]# docker exec -it tomcat-host ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 50028sec preferred_lft 50028sec
inet6 fe80::5054:ff:fe8a:fee6/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.12/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1
valid_lft 156886sec preferred_lft 156886sec
inet6 fe80::a00:27ff:feba:a28/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:12ff:fe9a:b1a7/64 scope link
valid_lft forever preferred_lft forever
3.查看容器的網(wǎng)絡(luò)信息,會發(fā)現(xiàn)容器沒有被單獨分配ip地址
"Containers": {
"ee3c6d2a5f61caa371088f40bc0c5d11101d12845cdee24466322a323b11ee11": {
"Name": "tomcat-host",
"EndpointID": "53565ff879878bfd10fc5843582577d54eb68b14b29f4b1ff2e213d38e2af7ce",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
}
none網(wǎng)絡(luò)模式實現(xiàn)
上面提到,none網(wǎng)絡(luò)模式是有一個獨立的namesapce,默認情況下沒有任何初始化網(wǎng)絡(luò)配置,與外界網(wǎng)絡(luò)隔離,需要自己去定制

1.創(chuàng)建容器tomcat-none,并設(shè)置網(wǎng)絡(luò)為none
[root@10 /]# docker run -d --name tomcat-none --network none tomcat
d90808e0b7455c2f375c3d88fa18a1872b4a03e2112bff3db0b3996d16523b1a
2.查看網(wǎng)絡(luò)接口信息
[root@10 /]# docker exec -it tomcat-none ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
這里只有l(wèi)o設(shè)備,沒有其他網(wǎng)卡,只有本地回環(huán)ip地址
3.查看docker網(wǎng)絡(luò)信息
"Containers": {
"d90808e0b7455c2f375c3d88fa18a1872b4a03e2112bff3db0b3996d16523b1a": {
"Name": "tomcat-none",
"EndpointID": "4ea757bbd108ac783bd1257d33499b7b77cd7ea529d4e6c761923eb596dc446c",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
}
容器沒有被分配任何地址
自定義網(wǎng)絡(luò)模式custom實現(xiàn)
我們可以創(chuàng)建自己的網(wǎng)絡(luò)模式,這里默認是bridge模式,接下來我們演示如何讓不同網(wǎng)絡(luò)的容器連通起來

1.創(chuàng)建一個新網(wǎng)絡(luò),名字為custom,默認模式是bridge
[root@10 /]# docker network create custom
af392e4739d810b2e12219c21f505135537e95ea0afcb5075b3b1a5622a66112
2.查看下當(dāng)前docker網(wǎng)絡(luò)列表
[root@10 /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ce20377e3f10 bridge bridge local
af392e4739d8 custom bridge local
afc6ca3cf515 host host local
94cfa528d194 none null local
3.查看下自定義網(wǎng)絡(luò)的一些信息
94cfa528d194 none null local
[root@10 /]# docker network inspect custom
[
{
"Name": "custom",
"Id": "af392e4739d810b2e12219c21f505135537e95ea0afcb5075b3b1a5622a66112",
"Created": "2020-02-05T23:49:08.321895241Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
4.創(chuàng)建一個容器tomcat-custom,容器網(wǎng)絡(luò)模式為custom
[root@10 /]# docker run -d --name tomcat-custom --network custom tomcat
2e77115f42e36827646fd6e3abacc0594ff71cd1847f6fbffda28e22fb55e9ea
5.查看tomcat-custom的網(wǎng)絡(luò)接口信息
[root@10 /]# docker exec -it tomcat-custom ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
6.測試tomcat-custom去連接上面我們創(chuàng)建的tomcat01容器
[root@10 /]# docker exec -it tomcat-custom ping 192.17.0.2
PING 192.17.0.2 (192.17.0.2) 56(84) bytes of data.
--- 192.17.0.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3001ms
從上面執(zhí)行結(jié)果可以看出,默認情況下,tomcat-custom跟tomcat01是不能連通,因為處于不同的網(wǎng)絡(luò)custom、bridge。
7.把tomcat01加到自定義網(wǎng)絡(luò)custom
[root@10 /]# docker network connect custom tomcat01
8.查看當(dāng)前custom網(wǎng)絡(luò)信息
"Containers": {
"2e77115f42e36827646fd6e3abacc0594ff71cd1847f6fbffda28e22fb55e9ea": {
"Name": "tomcat-custom",
"EndpointID": "bf2b94f3b580b9df0ca9f6ce2383198961711d1b3d19d33bbcf578d81157e47f",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"c13db4614a49c302121e467d8aa8ea4f008ab55f83461430d3dd46e59085937f": {
"Name": "tomcat01",
"EndpointID": "f97305672ae617f207dfef1b3dc250d2b8d6a9ec9b36b1b0115e2456f18c44c6",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
}
可以看到兩個容器都已經(jīng)配置到custom網(wǎng)絡(luò)中,tomcat-custom 172.18.0.2/16 ,tomcat01 172.18.0.3/16
9.配置完網(wǎng)絡(luò)后,在用tomcat01嘗試連接tomcat-custom
[root@10 /]# docker exec -it tomcat01 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.055 ms
從執(zhí)行結(jié)果可以看到,現(xiàn)在tomcat01已經(jīng)可以跟tomcat-custom通信了,因為處于同一個網(wǎng)絡(luò)中
10.此時查看centos中的網(wǎng)絡(luò)接口信息,可以看到存在對應(yīng)的虛擬網(wǎng)卡
[root@10 /]# ip a
...
23: vethc30bd52@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-af392e4739d8 state UP group default
link/ether 2e:a1:c8:a2:e5:83 brd ff:ff:ff:ff:ff:ff link-netnsid 5
inet6 fe80::2ca1:c8ff:fea2:e583/64 scope link
valid_lft forever preferred_lft forever
25: veth69ea87b@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 92:eb:8f:65:fe:7a brd ff:ff:ff:ff:ff:ff link-netnsid 6
inet6 fe80::90eb:8fff:fe65:fe7a/64 scope link
valid_lft forever preferred_lft forever
27: veth068cc5c@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-af392e4739d8 state UP group default
link/ether ea:44:90:6c:0d:49 brd ff:ff:ff:ff:ff:ff link-netnsid 6
inet6 fe80::e844:90ff:fe6c:d49/64 scope link
valid_lft forever preferred_lft forever
自定義網(wǎng)絡(luò)中的嵌入式DNS
當(dāng)用戶創(chuàng)建了自定義網(wǎng)絡(luò),docker引擎默認會對加入該網(wǎng)絡(luò)的容器啟動嵌入式DNS,因此同一網(wǎng)絡(luò)的容器可以互相通過容器名稱進行通信,避免因下游系統(tǒng)有ip需要重新發(fā)布
對于非自定義網(wǎng)絡(luò),具體配置,可以查閱官網(wǎng)配置容器DNS

1.通過上面我們創(chuàng)建號的自定義網(wǎng)絡(luò)和容器進行測試
[root@10 /]# docker exec -it tomcat01 ping tomcat-custom
PING tomcat-custom (172.18.0.2) 56(84) bytes of data.
64 bytes from tomcat-custom.custom (172.18.0.2): icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from tomcat-custom.custom (172.18.0.2): icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from tomcat-custom.custom (172.18.0.2): icmp_seq=3 ttl=64 time=0.040 ms
[root@10 /]# docker exec -it tomcat-custom ping tomcat01
PING tomcat01 (172.18.0.3) 56(84) bytes of data.
64 bytes from tomcat01.custom (172.18.0.3): icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from tomcat01.custom (172.18.0.3): icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from tomcat01.custom (172.18.0.3): icmp_seq=3 ttl=64 time=0.040 ms
可以看到tomcat01和tomcat-custom可以互相通過容器名進行通信
Docker端口映射
端口映射對于我們來說不陌生,平時訪問服務(wù),例如tomcat,都是通過ip+服務(wù)端口進行訪問,如:localhost:8080,但是容器是寄生在宿主機器上,因此,如果我們想被外部訪問,還需要映射到宿主的端口上,通過宿主的ip+port進行訪問,如下如圖所示:

接下來我們來實踐下docker端口映射相關(guān)操作
1.創(chuàng)建一個tomcat-port容器,指定宿主端口映射8999
[root@10 /]# docker run -d --name tomcat-port -p 8999:8080 tomcat
0b5b014ae2552b85aff55b385ba20518b38509b5670a95ad9eea09475ea26629
2.進入容器,在容器中訪問
[root@10 /]# docker exec -it tomcat-port curl -i localhost:8080
HTTP/1.1 404
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 713
Date: Thu, 06 Feb 2020 07:43:59 GMT
從上面結(jié)果可以看到,實際上已經(jīng)訪問成功,但是由于我沒有配置tomcat管理頁面,所以這里是報404
3.在centos訪問容器
這時候我們就需要通過容器ip+port的方式進行訪問
[root@10 /]# curl -I 172.17.0.4:8080
HTTP/1.1 404
Content-Type: text/html;charset=utf-8
Content-Language: en
Transfer-Encoding: chunked
Date: Thu, 06 Feb 2020 07:49:41 GMT
可以看到,這里也訪問成功
4.在主體機器訪問,也就是我的主機MacOS操作系統(tǒng)上訪問
這時候需要用虛擬機上centos IP+映射端口 進行訪問
192:centos7 evan$ curl -I 192.168.100.12:8999
HTTP/1.1 404
Content-Type: text/html;charset=utf-8
Content-Language: en
Transfer-Encoding: chunked
Date: Thu, 06 Feb 2020 07:52:52 GMT
可以看到,這里也能正常訪問
總結(jié)
上文講解了Docker的單機網(wǎng)絡(luò)通信原理以及Linux虛擬化技術(shù),最后我們回顧下一開始的那幾個問題,相信大家心中都已經(jīng)有答案了
1.同一個主機兩個容器如何通信?
Docker基于Virtual Ethernet Pair 技術(shù)實現(xiàn)了容器之間的通信,但并非直接端對端對接,在默認網(wǎng)絡(luò)bridge模式下,Docker引擎會分別在每個容器和宿主網(wǎng)絡(luò)建立一對虛擬網(wǎng)卡veth pair ,通過bridge間接實現(xiàn)通信,通過network namespace實現(xiàn)網(wǎng)絡(luò)隔離。
2.怎么從服務(wù)器外訪問容器?
從服務(wù)器外訪問容器是通過端口映射方式,訪問的IP地址和端口并非容器的真實IP和端口,而是宿主機器的端口映射,所以要從服務(wù)器外部訪問容器,需要通過宿主機器的IP/域名+宿主端口進行訪問。
3.Docker的三種網(wǎng)絡(luò)模式是什么?
Docker常見的網(wǎng)絡(luò)模式有三種bridge、none和host
bridge - Docker的默認網(wǎng)絡(luò)模式,有獨立的命名空間,能夠支持各種自定義網(wǎng)絡(luò), 以及實現(xiàn)網(wǎng)絡(luò)隔離,能夠滿足容器網(wǎng)絡(luò)隔離的要求
host - 容器與主機在相同的網(wǎng)絡(luò)命名空間下面,使用相同的網(wǎng)絡(luò)協(xié)議棧,容器可以直接使用主機的所有網(wǎng)絡(luò)接口,最簡單和最低延遲的模式
none - 使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網(wǎng)絡(luò)配置,即Docker容器沒有網(wǎng)卡、IP、路由等信息,讓開發(fā)者可以自由按需定制
參考資料
linux 網(wǎng)絡(luò)虛擬化: network namespace 簡介
網(wǎng)絡(luò)虛擬化技術(shù)(一): Linux網(wǎng)絡(luò)虛擬化
有興趣的朋友,歡迎加我公眾號一起交流,有問題可以留言,平時工作比較忙,我也抽時間盡量回復(fù)每位朋友的留言,謝謝!
|