資料卷中的容器操作,整體來說還是非常簡單的

Java極客技術發表於2019-08-07

關注公眾號,大家可以在公眾號後臺回覆“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。

本文是本系列的第六篇,閱讀前面的文章有助於更好的理解本文:

  1. Docker 入門及安裝[Docker 系列-1]

  2. Docker 容器基本操作[Docker 系列-2]

  3. Docker 容器高階操作[Docker 系列-3]

  4. Docker 映象基本操作[Docker 系列-4]

  5. DockerHub 與容器網路[Docker 系列-5]


 資料捲入門

在前面的案例中,如果我們需要將資料從宿主機拷貝到容器中,一般都是使用 Docker 的拷貝命令,這樣效能還是稍微有點差,沒有辦法能夠達到讓這種拷貝達到本地磁碟 I/O 效能呢?有!

資料卷可以繞過拷貝系統,在多個容器之間、容器和宿主機之間共享目錄或者檔案,資料卷繞過了拷貝系統,可以達到本地磁碟 I/O 效能。

本文先通過一個簡單的案例向讀者展示資料卷的基本用法。

 

以前面使用的 nginx 映象為例,在執行該容器時,可以指定一個資料卷,命令如下:

docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 bc26f1ed35cf

 

執行效果如下:

 

此時,我們建立了一個資料卷並且掛載到容器的 /usr/share/nginx/html/ 目錄下,小夥伴們知道,該目錄實際上是 nginx 儲存 html 目錄,在這裡掛載資料卷,一會我們只需要修改本地的對映位置,就能實現頁面的修改了。

接下來使用 docker inspect 命令檢視剛剛建立的容器的具體情況,找到資料卷對映目錄,如下:

 

可以看到,Docker預設將宿主機的 /var/lib/docker/volumes/0746bdcfc045b237a6fe2288a3af9d7b80136cacb3e965db65a212627e217d75/_data 目錄作為source目錄,接下來,進入到該目錄中,如下:

 

此時發現該目錄下的檔案內容與容器中 /usr/share/nginx/html/ 目錄下的檔案內容一致,這是因為掛載一個空的資料捲到容器中的一個非空目錄中,那麼這個目錄下的檔案會被複制到資料卷中(如果掛載一個非空的資料捲到容器中的一個目錄中,那麼容器中的目錄中會顯示資料卷中的資料。如果原來容器中的目錄中有資料,那麼這些原始資料會被隱藏掉)。

小貼士:

由於 Mac 中的 Docker 有點特殊,上文提到的 /var/lib/xxxx 目錄,如果是在 linux 環境下,則直接進入即可,如果是在 mac 中,需要首先執行如下命令,在新進入的命令列中進入到 /var/lib/xxx 目錄下:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

接下來修改改檔案中的index.html檔案內容,如下:

echo "hello volumes">index.html

修改完成後,再回到瀏覽器中,輸入 http://localhost檢視nginx中index.html 頁面中的資料,發現已經發生改變。說明宿主機中的檔案共享到容器中去了。

 

結合宿主機目錄

上文中對於資料卷的用法還不是最佳方案,一般來說,我們可能需要明確指定將宿主機中的一個目錄掛載到容器中,這種指定方式如下:

docker run -itd --name nginx -v /Users/sang/blog/docker/docker/:/usr/share/nginx/html/ -p 80:80 bc26f1ed35cf

這樣便是將宿主機中的 /Users/sang/blog/docker/docker/ 目錄掛載到容器的 /usr/share/nginx/html/ 目錄下。接下來讀者只需要在 /Users/sang/blog/docker/docker/目錄下新增 html 檔案,或者修改 html 檔案,都能在 nginx 訪問中立馬看到效果。

這種用法對於開發測試非常方便,不用重新部署,重啟容器等。

注意:宿主機地址是一個絕對路徑

更多操作

Dockerfile中的資料卷

如果開發者使用了 Dockerfile 去構建映象,也可以在構建映象時宣告資料卷,例如下面這樣:

FROM nginxADD https://www.baidu.com/img/bd_logo1.png /usr/share/nginx/html/RUN echo "hello docker volume!">/usr/share/nginx/html/index.htmlVOLUME /usr/share/nginx/html/

這樣就配置了一個匿名資料卷,執行過程中,將資料寫入到 /usr/share/nginx/html/ 目錄中,就可以實現容器儲存層的無狀態變化。

 

檢視所有資料卷

使用如下命令可以檢視所有資料卷:

docker volume ls

如圖:

 

檢視資料卷詳情

根據 volume name 可以檢視資料詳情,如下:

docker volume inspect 

 

執行結果如下圖:

 

刪除資料卷

可以使用 docker volume rm 命令刪除一個資料卷,也可以使用 docker volume prune 批量刪除資料卷,如下:

 

批量刪除時,未能刪除掉所有的資料卷,還剩一個,這是因為該資料卷還在使用中,將相關的容器停止並移除,再次刪除資料卷就可以成功刪除了,如圖:

 

資料卷容器

資料卷容器是一個專門用來掛載資料卷的容器,該容器主要是供其他容器引用和使用。所謂的資料卷容器,實際上就是一個普通的容器,舉例如下:

建立資料卷容器

使用如下方式建立資料卷容器:

docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu

 

命令執行效果如下圖:

 

引用容器

使用如下命令引用資料卷容器:

docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginxdocker run -itd --volumes-from mydata -p 81:80 --name nginx2 nginx

 

此時, nginx1 和 nginx2 都掛載了同一個資料捲到 /usr/share/nginx/html/ 目錄下,三個容器中,任意一個修改了該目錄下的檔案,其他兩個都能看到變化。

此時,使用 docker inspect 命令檢視容器的詳情,發現三個容器關於資料卷的描述都是一致的,如下圖:

總結

本文主要向大家介紹了資料卷中的容器操作,整體來說還是非常簡單的,小夥伴們,你學會了嗎?

參考資料:

[1] 曾金龍,肖新華,劉清.Docker開發實踐[M].北京:人民郵電出版社,2015. 

Java 極客技術公眾號,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高質量的 Java 文章。如果您覺得我們的文章還不錯,請幫忙讚賞、在看、轉發支援,鼓勵我們分享出更好的文章。

 

相關文章