天天看點

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

如果覺得文章有幫助,歡迎點選頭像關注我擷取更多原創文章,同時也歡迎轉發。

同時也可以在我的曆史文章中找到Linux作業系統相關的伺服器運維管理入門系列文章,歡迎交流。

前文示範docker容器内部資料共享與持久化,本文繼續讨論docker網絡以及容器之間的通信。

通過前面幾篇文章的學習,大家對docker已經有了初步的認識,已經能夠對單個容器進行管理操作。但在實際工作中,往往需要多個服務容器之間共同協作,這就要求多個容器之間能夠互相通路到對方的服務。比如我們部署個人部落格網站,往往将資料庫服務和web服務放在不同的容器中,web服務需要通路資料庫,是以就要求web容器能否通路資料庫容器。如何實作這個功能,正是本文将要探讨的。

本文先簡要描述docker網絡相關基礎知識,然後再基于bridge網絡模式,示範如何将容器端口映射到主控端供外部通路、如何通過互聯機制實作容器之間互相通信。

一、docker網絡初探

正如前文“Docker基礎修煉3--Docker容器介紹及常用指令”中示範,通過httpd鏡像run一個容器的同時指定端口映射,就可以通過主控端ip和端口通路到web容器。這是怎麼實作的呢,底層原理是什麼?要了解這個現象就要了解docker相關的網絡知識。

1.1 網絡實作原理

docker使用Linux橋接在主控端虛拟一個docker容器網橋(名稱為docker0),每當啟動一個容器時會根據docker網橋的網段配置設定一個IP位址給容器(稱為容器IP),同時把docker網橋作為每個容器的預設網關。因為在同一主控端内的容器都接入同一個網橋,這樣容器之間就能夠通過容器IP直接通信。

為了更好的了解上邊這句話,來看如下案例

1.1.1 案例1:檢視docker容器網橋資訊

我們可以通過ifconfig指令檢視docker0容器網橋資訊

[[email protected] ~]# ifconfigdocker0: flags=4099  mtu 1500        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255        ether 02:42:ca:9b:e4:a9  txqueuelen 0  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0​eno16777736: flags=4163  mtu 1500        inet 192.168.78.101  netmask 255.255.255.0  broadcast 192.168.78.255        inet6 fe80::20c:29ff:fea8:5807  prefixlen 64  scopeid 0x20        ether 00:0c:29:a8:58:07  txqueuelen 1000  (Ethernet)        RX packets 155  bytes 16984 (16.5 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 180  bytes 22972 (22.4 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0...省略部分内容
           

可以看到docker0即為容器網橋,是主控端虛拟出來的,并不是真實存在的網絡裝置。另外一個eno16777736(每台電腦可能名稱不一樣)則為網卡資訊,可以通過它配置主控端的IP資訊。

1.1.2 案例2:建立兩個容器觀察容器IP以及互通性

通過案例1可以看到docker0的ip為:172.17.0.1。本例以官方提供的centos鏡像為例,建立容器mycentos1、mycentos2,觀察這兩個容器IP與docker0的IP之間的關系

先建立mycentos1

[[email protected] ~]# docker run -it --name mycentos1 centos[[email protected] /]# ifconfigbash: ifconfig: command not found[[email protected] /]# yum install net-tools...省略部分内容,中途需要按兩次y進行确認[[email protected] /]# ifconfigeth0: flags=4163  mtu 1500        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)        RX packets 2562  bytes 12723956 (12.1 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 2168  bytes 121391 (118.5 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0...省略部分内容[[email protected] /]# netstat -rnKernel IP routing tableDestination     Gateway         Genmask         Flags   MSS Window  irtt Iface0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0[[email protected] /]# 
           

基于官方鏡像centos建立容器mycentos1後,進入容器發現ifconfig指令提示不存在,原因是此官方進行預設沒有安裝網絡工具包,是以通過yum install net-tools指令安裝網絡工具,安裝完成後再次通過ifconfig指令即可看到該容器的ip為:172.17.0.2 ,然後再通過netstat -rn檢視該容器的網關為:172.17.0.1。

這就證明了前面說的:每當啟動一個容器時會根據docker網橋的網段配置設定一個IP位址給容器,同時把docker網橋作為每個容器的預設網關。

接下來繼續建立容器mycentos2,驗證兩容器之間IP的連通性。

克隆一個連接配接會話,然後按如下步驟執行

[[email protected] ~]# docker run -it --name mycentos2 centos[[email protected] /]# yum install net-tools...與上面相同,是以省略輸出過程[[email protected] /]# ifconfigeth0: flags=4163  mtu 1500        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)        RX packets 1957  bytes 12693925 (12.1 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 1584  bytes 89868 (87.7 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0...省略部分輸出[[email protected] /]# netstat -rnKernel IP routing tableDestination     Gateway         Genmask         Flags   MSS Window  irtt Iface0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0[[email protected] /]# 
           

同理可以看到mycentos2容器的ip位址為:172.17.0.3,網關為:172.17.0.1

在mycentos2中通過ip去pingmycentos1的ip,觀察連通性

[[email protected] /]# ping -c 1 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.069 ms​--- 172.17.0.3 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms[[email protected] /]# exitexit[[email protected] ~]# 
           

可以看到在mycentos2中可以直接通過ping通mycentos1的ip,反過來亦然。這充分證明了:因為在同一主控端内的容器都接入同一個網橋,這樣容器之間就能夠通過容器IP直接通信。

1.2 常見網絡模式

1.2.1 docker網絡相關指令

先簡單介紹下幾個docker網絡相關的指令

docker network ls:檢視網絡

docker network create:建立網絡

docker network inspect:檢視網絡細節

docker port:檢視主控端與容器間的端口映射

1.2.2 docker網絡模式

我們先來看看docker安裝後預設的網絡

[[email protected] ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEd0f8ab5a4b42        bridge              bridge              local28991c6c5348        host                host                local969fd1293425        none                null                local[[email protected] ~]# 
           

通過docker network ls指令檢視主控端網絡情況,可以看到安裝docker後,自動安裝了三個網絡,啟動類型分别為:bridge、host、null。

實際上docker有如下幾種類型的網絡驅動:bridge、none、container、host、overlay等

模式配置說明bridge-net=bridge預設使用該模式none–net=none容器有獨立的Network namespace,但并沒有對其進行任何網絡設定,如配置設定veth pair 和網橋連接配接,配置IP等。container-net=container:NAME_or_ID容器和另外一個容器共享Network namespace。 kubernetes中的pod就是多個容器共享一個Network namespace。host–net=host容器和主控端共享Network namespace。overlay–net=overlay多主機之間通信

(1)bridge模式

bridge模式是docker的預設網絡模式,不寫--net參數,就是bridge模式。

bridge模式示意圖如下:

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

bridge網絡模式

從docker0子網中配置設定一個IP給容器使用,并設定docker0的IP位址為容器的預設網關。在主機上建立一對虛拟網卡veth pair裝置,Docker将veth pair裝置的一端放在新建立的容器中,并命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,并将這個網絡裝置加入到docker0網橋中。可以通過brctl show指令檢視。

當使用指令docker run -p建立容器時,docker實際是在iptables做了DNAT規則,實作端口轉發功能。可以使用iptables -t nat -vnL指令檢視。

(2)none模式

使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等資訊。需要我們自己為Docker容器添加網卡、配置IP等。

none模式示意圖如下:

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

none網絡模式

這種網絡模式下容器隻有lo回環網絡,沒有其他網卡。none模式可以在容器建立時通過--network=none來指定。這種類型的網絡沒有辦法聯網,封閉的網絡能很好的保證容器的安全性。

(3)container模式

這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和主控端共享。新建立的容器不會建立自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如檔案系統、程序清單等還是隔離的。兩個容器的程序可以通過 lo 網卡裝置通信。

container模式示意圖如下:

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

container網絡模式

(4)host模式

如果啟動容器的時候使用host模式,那麼這個容器将不會獲得一個獨立的Network Namespace,而是和主控端共用一個Network Namespace。容器将不會虛拟出自己的網卡,配置自己的IP等,而是使用主控端的IP和端口。但是,容器的其他方面,如檔案系統、程序清單等還是和主控端隔離的。

host模式如下圖所示:

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

host網絡模式

使用host模式的容器可以直接使用主控端的IP位址與外界通信,容器内部的服務端口也可以使用主控端的端口,不需要進行NAT,host最大的優勢就是網絡性能比較好,但是docker host上已經使用的端口就不能再用了,網絡的隔離性不好。

(5)overlay模式

overlay網絡用于連接配接不同機器上的docker容器,允許不同機器上的容器互相通信,同時支援對消息進行加密,當我們初始化一個swarm或是加入到一個swarm中時,在docker主機上會出現兩種網絡:

a、稱為ingress的overlay網絡,用于傳遞叢集服務的控制或是資料消息,若在建立swarm服務時沒有指定連接配接使用者自定義的overlay網絡,将會加入到預設的ingress網絡

b、名為docker_gwbridge橋接網絡會連接配接swarm中所有獨立的docker系統程序

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

overlay網絡模式

關于overlay網絡的更多細節将在後續講解,此處提到的swarm是一個新的概念,docker swarm是官方提供的叢集管理工具,它将若幹台docker主機抽象為一個整體以便于統一進行管理。

總結:

在一台主機上的多個獨立的容器,用bridge模式

需要将容器的網絡環境和主機的網絡環境綁定時,用host模式

需要多個主機上的多個容器互相通信,用overlay網絡

二、docker端口映射

Docker網橋是主控端虛拟出來的,并不是真實存在的網絡裝置,外部網絡是無法尋址到的,這也意味着外部網絡無法通過直接Container-IP通路到容器。如果容器希望外部通路能夠通路到,可以通過映射容器端口到宿主主機(端口映射),即docker run建立容器時候通過 -p 或 -P 參數來啟用,通路容器的時候就通過[主控端IP]:[容器端口]通路容器。

正如前面所述,容器有自己的内部網絡和 ip 位址,使用docker inspec可以詳細檢視。

前文已經通過ngnix進行了示範,本例再以training/webapp鏡像為例進行示範-p和-P的用法。

training/webapp鏡像是一個運作python的環境,裡邊包含了簡單的基于python的web程式,運作後即可通路,類似于前文的ngnix示範效果,内部運作端口為5000。如果你沒有python基礎,完全不用關心鏡像内部的細節,本文重點是示範容器端口映射的幾種方法。

首先下載下傳鏡像

[[email protected] ~]# docker pull training/webappUsing default tag: latestlatest: Pulling from training/webapp...輸出内容省略
           

2.1 使用P參數随機映射端口

當容器中運作一些網絡應用, 要讓外部通路這些應用時, 可以通過-P或-p參數來指 定端口映射。 當使用P(大寫的)标記時, Docker 會随機映射一個 49000~49900 的端口到内部容器開放的網絡端口。

[[email protected] ~]# docker run -d -P training/webapp python app.py3f6e17415056c27d3186dad236371be9be9bbdd121babfbf3aed6c8b2c86d01f[[email protected] ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES3f6e17415056        training/webapp     "python app.py"     14 seconds ago      Up 12 seconds       0.0.0.0:32768->5000/tcp   nifty_wing[[email protected] ~]# 
           

可以看到随機映射到主控端的端口為32786,是以外部可以通過主控端ip:32786的形式進行通路。

另外需要注意,如果沒有通過--name顯式指定容器名稱,則會自動随機生成一個容器名,如此處的容器名nifty_wing。

此處的IP位址為我示範是主控端的ip位址,是以需要改為自己對應的ip即可。

此外,我們還可以通過docker logs指令檢視python應用的輸出資訊,其中3f6e17415056為容器的ID,也可以通過容器名稱通路。

[[email protected] ~]# docker logs -f 3f6e17415056 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)192.168.78.1 - - [07/Apr/2020 23:38:03] "GET / HTTP/1.1" 200 -192.168.78.1 - - [07/Apr/2020 23:38:03] "GET /favicon.ico HTTP/1.1" 404 -​
           

當使用p(小寫)參數時,則可以指定要映射的端口,并且在一個指定端口上隻可以綁定一個容器。支援格式為:IP:HostPort:ContainerPort 或 IP:: ContainerPort 或 HostPort:ContainerPort,也就是說除了容器端口必須指定外,主控端IP、主控端端口可以不同時指定。

2.2 映射所有接口位址

使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口, 可以執行如下指令:

[[email protected] ~]# docker run -d -p 5000:5000 --name test2 training/webapp python app.py511a5a103216391f5075a3e8c3b841bb104806dbd177fce7db1318a887df9f46[[email protected] ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES511a5a103216        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   test2[[email protected] ~]# 
           

此時在通過主控端ip:5000的形式在浏覽器再次通路,将看到2.1中同樣的效果,這樣就把容器内的5000端口映射到了主控端的5000端口上。

可以通過docker port指令檢視端口映射

[root@docker ~]# docker port test2 50000.0.0.0:5000[[email protected] ~]# 
           

可以看到容器内5000端口映射到了主控端的0.0.0.0:5000。其中0.0.0.0表示任意位址。

由于此處未指定主控端ip位址,是以當有多塊網卡或多IP的時候,都可以通過這種形式通路到。

2.3 映射到指定位址的指定端口

可以使用IP:HostPart:ContainerPort格式指定映射使用一個特定位址,比如 localhost位址127.0.0.1:

[[email protected] ~]# docker run -d -p 127.0.0.1:5001:5000 --name test3 training/webapp python app.py4b689b1be9faed3d8b50beac57ce4b5a95899ef38c6ed7bdbcde11a7d2dddebd[[email protected] ~]# docker port test3 5000127.0.0.1:5001[[email protected] ~]# 
           

此時由于指定的主控端固定位址為127.0.0.1,實體主機上将無法直接通過這個位址或主控端IP通路

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

此外,還可以采用IP::ContainerPort的形式,不指定主控端端口,本地主機會自動配置設定一個端口。這種方式就不示範了。

三、容器互聯互通

本文隻讨論bridge網絡模式下容器之間的互相通信,以後将要講解的swarm模式下,也是可以通過服務名稱進行互相通信的。

容器的互聯(linking)是一種讓多個容器中的應用進行快速互動的方式。它會在源和接收容器之間建立連接配接關系,接收容器可以通過容器名快速通路到源容器,而不用指定具體的IP位址。

檢視容器名稱除了可以用docker ps進行檢視外,還可以用docker inspect指令。前面文章中學習過docker inspect指令,它是用于檢視容器内部詳細資訊的,我們可以通過-f參數來照看指定内容。

[[email protected] ~]# docker inspect -f "{{.Name}}" test2      /test2
           

另外,在執行docker run的時候如果添加--rm标記,則容器在終止後會立刻删除。- -rm 和-d參數不能同時使用。

截至目前為止,我們建立的容器都是采用預設的bridge驅動類型的名稱為bridge的網絡,因為如果在建立容器時沒有顯示通過--net指定網絡,則預設采用bridge網絡。

這裡有個大坑,都是dridge驅動類型的網絡,預設的bridge和自定義的bridge兩者有些差別,3.1和3.2就是用來示範他們的不同

3.1 bridge預設網絡下容器間互通

預設的bridge網絡下,使用--link參數可以讓容器之間安全地進行互動。

在操作之前,我們采用如下指令删除之前建立的所有容器

[[email protected] ~]# docker rm -f $(docker ps -aq)
           

本例我們通過training/postgres和training/webapp這2個鏡像進行示範。其中postgres為資料庫,webapp鏡像為基于python的web。

先下載下傳對應的鏡像

[[email protected] ~]# docker pull training/postgres
           
3.1.1 建立db容器
[[email protected] ~]# docker run -d --name db training/postgres370dd884b187bfc4f91af955270d1695f737d20883fbb9e11601afbc1a98274a[[email protected] ~]#
           
3.1.2 建立web容器
[[email protected] ~]# docker run -d -P --name web --link db:db training/webapp python app.py429c3b111d76948812be1a495ff5eebf4fe8340c540c7633a0fe2e212c35cc74[[email protected] ~]# 
           

此時,db容器和web容器建立互聯關系。 --link參數的格式為--link name: alias, 其中name是要連結的容器的名稱 , alias是别名。

3.1.3 連通性測試

通過docker ps指令檢視,互相進入容器ping對方容器名稱

[[email protected] ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES429c3b111d76        training/webapp     "python app.py"          22 seconds ago       Up 20 seconds       0.0.0.0:32769->5000/tcp   web370dd884b187        training/postgres   "su postgres -c '/us…"   About a minute ago   Up About a minute   5432/tcp                  db[[email protected] ~]# docker exec -it web /bin/bash         [email protected]:/opt/webapp# ping -c 1 dbPING db (172.17.0.2) 56(84) bytes of data.64 bytes from db (172.17.0.2): icmp_seq=1 ttl=64 time=0.183 ms--- db ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.183/0.183/0.183/0.000 [email protected]:/opt/webapp# exitexit[[email protected] ~]# docker exec -it db /bin/[email protected]:/# ping webping: unknown host [email protected]:/# exitexit[[email protected] ~]# 
           

可以看到在web容器内可以ping通db,但是db内卻ping不通web,是以說明--link是單向的。

這相當于在兩個互聯的容器之間建立了一個虛機通道, 而且不用映射它們的端口到宿主主機上。 在啟動 db 容器的時候并沒有使用 -p 和 -P 标記, 進而避免了暴露資料庫服務 端口到外部網絡上。

從這個單向性也可以看出,在目前這種預設的bridge網絡下,如果在建立web容器時不通過--link指定連接配接,則在web内是無法連接配接到db的,可以自己動手驗證一下。

3.1.4 link内部原理

docker通過兩種方式為容器公開連接配接資訊:環境變量和/etc/hosts檔案。

當我們建立容器時,指定--link,實際上docker内部會自動做一些事情,才使得容器之間能夠互聯。

進入web容器觀察環境變量

[[email protected] ~]# docker exec -it web /bin/bash [email protected]:/opt/webapp# envHOSTNAME=1424259bc79dDB_NAME=/web/dbTERM=xtermDB_PORT_5432_TCP_ADDR=172.17.0.2DB_PORT=tcp://172.17.0.2:5432DB_PORT_5432_TCP=tcp://172.17.0.2:5432...省略部分内容
           

其中 DB—開頭的環境變量是供 web 容器連接配接 db 容器使用, 字首采用大寫的連接配接别名。

除了環境變量, Docker 還添加 host資訊到父容器的 /etc/hosts 的檔案。 下面是父容器web的 hosts 檔案

[email protected]:/opt/webapp# cat /etc/hosts...省略部分無關内容172.17.0.2      db d31f1617c99f172.17.0.3      14242[email protected]:/opt/webapp# exitexit[[email protected] ~]# 
           

這裡有 2 個 hosts 資訊, 第一個是 web 容器, web 容器用自己的 id 作為預設主機名, 第二個是 db 容器的 IP 和主機名。

這個過程都是自動的,無需人工幹預。這樣就實作了容器間的互聯。

3.2 bridge自定義網絡下容器間互通

上一節示範了建立容器是不指定網絡,采用預設的bridge的網絡,需要指定--link才能實作容器間通信。而如果是自定義的bridge網絡,則無需指定直接就可以通信。

避免幹擾,先删除所有容器

[[email protected] ~]# docker rm -f $(docker ps -qa)1424259bc79dd31f1617c99f[[email protected] ~]# 
           
3.2.1 建立自定義bridge網絡
[[email protected] ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEda812afe6179        bridge              bridge              local28991c6c5348        host                host                local969fd1293425        none                null                local[[email protected] ~]# docker network create -d bridge --attachable mybridge12d1d3bc9619d8e5f00785a2ac29eb4a5a1cef06610015e1689eddef79ae47b1[[email protected] ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEda812afe6179        bridge              bridge              local28991c6c5348        host                host                local12d1d3bc9619        mybridge            bridge              local969fd1293425        none                null                local[[email protected] ~]# 
           

建立網絡采用docker network create 指令,-d參數指定網絡驅動類型,--attacheable指定網絡是否可以附加。

3.2.2 建立容器是指定自定義網絡
[[email protected] ~]# docker run -d --name db --network mybridge training/postgres   9b0fad4485c4fdb08346b1154da4932c4dbf40b20f2af049733bc31edc261638[[email protected] ~]# docker run -d -P --name web --network mybridge training/webapp python app.py2aa7fcd3400eafb833aa2473eed4d7ecce532e4f571af380fa3df3c459ad73fc[[email protected] ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES2aa7fcd3400e        training/webapp     "python app.py"          10 seconds ago      Up 8 seconds        0.0.0.0:32772->5000/tcp   web9b0fad4485c4        training/postgres   "su postgres -c '/us…"   44 seconds ago      Up 42 seconds       5432/tcp                  db
           
3.2.3 測試容器連通性
[[email protected] ~]# docker exec -it db /bin/[email protected]:/# ping -c 1 webPING web (172.18.0.3) 56(84) bytes of data.64 bytes from web.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.101 ms--- web ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.101/0.101/0.101/0.000 [email protected]:/# exitexit[[email protected] ~]# docker exec -it web /bin/[email protected]:/opt/webapp# ping -c 1 dbPING db (172.18.0.2) 56(84) bytes of data.64 bytes from db.mybridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.094 ms--- db ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.094/0.094/0.094/0.000 [email protected]:/opt/webapp# exitexit[[email protected] ~]# 
           

可以看到不用--link也可以正常通路,并且是互相能通的。說明自定義bridge網絡,無須指定--link參數(如果你指定了也不會報錯)直接就可以通路了。

3.3 bridge自定義網絡和預設網絡差別

上邊兩個案例示範了基于bridge網絡驅動的預設網絡和自定義網絡之間的差別,在此做一個總結。

按照一般的思維,docker預設提供的bridge網絡與使用者自定義的bridge網絡之間,在功能上應該沒有什麼差別,但實際情況與此相反,兩者之間存在着一些不同,假設有兩個容器連接配接在同一個bridge網絡之上,在網絡是預設的與使用者自定義的情況下的一些不同點:

docker 容器之間通信_還不清楚docker容器間是如何通信的?看這篇文章就夠了

bridge驅動類型預設網絡和自定義網絡的差別

本文詳細示範了docker網絡中bridge網絡驅動模式下預設網絡和自定義網絡的差別,關于overlay網絡模式将在以後進行介紹。

繼續閱讀