docker容器間的互連通信有三種方法:
docker內部網絡:不夠靈活強大,不推薦
docker networking:1.9或更新版本,推薦使用
docker鏈接:1.9之前版本適用。
1.docker內部網絡
涉及docker自己的網絡棧。
安裝docker後,系統會創建一個新的網絡接口,名字是docker0,用於連接容器和宿主機,IP範圍是172.16-172.30,
每個docker容器都會在這個接口上分配一個IP地址。
docker每創建一個容器就會創建一組互聯的網絡接口,一端是容器裡的eth0接口,另一端則在宿主機以veth開頭命名,
通過把每個veth接口綁定到docker0網橋,docker創建了一個虛擬子網,這個子網由宿主機和所有的docker容器共享,
實現容器和宿主機的通信連接,注意只有容器運行時veth接口才存在。
用內部網絡實現容連互聯的弊端:
要在容器的應用程序裡對另一個容器的IP地址做硬編碼;
容器重啟後,IP地址可能會改變;
不夠方便和靈活。
2.docker networking
容器之間的連接用網絡創建。
允許用戶創建自己的網絡,容器通過這個網絡互相通信;
可以跨越不同的宿主機來通信,網絡配置也更靈活;
可以在無需更新連接的情況下,停止、啟動或者重啟容器;
不必事先創建容器再去連接它,也不必關心容器的運行順序,可以在網絡內部獲得容器名解析和發現;
和docker compose以及swarm進行了集成;
在docker網絡內部啟動的容器,會感知到所有在這個網絡下運行的容器,
並通過/etc/hosts文件將這些容器的地址保存到本地DNS中,
網絡內的任何主機都可以使用hostname或hostname.netname的形式來被解析訪問,
如果任何一個容器重啟了,其IP地址會自動在/etc/hosts文件中更新,
測試中發現/etc/hosts文件中好像沒有新增其他容器的地址,但也能互相ping通;
一個容器可以同時加入多個網絡,所以可以創建非常複雜的網絡模型;
docker network create 創建一個網絡
docker network inspect 查看網絡的詳細信息
docker network ls 列出當前系統中的所有網絡
docker network connect 將已有容器連接到一個網絡
docker network disconnect 從網絡中斷開一個容器
docker network rm 刪除一個或多個網絡
docker network prune 刪除所有未使用的網絡
3.docker鏈接
在鏈接過程中要引用到容器的名字,且只能工作於同一臺宿主機中。
在docker run啟動容器時用參數 --link 創建兩個容器間的 客戶-服務 鏈接,
需要兩個參數,一個是鏈接容器的名字,一個是鏈接的別名,即 --link redis:db,
被鏈接的容器是服務,鏈接讓服務容器能夠和客戶容器通信,
客戶容器可直接訪問服務容器的任意公開端口,所以服務容器的端口不需要對本地宿主機公開,相對更加安全;
可以把多個客戶容器鏈接到同一個服務容器,也可通過指定多次--link來鏈接到多個服務容器,
docker在容器的/etc/hosts文件和包含鏈接信息的環境變量裡寫入鏈接信息;
無論採用哪種方式,都可以創建一個Web應用程序棧,包含以下組件:
一個Web服務器容器
一個Redis數據庫容器
兩個容器間的一個安全鏈接
[techdo ] Docker容器互相連接三種實現方法詳解已經有455次圍觀