一、docker的默認網路
默認網路docker0的原理
我們在查看宿主機的IP地址,如下圖:

docker0的網路是:172.17.0.1/16,每當啟動一個容器,就會生產兩個

這個就是evth-pair技術,通過ovc的連接可以相互通信,

下圖更詳細:

此時docker0,就相當于一個路由器,這就是docker的默認網路,
- 所有的docker容器,在不指定網路的情況下都屬于docker0;
- docker0會給我們每一個容器分配1個可用的IP;
- docker0的作用是直接讓容器和宿主機通信,間接性讓容器間通信(必須使用–link鏈接,但是一般不這么干),

疑問:容器之間是否能ping通對方?
分別啟動兩個tomcat容器,使用如下命令,讓tomcat01 ping tomcat02

docker exec -it tomcat01 ping tomcat02
結果如圖:

docker0的缺點
- 容器之間不能直接互通;
- 要想互通必須使用–link;
- 而且link是單項的,必須兩端都配置
二、容器間的連通(link的用法)
解決問題:
我們再啟動一個tomcat03,使用link命令鏈接 tomcat02
docker run -d -P --name tomcat03 --link tomcat02 tomcat
通過命令–link就可以解決這個問題,如下圖現在tomcat03可以ping通tomcat02

但是其實這個命令挺坑的,如上圖,如果反向,能否ping通?

[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ffb8c87e33c6 bridge bridge local
76dde8bbf8a5 host host local
42401e5761c9 none null local
原因是什么呢?
當我們讓tomcat03 --link tomcat02的時候,容器內部發生了什么變化呢?其實很簡單,在tomcat03內部的hosts檔案中多了一條本地映射,如下圖:
而tomcat02因為沒有link tomcat03 所以hosts檔案中沒有這一條,因此反向是無法ping通的,
==這也就是link的原理,其實就是在容器hosts檔案中寫了一條映射,這樣的話由于局限性很大,所以我們一般也不是很常用,==我們一般在生產中,是這樣做的,就是自定義docker網路,
三、自定義daocker網路
自定義daocker網路的目的就是方便容器之間互聯,
[root@localhost ~]# docker network ls #查詢docker的所有網路
NETWORK ID NAME DRIVER SCOPE
ffb8c87e33c6 bridge bridge local
76dde8bbf8a5 host host local
42401e5761c9 none null local
docker網路的型別
- bridge:橋接模式(默認,自己創建的也是用這種模式)
- host:和宿主機共享網路
- none:不配置網路
- container:容器內網路連通(這里是看不到的,用的比較少,了解即可)
我們之前在啟動tomcat的時候,所使用的命令是:docker run -d -P --name tomcat tomcat ,其實他是個閹割版,他省略了網路的引數,如果敲全的話應該是下面這個:
docker run -d -P --name tomcat --net bridge tomcat
多了個--net bridge,其實這個就是docker0網路,你不加默認就是docker0網路,所以大部分時候我們是不加的,在我們自定義網路之后,每次啟動就要加上了,
創建docker網路
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
注釋及演示程序
docker network create \
--driver bridge \ #橋接模式
--subnet 192.168.0.0/16 \ #網段
--gateway 192.168.0.1 \ #網關
mynet #網路的名字
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 myne
t
5c86080c7b61dfd92006e3cc506351c825052bd4ca214ffb3965ca08f23a16af
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ffb8c87e33c6 bridge bridge local
76dde8bbf8a5 host host local
5c86080c7b61 mynet bridge local #這個就是我們新建的
42401e5761c9 none null local
[root@localhost ~]# docker network inspect mynet #查看網路的詳細資訊
[
{
"Name": "mynet",
"Id": "efe52fe3d7fe632c6e7047e5d1afdeafc7266518efa81a19ee16f014acdf0d68",
"Created": "2021-08-16T20:45:31.865520553+08:00",
"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": {}
}
]
###我們再自己創建的網路中啟動兩個tomcat
[root@localhost ~]# docker run -d -P --name tomcat-net-01 --network mynet tomcat
9eded0646076d8b8e150a48dbca89495bd93ae96aca77501667a5333b6672a71
[root@localhost ~]# docker run -d -P --name tomcat-net-02 --network mynet tomcat
bf75b548b9e898c5f99b8464112000667f86c5847ac224ffb32dfb639c637270
[root@localhost ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "efe52fe3d7fe632c6e7047e5d1afdeafc7266518efa81a19ee16f014acdf0d68",
"Created": "2021-08-16T20:45:31.865520553+08:00",
"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": {
"9eded0646076d8b8e150a48dbca89495bd93ae96aca77501667a5333b6672a71": {
"Name": "tomcat-net-01",
"EndpointID": "a5341a641690b019f6e6b3e5297cd1ab40d5c29d119e0cec0174245dcff4b7ca",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16", ##tomcat-net-01的IP
"IPv6Address": ""
},
"bf75b548b9e898c5f99b8464112000667f86c5847ac224ffb32dfb639c637270": {
"Name": "tomcat-net-02",
"EndpointID": "266bdee560e20c808ba6b85daa4fbcdee89e70d86090e05efaf3e72f1a9bb563",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16", ##tomcat-net-02的IP
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@localhost ~]# docker network rm mynet #洗掉網路
mynet
[root@localhost ~]#
四、自定義網路的好處
現在我們看看自定義網路的好處,
容器之間可以直接ping通
我并沒有使用–link,但是直接可以ping通

五、容器和網路打通
根據上面的實驗我們已經實作了同一網路容器間的互通技術,
那么問題由來了,如下圖這種不同的docker網路,容器間互通該如何打通網路呢?
例如:我想讓docker0網路中的tomcat-01能和mynet網路中的tomcat-net-01互通,該怎么辦?

像上圖中的直連是絕對不能通的,我們必須如下圖,讓tomcat01和mynet這個網路互通就OK了,是不是有點像pptp?

docker網路中的重點必會命令connect
- connect 命令他是docker網路的核心,
- 功能:鏈接一個網路到一個容器
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network #docker網路的核心命令,鏈接一個網路到一個容器
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@localhost ~]#
[root@localhost ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
[root@localhost ~]#
tomcat01的網路是默認網路docker0,現在讓他鏈接到mynet網路內
[root@localhost ~]# docker network connect mynet tomcat01
搞定,我們看看mynet網路資訊中發生了什么變化,
[root@localhost ~]# docker network inspect mynet #查詢mynet網路資訊

他居然在mynet中的網路,那還在docker0網路中嗎?任然在,因此他的拓撲變成了如下圖

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294812.html
標籤:其他
上一篇:Docker學習筆記
下一篇:【摸魚】堆疊
