Docker學習總結(四)——容器間的通訊和資料卷

山河遠闊、發表於2020-11-23

Docker學習總結(四)——容器間的通訊和資料卷

一、容器間的通訊

1.容器的虛擬IP

在之前文章中我們建立的容器都是各自獨立,沒有任何關聯的,如果我們需要容器間進行通訊那我們需要怎麼去實現。首先我們需要知道的是,在我們執行容器時,docker預設會向容器分配一個虛擬的IP地址,這個IP地址是無法從外部進行訪問的,只能在容器間進行訪問。可以通過

docker inspect containerId命令進行檢視,在此之前我們先執行一個名為web1的容器,再使用上述命令進行檢視,結果若下圖所示:

在這裡插入圖片描述

圖中標註出的就是該容器的虛擬IP。

接著我們通過同一映象建立一個名為web2的容器,同樣使用docker inspect對容器資訊進行檢視,結果如下:

在這裡插入圖片描述

緊接著我們進入web1這個容器中,進行測試,看是否能與web2連線成功;

在這裡插入圖片描述

連線成功,從web2中向web1傳送請求也是一樣的。按照這樣的情況,只要知道目標容器的虛擬IP地址就能夠完成容器間的通訊,但是當前還有一個問題,這個虛擬IP是在容器執行時隨機分配的,也就是說容器如果重啟,那麼這個虛擬IP地址就可能不同。若是有疑惑可按照以下步驟進行測試:

  1. 停止web1容器;
  2. 重啟web2容器;
  3. 啟動web1容器;

經過以上步驟後再檢視容器資訊會發現web1容器的IP由原來的172.17.0.2變成了172.17.0.3,而web2的IP地址由原來的172.17.0.3變成了172.17.0.2,因此,通過設定容器的虛擬IP地址進行通訊是不可行的。以下將介紹兩種通訊方式,一種是用於單向通訊的Link,還有一種是用於雙向通訊的網橋Bridge。

2.容器間的單向訪問

其實,要採用單向通訊的link非常的簡單,我們還是採用上面的例子,我們再建立一個容器web3,命令如下:

docker run -d --name web3 --link web1 tomcat

上述的命令和我們以往用到的執行容器的命令多了--link web1,這個意思就是與web1建立單項連線,下面我們可以進入到web3容器中進行測試,結果如下:

在這裡插入圖片描述

如上圖所示,紅色框中,是web3對web1進行訪問,無需通過虛擬IP,而是直接通過服務名稱進行訪問,而訪問web2時則會提示失敗,但是在web1中訪問web3則還是需要通過虛擬IP進行訪問,除非對web1也進行設定,下面我們將介紹一種能夠使容器進行雙向訪問的方法。

3.容器間的雙向訪問

​ 首先我們先進行一項測試,嘗試在容器內部ping www.baidu.com,會發現在容器內部是可以與外部相連線的,而連線的基礎就在於docker中的一個虛擬元件Bridge(網橋),他起到了一個橋接內部與外部網路的作用,充當著閘道器的作用,接在同一網橋上的容器可以理解為是在一個區域網內,因此可以通過閘道器相互訪問,而與外部進行資料交換,則需要通過物理網路卡進行轉換,從外部進來的資料需要先通過物理網路卡進行轉換,然後再通過網橋進行分發。

​ 接著我們執行一條命令來檢視docker的網路服務:

docker network ls

在這裡插入圖片描述

然後我們通過一條命令建立一個新的網橋

docker network create -d my-bridge

接著我們通過docker network connect bridgeName containerName命令將容器與網橋進行繫結,示例如下:

docker network connect my-bridge web1

只要將容器與該網橋進行逐一繫結,這幾個容器就能夠直接通過容器名相互訪問。

二、容器間的資料共享——Volume(資料卷)

資料卷的概念,簡單來說就是在宿主機上開闢一塊磁碟空間用於儲存容器中需要用到的檔案,而所有需要用到該檔案的容器都能夠對其進行共享,若需要對該檔案進行修改,也只需要對宿主機上的檔案進行修改,省去了重複修改的繁瑣,同時,在容器內部設定好的地址也能看到對映的檔案,下面對如何設定容器的Volume進行簡要說明:

  1. 第一種方式,是在每一次啟動容器時都對Volume的宿主機地址和對映地址進行設定,下面以啟動Tomcat容器為例進行說明,命令如下:

docker run --Name web1 -p 8080:8080 -v /usr/local/data:/usr/local/tomcat/webapps -d tomcat

  • –Name:容器名稱;
  • -p:設定埠號,冒號前表示的是宿主機開放的埠8080,冒號後表示的是容器的開放埠;
  • -v:設定資料卷,“:”前表示宿主機地址,也就是檔案存放的地址,後面表示的是在容器中的對映地址;

​ 2.第一種方式在容器較少的時候使用起來可能並沒有感覺到不方便,如果容器多的話每次都需要以這樣的方式輸入命令就顯得比較繁瑣,同時在輸入路徑時還需要保證不能出錯,因此,又有了另外一種更為簡單的方法,建立共享容器,還是以tomcat容器為例,命令如下:

  • 首先,建立資料容器
    • docker create --name data -v /usr/local/data:/usr/local/tomcat/webapps tomcat
  • 執行所需容器,並在執行時指定資料卷
    • docker run --volumes-from data --name web1 -d tomcat

這種方式首先需要建立資料容器,只需要建立不需要執行,示例中建立了一個以tomcat為映象名為data的資料容器,第二步就是執行自己需要的容器,並在執行命令中通過 --volumes-from 資料容器名稱來說明掛載的資料容器,不需要對路徑進行重新設定。

的資料容器,第二步就是執行自己需要的容器,並在執行命令中通過 --volumes-from 資料容器名稱來說明掛載的資料容器,不需要對路徑進行重新設定。

總結:其實無論是網橋的設定還是資料卷的設定,都是對原有功能的一個封裝,docker容器本身也就能夠支援彼此之間通過IP通訊,也支援直接在啟動容器時宣告對映檔案路徑,但不管是網橋還是資料卷都強化了原有的功能,使之更加便捷、高效。後面我們將介紹一種docker的編排工具——docker-compose,同時之前所有總結的命令以及功能也都會其中進行總結以及綜合運用。

相關文章