1. 程式人生 > 其它 >Docker系列學習(六)——容器資料卷 VScode使用docker

Docker系列學習(六)——容器資料卷 VScode使用docker

  本章介紹如何將docker中的容器連線到本地的資料,或者各個容器之間共用本地資料。在前面的學習中我們知道docker容器相當於一個小的系統,但是操作容器的時候把資料全部放到容器中容器就會顯得很大,並且當你刪除容器之後,資料也就沒有了,那有沒有一種技術可以使得容器能訪問本地的資料並且能將容器中產生的資料自動儲存到本地(docker cp命令可以操作,但是每次資料產生都需要操作cp就很麻煩),或者幾個容器能同時訪問到同一組資料呢?這就是容器資料卷的工作了。

  資料卷的本質就是將容器中的某個目錄掛載到本機上面,使用方式包括以下幾種:

啟動容器時使用-v引數來指定容器與主機的目錄對映。

docker run -it -v 主機目錄:容器內部目錄 映象名

  在為映象建立容器的時候,將容器內部的某個目錄和主機某個目錄進行對應(此時主機中並不需要存在這樣的一個目錄)。

  舉個例子,我現在主機中沒有CircleWang這個資料夾。

  下面我將啟動ubuntu映象,並將容器中/home目錄與本機CircleWang這個資料夾進行對應。

docker run -it -v /home/CircleWang:/home ubuntu

  我們立馬可以看到,在我們本機的home目錄下已經自動生成了一個CircleWang的資料夾。

  接下來我們可以使用docker inspect 容器ID 的命令來檢視這個容器的基本情況以及相關的資料卷的掛載情況。

  其實到這一步驟已經可以看到資料卷已經掛載成功了,但是下面我們可以測試一下資料是否可以成功共享。

 主機中新增test.txt

 容器內部也出現了test.txt

  如果我們把容器刪掉之後,這個CircleWang依然會存在,並且如果容器在停止狀態(不是被刪掉),我們在主機中更新檔案,那麼當容器再次啟動的時候,我們會發現主機中更新的內容會自動同步過去。注意這裡的連結不是軟連結,可以看成“容器內部和主機同時能擁有CircleWang這個資料夾,並且共享”,如果此時再主機中rm -r CircleWang(刪除這個資料夾)那麼在容器中將無法使用/home資料夾。(可以看成我已經把你的實體刪除了,容器就無法再操作該實體了),容器時無法刪除掛載著的資料夾的。

具名掛載

  我們前面文章中提到了,我們在使用docker run的時候加上引數-v 主機路徑:容器內路徑,這樣可以展現出完整的路徑對映,但是還有另外的方式來進行掛載資料卷。格式是:-v 卷名:容器內路徑,這種方式其實就是給容器內的那個路徑目錄取了另一個名字(在主機上可以檢視的名字)。

docker run -it -v new_name:/home ubuntu

  這個意思就是我啟動ubuntu系統,並且給/home這個資料夾取了一個新名字叫做new_name(在主機中會產生一個叫new_name新的資料夾與該容器中的/home目錄繫結)。問題是這個new_name資料夾在哪裡?我們可以通過docker volume ls命令來檢視本地卷有那些。

 

   可以看到最後一行出現了一個叫new_name的,這就表示我們本地有一個new_name的檔案被掛載到了容器中。接下來的問題是這個卷具體在哪裡呢?我們可以使用之前提到過的docker volume inspect 具體卷名的命令來檢視掛卷的具體情況。

   可以看到第四行中"/var/lib/docker/volumes/new_name/_data"這就是掛載卷在本地的路徑,我們可以進本機這個路徑看一看。同時我們也可以測試下當我們在容器中/home目錄中增加檔案的時候,本機路徑.../new_name/_data路徑下有沒有相應的檔案。(是有的)

  其實討論這麼多說白了,如果採用具名掛載的方式(即:-v 卷名:容器內路徑)這樣主機會在/var/lib/docker/volumes/目錄下新建一個卷名資料夾並將該資料夾中的_data資料夾與容器內路徑進行繫結。

匿名掛載

  與具名掛載方式不同的是,匿名掛載的模式是:-v 容器內路徑。這種方式稱為匿名掛載,這樣掛載的問題是,那這個掛載到底是主機的哪裡去了啊。其實剛才我們使用docker volume ls檢視本機掛載卷的時候可以發現出現了很多數字字母組合的名稱的卷。這些就是匿名掛載的時候,會生成一個資料夾從而繫結對應的容器內路徑。

  比如我們使用以下命令來匿名掛載一個容器中/home目錄。

docker run -it -v /home ubuntu

  此時我們再使用docker volume ls檢視本機掛載卷,會發現新增了一個數字字母組合的卷

   其實在對應的/var/lib/docker/volumes/目錄下會創建出一個888a3500..對應的資料夾。

   我們依然可以使用docker volume inspect 具體卷名的方式檢視這個卷的掛載情況,例如我就檢視一下這個888a3500...的情況。

總結:

  我們可以使用以下三種方式來進行資料卷的掛載。

-v 主機路徑:容器路徑  # 指定對映的方式
-v 卷名:容器路徑     # 具名掛載
-v 容器路徑         # 匿名掛載

拓展:

  如果安裝有VScode的docker外掛,其實在外掛中對應部分可以檢視到本機卷掛載情況,並且可以使用右鍵直接檢視到該卷的詳細資訊。如何VScode安裝docker外掛可以參看我這篇博文:VScode使用docker