docker link 過時不再用了?那容器互聯、服務發現怎么辦?(2017年文章,建議使用docker network自定義網絡)


在 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 直接定義自定義網絡並使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM