跳至主要内容

5.2 從 DockerHub 看 Volume

單純以 volume 的使用方式來說,其實是很簡單的,但還是要花一些心力在理解整個 volume 的運作方式,以及如何快速的了解到一個新的服務該怎麼搭配 volume 使用。

首先,我們可以在 Dockerfile 中寫入 VOLUME 這個指令,這是在 Docker 映像檔篇 沒有介紹到的,我希望可以放到這個章節一次解釋。

從 DockerHub 中看看別人是如何使用 VOLUME 這個指令吧。

首先,一樣來到 DockHub 的搜尋介面,搜尋 mysql,其實可以猜測只要是需要儲存空間的服務,都一定會使用到 VOLUME 這個指令,所以這邊也可以自由發揮,去搜尋您自己熟悉的資料庫服務。

搜尋 mysql

接著點擊搜尋到的第一個結果,並確認其為官方的提供的映像檔!

進入mysql 官方映像檔

並點擊隨意一個版本的 mysql 映像檔。

點擊任一版本的映像檔

進入後會看到的是官方映像檔在 GitHub 上面 Dockerfile 的原始碼,拉到最下方,會看到一行有使用 VOLUME 作為指令。

找到 VOLUME 指令

來解釋一下在 Dockerfile 中寫 VOLUME 代表著什麼呢?

以這個例子來說,MySQL 的資料庫預設的儲存路徑是放在 /var/lib/mysql 這個位置,要知道資料庫雖然聽起來是一個獨立的存在,但在怎麼樣他都還是磁碟空間中的一個檔案罷了。

而這段指令的完整語意就是,告訴 Docker 此映像檔運行成容器時,建立一個 volume 並且連接到 /var/lib/mysql 這個路徑的檔案。

意味著,所有放在這個 volume 中的資料,都是存活在容器之外,除非手動刪除掉 volume。

要記住 volume 是需要手動刪除的,沒辦法只是透過刪除容器來刪除掉 volume,這很重要!

雖然有額外的方法可以讓容器刪除時一同刪除 volume,但那是一些進階的作法,就暫且不談,而是將目光放回到 volume 本身,手動刪除意味著,volume 非常重要,至少比容器還要重要!

另一種檢查有無 Volume 的方式

拉取 mysql 映像檔來試試看吧!

$ docker image pull mysql
Using default tag: latest
latest: Pulling from library/mysql
051f419db9dd: Pull complete
7627573fa82a: Pull complete
a44b358d7796: Pull complete
95753aff4b95: Pull complete
a1fa3bee53f4: Pull complete
f5227e0d612c: Pull complete
b4b4368b1983: Pull complete
f26212810c32: Pull complete
d803d4215f95: Pull complete
d5358a7f7d07: Pull complete
435e8908cd69: Pull complete
Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812....
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

在開始之前,您或許可以使用 docker volume prune 的方式清空您現有的 volume ( 如果您已經有 volume 的話 ),讓等等的輸出畫面可以看得更加清晰,版面也不會那麼亂。

接著使用 docker image inspect 的指令來看看 mysql 這個映像檔的詳細資訊,除了從 Dockerfile 直接看之外,使用 docker image inspect 也不外乎是一個好方式唷!

$ docker image inspect mysql
[
{
...
"ContainerConfig": {
....
"Volumes": {
"/var/lib/mysql": {}
},
...
}
}
]

從回應中可以看到 volume 的預設路徑確實是 /var/lib/mysql ,所以之後也可以不需要去看官方映像檔的原始碼,透過 docker image inspect 的指令,也可以看到所有設定的資料唷!