5.2 從 DockerHub 看 Volume
單純以 volume 的使用方式來說,其實是很簡單的,但還是要花一些心力在理解整個 volume 的運作方式,以及如何快速的了解到一個新的服務該怎麼搭配 volume 使用。
首先,我們可以在 Dockerfile 中寫入 VOLUME 這個指令,這是在 Docker 映像檔篇 沒有介紹到的,我希望可以放到這個章節一次解釋。
從 DockerHub 中看看別人是如何使用 VOLUME 這個指令吧。
首先,一樣來到 DockHub 的搜尋介面,搜尋 mysql,其實可以猜測只要是需要儲存空間的服務,都一定會使用到 VOLUME 這個指令,所以這邊也可以自由發揮,去搜尋您自己熟悉的資料庫服務。
接著點擊搜尋到的第一個結果,並確認其為官方的提供的映像檔!
並點擊隨意一個版本的 mysql 映像檔。
進入後會看到的是官方映像檔在 GitHub 上面 Dockerfile 的原始碼,拉到最下方,會看到一行有使用 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
的指令,也可以看到所有設定的資料唷!