大家很常用到 docker volume,不過真的知道它其實有細分 三種 嗎?就聽我…講個故事吧(逃)
Volume 其實是用 mount(掛載)的,
而在 Linux 這是個再常見不過的手法,
因為對 Linux 來說所有的東西都是一個 File 嘛,
mount 只是決定我外來的東西要掛在
樹枝的哪個節點
。
而這應用在 container 又是什麼情形呢?
首先是第一種,bind mount,這種比較接近 Linux Mount,
而它的語法是 -v「左」邊放 「Host 路徑」,「右邊」放 「container 路徑」,這樣 container 在第一次,以及之後進入 UP 的狀態時,就會是以「Host 路徑」的內容為主(右邊被暫時隱藏),僅此而已。
第二種是 docker managed volumes ,這種也挺常用到的,而它的語法是 -v 「左」邊放一個「任意名稱」,右邊一樣放「container 路徑」。那麼,左邊的東西要去哪裡找呢?這就要看你的 Docker Root Dir 設在哪裡囉。
Docker Root Dir 可以透過「 docker info 」這個指令查到,以我的情形來講是用預設的 /var/lib/docker,而在這目錄底下還會有一個 volumes,再進去就可以看到你剛剛給的「 任意名稱 」的目錄囉。
而跟 bind mount 不太一樣的是,第一次啟動 container 的時候,會把設在右邊的 container 路徑其內容放到左邊的目錄底下,第二次開始才會是以「左」邊的路徑內容為主喔。
這也是為什麼我們去更版的時候,要記得更新 Volume 的內容,因為 container 的內容已經被 偷偷隱藏起來了 。
第三種現在比較少用到,是以其他 container 的 volume 當作自己的 volume,主要透過 –volumes-from 這個 關鍵字來操作,其餘的原理都跟前兩者很相似,就不多作解釋了。(p.s. volume 被拿來用的那個通常被叫作 data container)
以上幾種 Volume 都介紹過了,那麼以後要備份 container 外掛的 volume 內容就知道要去哪找了吼,各位加油!
Reference:
https://docs.docker.com/storage/bind-mounts/
https://docs.docker.com/storage/volumes/
p.s. 平常大家在 docker-compose 裡看到的那個 volumes 區塊的定義跟使用的都是屬於 docker managed volumes 的範疇,除非你左手邊是直接放 Host 路徑(e.g. mysql)。