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數據庫容器
- 兩個容器間的一個安全鏈接
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。