一、默認(rèn)網(wǎng)絡(luò)
Docker默認(rèn)在安裝好的時(shí)候就會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò),我們可以使用docker network ls看到如下的三個(gè)網(wǎng)絡(luò)信息。
PS C:\Users\Think> docker network ls
NETWORK ID NAME DRIVER SCOPE
7b4d6fb49586 bridge bridge local
b1c115e96419 host host local
a8fa01727801 none null local
none,指沒(méi)有網(wǎng)絡(luò),如果容器啟動(dòng)的時(shí)候指定使用這個(gè)網(wǎng)絡(luò)
docker run -it --network=none imagename,那么就代表這是一個(gè)隔離的容器,不與外界進(jìn)行交互。host,指公用宿主機(jī)host的網(wǎng)絡(luò)資源,容器的網(wǎng)絡(luò)配置將和宿主機(jī)host一模一樣,優(yōu)點(diǎn)就是傳輸效率高,缺點(diǎn)就是容易和host造成端口沖突。
-
bridge,這是比較常用的網(wǎng)絡(luò),該網(wǎng)絡(luò)中默認(rèn)情況下host上會(huì)有一個(gè)docker0的虛擬網(wǎng)卡,如果在啟動(dòng)容器的時(shí)候不指定網(wǎng)絡(luò),那么默認(rèn)就會(huì)新建一個(gè)虛擬網(wǎng)卡橋接在docker0上,容器中自己也會(huì)新建一個(gè)虛擬網(wǎng)卡,這兩個(gè)虛擬網(wǎng)卡具有綁定關(guān)系,從而達(dá)到容器和宿主機(jī)的通信,以及和其它容器的通信,這種虛擬網(wǎng)卡的橋接技術(shù)被稱(chēng)為evth-pair技術(shù)。
我們可以通過(guò)命令
docker network inspect bridge查看這個(gè)網(wǎng)絡(luò)的一些配置信息。[ { "Name": "bridge", "Id": "7b4d6fb49586097cc1501f5a0c9515678503a633578b55b1664fd91080682b92", "Created": "2021-11-19T12:02:14.406518392Z", "Scope": "local", # 橋接模式 "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { # 子網(wǎng)范圍172.17.0.0~172.17.255.255 "Subnet": "172.17.0.0/16", # 網(wǎng)關(guān)地址,即docker0網(wǎng)卡的地址,它作為路由器轉(zhuǎn)發(fā)容器之間的通信 "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, # 已經(jīng)注冊(cè)橋接的容器列表 "Containers": { # 容器ID "e0fd741857a1bdc27b01de96c7009869b811a409b5a69ecac309c91a061d8b2c": { "Name": "tomcat1", "EndpointID": "0cff81bc0f30577547b0375a2ffb276d009d307fd00027c33ada88134dec9f69", "MacAddress": "02:42:ac:11:00:02", # 分配該容器的內(nèi)部地址 "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", # 主機(jī)的地址 "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", # 主機(jī)的網(wǎng)卡 "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]總的來(lái)說(shuō),正是默認(rèn)情況下我們使用了bridge橋接網(wǎng)絡(luò),使得host與容器之間的通信,以及容器與容器之間的通信都可以通過(guò)docker0作為路由器來(lái)進(jìn)行轉(zhuǎn)發(fā)。

在日常的生產(chǎn)環(huán)境中,docker0已經(jīng)很少被使用了,因?yàn)樗恢С质褂萌萜鞣?wù)名稱(chēng)進(jìn)行通信,推薦使用自定義網(wǎng)絡(luò)。
二、使用服務(wù)名
在上面網(wǎng)絡(luò)的講解中,我們知道了容器之間互相連通的原理,那么在host部署多個(gè)容器需要相互通信的時(shí)候,可以使用IP通信,但是問(wèn)題是,容器的IP地址并不是固定的,每次重啟后都有可能發(fā)生變更,使得維護(hù)成本變高,那么是否可以棄用IP,直接使用服務(wù)名進(jìn)行通信呢?就像注冊(cè)中心那樣?
默認(rèn)情況下,直接請(qǐng)求服務(wù)名肯定是不能通的,但是我們可以使用--link選項(xiàng)來(lái)為當(dāng)前容器打通需要聯(lián)系的其它容器。
PS C:\Users\Think> docker run -d -P --name tomcat01 tomcat
b610b3352558cd2db5a3155bcbff072fdf6b15e1a89be3c6266f931686f3125c
PS C:\Users\Think> docker run -d -P --link tomcat01 --name tomcat02 tomcat
ccb34a4cd1904f1075af874795b9c392e19ccdfca99c3d45ef0155967c785a04
此時(shí)tomcat02可以使用tomcat01的服務(wù)名進(jìn)行通信,但是反過(guò)來(lái)tomcat01不可以使用tomcat02的服務(wù)名進(jìn)行通信,除非tomcat01在啟動(dòng)的時(shí)候也使用--link進(jìn)行設(shè)置。
我們查看tomcat02的hosts文件:
PS C:\Users\Think> docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# 查看tomcat02的hosts文件,發(fā)現(xiàn)把tomcat01的ip地址和服務(wù)名稱(chēng)綁定了,從而達(dá)到訪(fǎng)問(wèn)服務(wù)名可以找到tomcat01的IP的目的
172.17.0.2 tomcat01 b610b3352558
172.17.0.3 ccb34a4cd190
我們?cè)俨榭磘omcat01的hosts文件,并沒(méi)有發(fā)現(xiàn)tomcat02的綁定信息:
PS C:\Users\Think> docker exec -it tomcat01 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 b610b3352558
在日常的生產(chǎn)環(huán)境中,--link也已經(jīng)不被推薦使用了,不夠靈活強(qiáng)大,推薦使用自定義網(wǎng)絡(luò)。
三、自定義網(wǎng)絡(luò)
我們可以通過(guò)命令docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet創(chuàng)建自定義網(wǎng)絡(luò)mynet。
-
--driver bridge指定使用網(wǎng)絡(luò)的類(lèi)型,可以選擇none,host,bridge任何一種; -
--subnet 192.168.0.0/16指定子網(wǎng)的范圍; -
--gateway 192.168.0.1指定網(wǎng)關(guān)的地址;
然后我們查看網(wǎng)絡(luò)docker network ls就可以看到剛剛創(chuàng)建的自定義網(wǎng)絡(luò)了。
PS C:\Users\Think> docker network ls
NETWORK ID NAME DRIVER SCOPE
7b4d6fb49586 bridge bridge local
b1c115e96419 host host local
# 如下就是剛才新創(chuàng)建的自定義網(wǎng)絡(luò)
ab48e4649b9a mynet bridge local
a8fa01727801 none null local
通過(guò)docker network inspect mynet查看自定義網(wǎng)絡(luò)的詳細(xì)信息:
[
{
"Name": "mynet",
"Id": "ab48e4649b9a12ef3cd6b8c8d89940600248024a2cb8d4e9dfec2d6890403b01",
"Created": "2021-11-19T14:52:33.152719594Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
此時(shí)還沒(méi)有容器使用該網(wǎng)絡(luò),所以Containers里面是空的,我們可以將新啟動(dòng)的容器指定在該自定義網(wǎng)絡(luò)內(nèi):
PS C:\Users\Think> docker run -d -P --net mynet --name tomcat03 tomcat
0fc443c83626813a76d0819db9ce90fb86150d42430e53bed482e01306bd7b29
PS C:\Users\Think> docker run -d -P --net mynet --name tomcat04 tomcat
d244676f904c29082b66a8d88d4633991bc4c7a2a2d3324cc753b32c7d436ca8
PS C:\Users\Think> docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ab48e4649b9a12ef3cd6b8c8d89940600248024a2cb8d4e9dfec2d6890403b01",
"Created": "2021-11-19T14:52:33.152719594Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0fc443c83626813a76d0819db9ce90fb86150d42430e53bed482e01306bd7b29": {
"Name": "tomcat03",
"EndpointID": "4c1fabf4694c727255d5f722e97315605c2feb361881a2101cac8f517ae1b134",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"d244676f904c29082b66a8d88d4633991bc4c7a2a2d3324cc753b32c7d436ca8": {
"Name": "tomcat04",
"EndpointID": "c542546ae74ca4d35ed86cb39551dd570f791b6cf407de6ddfdadf0759ee4aa0",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
這里mynet網(wǎng)絡(luò)里面的容器相互之間是可以聯(lián)通的,而且可以使用容器服務(wù)名進(jìn)行聯(lián)通,實(shí)現(xiàn)了--link的作用,但是和其它網(wǎng)絡(luò)的容器是不能聯(lián)通的,網(wǎng)段不同默認(rèn)都是不通的 。
如果存在場(chǎng)景需要聯(lián)通兩個(gè)不同網(wǎng)段中的容器,那么可以使用docker network connect networkName containerName,將某個(gè)容器加入到指定的網(wǎng)絡(luò)中。
PS C:\Users\Think> docker network connect mynet tomcat01
PS C:\Users\Think> docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ab48e4649b9a12ef3cd6b8c8d89940600248024a2cb8d4e9dfec2d6890403b01",
"Created": "2021-11-19T14:52:33.152719594Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0fc443c83626813a76d0819db9ce90fb86150d42430e53bed482e01306bd7b29": {
"Name": "tomcat03",
"EndpointID": "4c1fabf4694c727255d5f722e97315605c2feb361881a2101cac8f517ae1b134",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"b610b3352558cd2db5a3155bcbff072fdf6b15e1a89be3c6266f931686f3125c": {
"Name": "tomcat01",
"EndpointID": "879bcfac611e21911284a926d133af7c2bbb483882e4c5bf606a5039aa894a66",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"d244676f904c29082b66a8d88d4633991bc4c7a2a2d3324cc753b32c7d436ca8": {
"Name": "tomcat04",
"EndpointID": "c542546ae74ca4d35ed86cb39551dd570f791b6cf407de6ddfdadf0759ee4aa0",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
我們會(huì)發(fā)現(xiàn)原來(lái)在別的網(wǎng)段下的tomcat01容器也被加入到mynet自定義網(wǎng)絡(luò)中來(lái)了。此時(shí)tomcat01容器就會(huì)同時(shí)擁有兩個(gè)IP地址。