Docker網(wǎng)絡(luò)及容器通信原理詳解
個(gè)人觀點(diǎn):Docker網(wǎng)絡(luò)通信在容器編排、集群部署中具有舉足輕重的地位,(玩docker不懂docker0那就......玩不透哇??)本篇分析Docker網(wǎng)絡(luò),并通過啟動(dòng)幾個(gè)容器來探究Docker網(wǎng)絡(luò)及容器通信,幫助讀者理解一下??。
1、Docker0
Docker 服務(wù)默認(rèn)會(huì)創(chuàng)建一個(gè) docker0 網(wǎng)橋(其上有一個(gè) docker0 內(nèi)部接口),它在內(nèi)核層連通了其他的物理或虛擬網(wǎng)卡,這就將所有容器和本地主機(jī)都放到同一個(gè)物理網(wǎng)絡(luò)。
Docker 默認(rèn)指定了 docker0 接口 的 IP 地址和子網(wǎng)掩碼,讓主機(jī)和容器之間可以通過網(wǎng)橋相互通信,它還給出了 MTU(接口允許接收的最大傳輸單元),通常是 1500 Bytes,或宿主主機(jī)網(wǎng)絡(luò)路由上支持的默認(rèn)值。這些值都可以在服務(wù)啟動(dòng)的時(shí)候進(jìn)行配置。
2、清空所有鏡像
如果是初學(xué)者,還不是很了解docker0的情況下,建議清空所有鏡像,創(chuàng)造一個(gè)比較干凈的容器網(wǎng)絡(luò)環(huán)境,更加清晰,有助于學(xué)習(xí)docker0??
# 1. 查看運(yùn)行的容器 docker ps # 2. 停掉所有正在運(yùn)行的容器(否則刪除不掉) docker stop [containerID] # docker stop $(docker container ls -q) # 3. 執(zhí)行刪除 docker rmi -f $(docker images -aq) # 4. 查看鏡像 docker images
3、查看網(wǎng)卡信息
先了解一下ip addr
命令
ip addr lo # 本機(jī)回環(huán)地址 127.0.0.1 eth0 # 阿里云內(nèi)網(wǎng)地址 172.31.81.32 docker0 # docker生成的網(wǎng)卡 172.17.0.1
獲取當(dāng)前網(wǎng)卡ip地址和mac地址
[root@--- ~]# ip addr 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:0a:00:34 brd ff:ff:ff:ff:ff:ff inet 172.31.81.32/20 brd 172.31.95.255 scope global dynamic eth0 valid_lft 291944112sec preferred_lft 291944112sec 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:a4:2f:c5:62 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 [root@--- ~]#
下面通過docker啟動(dòng)幾個(gè)容器來探究一下Docker網(wǎng)絡(luò)??
4、運(yùn)行容器之后,再次查看網(wǎng)卡信息
安裝Docker時(shí),它會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò),默認(rèn)bridge
網(wǎng)橋(創(chuàng)建容器默認(rèn)連接到此網(wǎng)絡(luò))、 none
、host
4.1、運(yùn)行mysql01
, centos01
, centos02
容器 啟動(dòng)時(shí),docker默認(rèn)的bridge網(wǎng)橋,docker0給容器服務(wù)自動(dòng)分配ip
docker run -it --name mysql01 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7 docker run -it --name centos01 centos /bin/bash docker run -it --name centos02 centos /bin/bash
4.2、查看ip、mac地址信息 可以看到上面啟動(dòng)的三個(gè)容器服務(wù)的mac
信息
$ ip addr 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:0a:00:34 brd ff:ff:ff:ff:ff:ff inet 172.31.81.32/20 brd 172.31.95.255 scope global dynamic eth0 valid_lft 291916543sec preferred_lft 291916543sec 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:a4:2f:c5:62 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 140: br-799426d70aa2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:7f:01:1d:00 brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-799426d70aa2 valid_lft forever preferred_lft forever 154: vethe3da564@if153: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether ea:84:fb:14:47:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0 156: veth6477da5@if155: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 86:35:30:8d:14:85 brd ff:ff:ff:ff:ff:ff link-netnsid 1 158: veth17b2712@if157: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 72:76:f0:3c:17:e8 brd ff:ff:ff:ff:ff:ff link-netnsid 2
4.3、查看docker網(wǎng)絡(luò)
[root@--- ~]# docker network ls NETWORK ID NAME DRIVER SCOPE feafa30d4051 bridge bridge local e8bf4fced9e2 host host local 6263db0933b9 none null local [root@--- ~]#
4.4、查看默認(rèn)bridge網(wǎng)橋(docker0)
[root@--- ~]# 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": { "29298987c51b777b546bf6626560020ce235e390e1d7fcfe188c6db228ca4edf": { "Name": "mysql01", "EndpointID": "f6572c49234f74a6c0b652a379bb386f843ebd23b02abd59b1f6a9d1c9534b17", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", # ?容器的IP? "IPv6Address": "" }, "cb1922b95b9316d129b54f3545fad9729092926e10a1d5517f8928db42706151": { "Name": "centos01", "EndpointID": "ef6cfa74f56bfa4f49143aa08cf323812002236bc63f75204dee7c3ec1162250", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", # ?容器的IP? "IPv6Address": "" }, "cc6f510b9765ba018dbafd416c9774ddf5fd3ff55fa992827f55516e8dc70b6a": { "Name": "centos02", "EndpointID": "2f901aec8f8b455d1fb06112c9035a19f34cc597d8907f26f1b896f12d7eb7ba", "MacAddress": "02:42:ac:11:00:04", "IPv4Address": "172.17.0.4/16", # ?容器的IP? "IPv6Address": "" } }, "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": {} } ]
4.5、測(cè)試容器通信
此時(shí),進(jìn)入centos01
容器,ping
mysql容器的ip
可以ping通,但是ping不通容器名 ?
docker exec -it cb1922b95b93 /bin/bash ping 172.17.0.2 # docker0不支持容器名連接訪問 ping mysql01 ping: mysql01: Name or service not known docker run 啟動(dòng)鏡像的時(shí)候docker都會(huì)分配一個(gè)網(wǎng)卡地址 #查看運(yùn)行容器的ip docker inspect 容器ID | grep IPAddress
如下圖??
5、容器通信原理
只要我們安裝了docker,就會(huì)有一個(gè)網(wǎng)卡docker0(相當(dāng)于一個(gè)路由器),每啟動(dòng)一個(gè)docker容器,docker都會(huì)給docker容器分配一個(gè)ip(連接路由器的終端,同一網(wǎng)段下終端可以互相通信),
通過evth-pair
技術(shù)實(shí)現(xiàn),evth-pair
就是一對(duì)虛擬設(shè)備接口,他們都是成對(duì)出現(xiàn)的,一端連著協(xié)議,一端彼此相連,evth-pair
充當(dāng)一個(gè)橋梁,連接各種虛擬網(wǎng)絡(luò)設(shè)備。
Docker網(wǎng)絡(luò)使用的是Linux橋接
,宿主機(jī)是docker容器的網(wǎng)橋,docker0,最多分配65535個(gè)
刪除容器之后,虛擬網(wǎng)卡就自動(dòng)消失了。(虛擬網(wǎng)卡傳遞效率高?。?/p>
啟動(dòng)容器不設(shè)置網(wǎng)絡(luò),容器ip由docker0自動(dòng)分配情況下,容器間的通信,要經(jīng)過evth-pair
技術(shù)實(shí)現(xiàn),并不是直連的。(跟計(jì)算機(jī)網(wǎng)絡(luò)通信類似,分層模型,TCP/IP協(xié)議數(shù)據(jù)報(bào)封裝解封裝)
5.1、結(jié)論
tomcat01
,tomcat02
是共用的一個(gè)路由器,docker0
所有的容器啟動(dòng)時(shí),如果不指定網(wǎng)絡(luò)的情況下,都是docker0路由的。65535
最后
上面docker0
不支持容器名連接訪問,容器通信只可以通過容器ip
通信,docker也無法保證容器重啟后的IP地址不變,所以更好的方式是通過別名進(jìn)行互聯(lián),下篇繼續(xù)講解怎么通過別名進(jìn)行容器通信,????。
到此這篇關(guān)于Docker網(wǎng)絡(luò)及容器通信原理詳解的文章就介紹到這了,更多相關(guān)Docker網(wǎng)絡(luò)及容器通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker中conda環(huán)境的導(dǎo)出和導(dǎo)入
現(xiàn)在很多的應(yīng)用程序系統(tǒng)都會(huì)選擇使用docker容器進(jìn)行部署,本文主要介紹了Docker中conda環(huán)境的導(dǎo)出和導(dǎo)入,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Docker安裝Tomcat、MySQL和Redis的步驟詳解
這篇文章主要介紹了Docker安裝Tomcat、MySQL和Redis的步驟詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11docker mysql修改root賬號(hào)密碼并賦予權(quán)限
本文主要介紹了docker mysql修改root賬號(hào)密碼并賦予權(quán)限,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07docker prune命令定時(shí)清理不常用數(shù)據(jù)的操作方法
使用docker引擎服務(wù)時(shí)間久了,會(huì)發(fā)現(xiàn)磁盤空間越來越大,現(xiàn)在要?jiǎng)h除關(guān)于docker相關(guān)不用的數(shù)據(jù)來釋放磁盤空間,這篇文章主要介紹了docker prune命令 可定時(shí)清理不常用數(shù)據(jù),需要的朋友可以參考下2022-10-10Docker容器中文亂碼(修改docker容器編碼格式)的解決方案
這篇文章主要介紹了Docker容器中文亂碼(修改docker容器編碼格式)的解決方案的相關(guān)資料,需要的朋友可以參考下2016-12-12Docker搭建Zookeeper&Kafka集群的實(shí)現(xiàn)
這篇文章主要介紹了Docker搭建Zookeeper&Kafka集群的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08