Docker - 容器內應用和外部非容器應用互相訪問方法

Docker搭建開發環境用的非常多,通常開發機器上既有容器形式的應用,又有本機跑着或者調試的程序,它們之間互相依賴,如何讓它們之間通信順暢,有時候是一個挺困難的事情。容器應用和容器外應用互相訪問分爲三種情況:

  1. 容器內應用和容器內應用
  2. 容器內應用訪問容器外應用
  3. 容器外應用訪問容器內應用

要想徹底搞清楚互相訪問的問題,就需要先弄清楚docker的網絡是怎麼一回事。爲什麼網絡重要,這麼說吧,docker三巨頭:服務(容器)、網絡 & 存儲,作爲三巨頭之一的網絡,還是要多加重視的。

希望我沒有侵權

容器三巨頭之一: 網絡

常用的docker網絡模式有三種:bridge、host 和 overlay,可能會有人說,“誰說的?還有macVlan和none 好吧 😒” ,注意,我說的是常用 🤓,三種模式各有適用場景:

  • bridge,應用都是容器形式,且都在一個宿主機上,各個容器需要互相通信的場景;
  • host,容器和本機應用混雜且需要相互訪問的情況;
  • overlay,在不同宿主機的容器之間需要互相通信的情景。

Bridge網絡

分爲“default bridge”和“user-defined bridge”(自定義bridge),docker安裝好後會默認創建一個bridge網絡(docker0),也就是“default bridge”,未指定網絡的容器會默認使用這個網絡。一般使用自定義bridge較多,我們定義一個私有網絡,可以將我們的應用與其他應用相隔離,這在一個共享的開發服務器上非常有用,此外,自定義網絡也有下面兩個優點:

  • 只有用戶定義的bridge網絡纔有DNS功能,可通過容器名稱互相訪問,否則只能使用IP進行容器間訪問,而IP一是會變,二是不好記;
  • 容器可以在不停的情況下,更換自定義的bridge,賊方便。

比如有一個容器名稱爲container-a,我們創建兩個bridge網絡,不指定driver時默認爲bridge:

docker network create bridge-a && docker inspect bridge-a

創建自定義bridge網絡

docker network create bridge-b && docker inspect bridge-b

創建自定義bridge網絡

我們跑一個alpine的基礎鏡像容器: "docker run --name=container-a -it alpine:2.9.4 sh",然後查看該容器網絡:"docker inspect container-a",

container-a的默認網絡配置

container-a使用的默認網段"172.17.0.0/16"不就是docker0的bridge網絡的網段麼。

docker默認啓動的bridge網絡

將container-a連接到bridge-a網絡: docker network connect bridge-a container-a && docker inspect container-a,我們從結果中可以看到,一個docker容器是可以同時使用兩個bridge網絡的,這個特性就比較有用了,比如我們使用一個數據庫容器供多個網絡中的應用使用,分別使用不同的數據庫。

一個容器可以在多個bridge網絡中

同時我們可以將某個bridge網絡移除: docker network disconnect bridge container-a,就會只剩下bridge-a。

Host網絡

host網絡比較容易理解,如果指定容器使用host網絡模式,容器會使用宿主機的網絡,不會相隔離。也就是說,容器暴露的端口會直接映射到宿主機的相同端口。如果容器沒有暴露端口,那麼指定不指定host是沒啥效果的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章