網(wǎng)站首頁 編程語言 正文
本篇接著上篇:【Docker0網(wǎng)絡及原理探究】,繼續(xù)深入探究容器網(wǎng)絡通信原理,通過學習Docker網(wǎng)路驅(qū)動模型,更好地解決容器間的通信問題????
1、Docker的網(wǎng)絡驅(qū)動模型
1.1、Docker的網(wǎng)絡驅(qū)動模型分類:
- bridge:Docker中默認的網(wǎng)絡驅(qū)動模型,在啟動容器時如果不指定則默認為此驅(qū)動類型;
- host:打破Docker容器與宿主機之間的網(wǎng)絡隔離,直接使用宿主機的網(wǎng)絡環(huán)境,該模型僅適用于Docker17.6及以上版本;
- overlay:可以連接多個docker守護進程或者滿足集群服務之間的通信;適用于不同宿主機上的docker容器之間的通信;
- macvlan:可以為docker容器分配MAC地址,使其像真實的物理機一樣運行;
- none:即禁用了網(wǎng)絡驅(qū)動,需要自己手動自定義網(wǎng)絡驅(qū)動配置;
- plugins:使用第三方網(wǎng)絡驅(qū)動插件;
1.2、Docker網(wǎng)絡模式
查看docker網(wǎng)絡?docker network ls
[root@--- ~]# docker network ls NETWORK ID NAME DRIVER SCOPE feafa30d4051 bridge bridge local e8bf4fced9e2 host host local 6263db0933b9 none null local [root@--- ~]#
Docker內(nèi)置這三個網(wǎng)絡,運行容器時,你可以使用該--network
標志來指定容器應連接到哪些網(wǎng)絡。
該bridge
網(wǎng)絡代表docker0
所有Docker安裝中存在的網(wǎng)絡。除非你使用docker run --network=<NETWORK>
選項指定,否則Docker守護程序默認將容器連接到此網(wǎng)絡。
我們在使用docker run
創(chuàng)建Docker容器時,可以用?--net
?選項指定容器的網(wǎng)絡模式,Docker可以有以下4種網(wǎng)絡模式:
-
host模式
:使用?--net=host
?指定。 -
none模式
:使用?--net=none
?指定。 -
bridge模式
:使用?--net=bridge
?指定,默認設置。 -
container模式
:使用?--net=container:NAME_or_ID
?指定。
docker run -it -P --name tomcat01 --net=bridge tomcat # 默認設置 docker run -it -P --name tomcat02 --net=none tomcat # ...
2、容器通信問題
- 由于不同容器通過
veth pair
連接在虛擬網(wǎng)橋docker0
上,所以容器之間可以通過IP
互相通信,但是無法通過容器名進行通信。docker0不支持容器名連接訪問 - 默認網(wǎng)橋
bridge
上的容器只能通過IP互連,無法通過DNS
解析名稱或別名。假如我們在container1中部署了Web服務,在container2中部署了mysql,container1中的Web服務往往需要連接container2的mysql,這是只能靠IP進行連接,但是docker也無法保證容器重啟后的IP地址不變,所以更好的方式是通過別名進行互聯(lián),在網(wǎng)絡中加入DNS服務器,將容器名與IP地址進行匹配,省去了手動修改Web服務中連接mysql的IP的過程。
為了實現(xiàn)不同容器通過容器名或別名的互連,docker提供了以下幾種:??
- 在啟動docker容器時加入
--link
參數(shù),但是目前已經(jīng)被廢棄,廢棄的主要原因是需要在連接的兩個容器上都創(chuàng)建--link選項,當互連的容器數(shù)量較多時,操作的復雜度會顯著增加; - 啟動docker容器后進入容器并修改?
/etc/hosts
?配置文件(本地DNS解析),缺點是手動配置較為繁雜; - 用戶自定義bridge網(wǎng)橋,這是目前解決此類問題的主要方法,提供更好的隔離效果和更好的互通性(更好的隔離效果是針對外界網(wǎng)絡,而更好的互通性則是指同一
bridge
下的不同容器之間),用戶自定義bridge在容器之間提供了自動DNS解析。
容器在默認情況下以隔離方式運行,它們完全不知道同一計算機上有其他進程或容器。 那么,如何使容器能夠彼此通信? 答案就是網(wǎng)絡連接。 如果兩個容器在同一網(wǎng)絡上,那么它們可彼此通信。 如果沒在同一網(wǎng)絡上,則沒法通信。
3、容器之間通信的主要方式總結(jié)
3.1、通過容器ip訪問
容器重啟后,ip會發(fā)生變化。通過容器ip訪問不是一個好的方案。
3.2、通過宿主機的ip:port訪問
通過宿主機的ip:port
訪問,只能依靠監(jiān)聽在暴露出的端口的進程來進行有限的通信。
3.3、通過--link
建立連接(官方不推薦使用)
原理分析:
- 運行容器時,指定參數(shù)link,使得源容器與被鏈接的容器可以進行相互通信,并且接受的容器可以獲得源容器的一些數(shù)據(jù),比如:環(huán)境變量。
- 與
/etc/hosts
中的主機條目不同,如果重新啟動源容器,則不會自動更新存儲在環(huán)境變量中的IP地址。我們建議使用主機條目?/etc/hosts
來解析鏈接容器的IP地址。 - 除了環(huán)境變量之外,Docker還將源容器的主機條目添加到
/etc/hosts
文件中。(本質(zhì)上就是通過?--link
?參數(shù),自動的給容器添加?hosts
?配置)
--link
建立連接步驟:?
啟動tomcat01,tomcat02
docker run -it -P --name tomcat01 tomcat docker run -it -P --name tomcat02 tomcat
--link
?通過配置?/etc/hosts
?實現(xiàn)連接通過
link
建立連接的容器,被鏈接的容器能 ping 通源容器,反過來不行。被鏈接容器會繼承源容器的環(huán)境變量信息
建立link
連接
tomcat02
?容器 link 到?tomcat03
?上
docker run -it -P --name tomcat03 --link tomcat02 tomcat
查看tomcat03 hosts配置
[root@--- ~]# docker exec -it tomcat03 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.3 tomcat02 099602f3ff7f #?--link命令配置生成的條目? 172.17.0.4 a20a10b7e728 [root@--- ~]#
3.4、??通過 User-defined networks(推薦)
用戶自定義網(wǎng)橋步驟:?
創(chuàng)建用戶自定義bridge網(wǎng)橋
[root@--- ~]# docker network create test-network 799426d70aa28b73b4a777c85b338186eafadd1558b13c43e07a9fd9a8b545e7 [root@iZm5e23n3ueobwkjtfartxZ ~]# docker network ls NETWORK ID NAME DRIVER SCOPE feafa30d4051 bridge bridge local e8bf4fced9e2 host host local 6263db0933b9 none null local 799426d70aa2 test-network bridge local #?創(chuàng)建的橋接網(wǎng)絡?
刪除網(wǎng)橋:?
docker network rm test-network
把之前啟動的 mysql01,centos01,centos02 容器加入到自定義bridge網(wǎng)橋中:?connect
docker network connect test-network mysql01 docker network connect test-network centos01 docker network connect test-network centos02
查看自定義bridge網(wǎng)橋信息
docker network inspect 799426d70aa2 [ { "Name": "test-network", "Id": "799426d70aa28b73b4a777c85b338186eafadd1558b13c43e07a9fd9a8b545e7", "Created": "2021-10-03T20:30:03.325679562+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", #?test-network的子網(wǎng)? "Gateway": "172.18.0.1" #?test-network的網(wǎng)關(guān)? } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "29298987c51b777b546bf6626560020ce235e390e1d7fcfe188c6db228ca4edf": { "Name": "mysql01", "EndpointID": "a69560a1872a25af042c74132df5dcade6e0e93faf9102185c1de19f6c8b3b36", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", #?mysql01 容器的IP,與之前不同? "IPv6Address": "" }, "cb1922b95b9316d129b54f3545fad9729092926e10a1d5517f8928db42706151": { "Name": "centos01", "EndpointID": "f0cf5feb77ec23526fe5cee217dba9271125b9b4106c81bc7d58253ac48a4caf", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", #?centos01 容器的IP,與之前不同? "IPv6Address": "" }, "cc6f510b9765ba018dbafd416c9774ddf5fd3ff55fa992827f55516e8dc70b6a": { "Name": "centos02", "EndpointID": "6c88540d719014e441d3119c4388e62d311b07acf009106e16aa66d7ebaf5763", "MacAddress": "02:42:ac:12:00:04", "IPv4Address": "172.18.0.4/16", #?centos02 容器的IP,與之前不同? "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
通過容器名或別名互連通信
進入centos01容器,ping centos02
,?ping mysql01
可以發(fā)現(xiàn)centos01可以和centos02、mysql01容器之間可以通信
docker exec -it cb1922b95b93 /bin/bash?? [root@cb1922b95b93 /]# ping centos02?? PING centos02 (172.18.0.4) 56(84) bytes of data. 64 bytes from centos02.test-network (172.18.0.4): icmp_seq=1 ttl=64 time=0.118 ms 64 bytes from centos02.test-network (172.18.0.4): icmp_seq=2 ttl=64 time=0.113 ms ... ping mysql01?? PING mysql01 (172.18.0.2) 56(84) bytes of data. 64 bytes from mysql01.test-network (172.18.0.2): icmp_seq=1 ttl=64 time=0.107 ms 64 bytes from mysql01.test-network (172.18.0.2): icmp_seq=2 ttl=64 time=0.103 ms ...
斷開網(wǎng)絡
由于我們的容器仍然連接著默認bridge網(wǎng)橋docker0,而現(xiàn)在我們已經(jīng)不需要它,所以應該將容器與docker0的連接斷開,執(zhí)行以下操作disconnect
:
docker network disconnect bridge mysql01 docker network disconnect bridge centos01 docker network disconnect bridge centos02
查看默認bridge網(wǎng)橋docker0的容器網(wǎng)絡配置
docker network inspect feafa30d4051?? [ { "Name": "bridge", "Id": "feafa30d4051f24353508959bd420fd163ad0c98d6b30ec8ff13b59a59552bb1", "Created": "2021-09-26T15:10:27.167774553+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, #?之前的容器服務,已經(jīng)從默認網(wǎng)橋中移除? "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
最后
了解了Docker網(wǎng)絡、容器通信之后,對繼續(xù)學習服務網(wǎng)格(Service Mesh
)與Kubernetes
的服務發(fā)現(xiàn)有很大幫助。很多的項目架構(gòu)也都是從網(wǎng)絡通信角度進行的層級、模塊劃分(比如:網(wǎng)路拓撲圖、終極系統(tǒng)架構(gòu)異地多活)。關(guān)于網(wǎng)絡,學完之后你會發(fā)現(xiàn)很多東西都串一塊了,超級有意思??
原文鏈接:https://www.cnblogs.com/all-smile/p/16637012.html
相關(guān)推薦
- 2022-06-25 分享Pytest?fixture參數(shù)傳遞的幾種方式_python
- 2022-11-18 React網(wǎng)絡請求發(fā)起方法詳細介紹_React
- 2022-12-23 C++?Boost?Conversion超詳細講解_C 語言
- 2022-06-01 C語言?超詳細介紹與實現(xiàn)線性表中的帶頭雙向循環(huán)鏈表_C 語言
- 2022-04-09 一起來學習一下python的數(shù)據(jù)類型_python
- 2022-04-16 十分鐘學會C++?Traits_C 語言
- 2022-09-15 Python淺析迭代器Iterator的使用_python
- 2022-03-12 .NET?MemoryCache如何清除全部緩存_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支