docker link 過時不再用了?那容器互聯、服務發現怎麼辦?

YatHo發表於2017-11-20

在 1-2 年前,Docker 所有容器都連線於預設的橋接網路上,也就是很多老文章鼓搗的 docker0 橋接網路卡。因此實際上預設情況下所有容器都是可以互聯的,沒有隔離,當然這樣安全性不好。而服務發現,是在這種環境下發展出來的,通過修改容器內的 /etc/hosts 檔案來完成的。凡是 --link 的主機的別名就會出現於 /etc/hosts 中,其地址由 Docker 引擎維護。因此容器間才可以通過別名互訪。

但是這種辦法並不是好的解決方案,Docker 早在一年多以前就已經使用自定義網路了。在同一個網路中的容器,可以互聯,並且,Docker 內建了 DNS,容器內的應用可以使用服務名、容器名、別名來進行服務發現,名稱會經由內建的 DNS 進行解析,其結果是動態的;而不在同一網路中的容器,不可以互聯。

因此,現在早就不用 --link 了,而且非常不建議使用。

首先是因為使用 --link 就很可能還在用預設橋接網路,這很不安全,所有容器都沒有適度隔離,用自定義網路才比較方便互聯隔離。

其次,修改 /etc/hosts 檔案有很多弊病。比如,高頻繁的容器啟停環境時,容易產生競爭冒險,導致 /etc/hosts 檔案損壞,出現訪問故障;或者有些應用發現是來自於 /etc/hosts 檔案後,就假定其為靜態檔案,而快取結果不再查詢,從而導致容器啟停 IP 變更後,使用舊的條目而無法連線到正確的容器等等。

另外,在一代 Swarm 環境中,在 docker-compose.yml 中使用了 links 就意味著服務間的強依賴關係,因此排程時不會將服務執行於不同節點,而是全部執行於一個節點,使得橫向擴充套件失敗。

所以不要再使用 --link 以及 docker-compose.yml 中的 links 了。應該使用 docker network,建立網路,而 docker run --network 來連線特定網路。或者使用 version: '2' 的 docker-compose.yml 直接定義自定義網路並使用。

相關文章