Docker Certified Associate(DCA)認證考試學習- VOLUME CLI and Bind Mounts Docker Certified Associate(DCA)認證相關資源、VOLUME CLI、Bind Mounts

Published on Monday, February 27, 2023

Docker VOLUME CLI

在上一篇的文章中: Docker Certified Associate(DCA)認證考試學習- VOLUME
我們學到了該怎麼在 Docker 中建立並且使用一個 volume ,今天要來學習另一種創建 volume 的方式
Docker 有提供一組 Volume Cil 讓我們可以手動來操作 volume 相關功能

docker volume  --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.

接下來我們將利用 Volume Cli 來手動建立 volume

docker volume create myvolume

列出所有 volume

docker volume ls

這邊看到 VOLUME NAME 為 myvolume , 跟 Dockerfile 自動幫我們產生的亂數名稱有很大的差異 使用手動建立的 volume 可讀性可以大大提昇

[node1] (local) root@192.168.0.13 ~
$ docker volume ls
DRIVER    VOLUME NAME
local     myvolume

使用 docker inspect 可以列出 volume 的詳細資訊
此 volume 在 Host 環境中的實際位置為 /var/lib/docker/volumes/myvolume/_data

$ docker inspect myvolume
[
    {
        "CreatedAt": "2023-02-27T14:31:18Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]

同樣的我們也可手動把 volume 掛載到 container 內部,詳細的操作可以參考上一篇的文章

docker run -dit -v myvolume:/newvolume alpine 

Docker Bind Mounts

Bind Mounts 的使用方法與 Volume 幾乎相同,但是需要注意 Host 的作業系統,因為我們都知道 Windows 的 Filesystem 與 Linux 完全不同
所以 Docker 為了兼容性所以並不允許在 Dockerfile 之中指定 Host 之中的路徑,只能使用 Volume 交給 Docker 處理這種作業系統等級的問題

例如以下寫法就是不行的,因為在 Dockerfile 之中 VOLUME 為了兼容性,所以這邊不允許輸入 Host 端的路徑 Docker 會將此路徑解析成 Json 格式,所以最後運行結果會像下面這樣

#Dockerfile
FROM alpine
VOLUME /root/hello:/myvolume

這邊還是會自動建立一個 Volume , 並且 Destination 為 "/root/hello:/myvolume"

[{"Type":"volume","Name":"94802cd7200d52de9c74e27d4235b3a49f18d5d1c70be879a0d418e9112fc9b6","Source":"/var/lib/docker/volumes/94802cd7200d52de9c74e27d4235b3a49f18d5d1c70be879a0d418e9112fc9b6/_data","Destination":"/root/hello:/myvolume","Driver":"local","Mode":"","RW":true,"Propagation":""}]

所以我們只能手動輸入 Bind Mounts , 接下來做幾個簡單的測試

mkdir /binds && cd $_
touch myconfig

這邊跟 volume 的寫法一樣,不過 Bind Mounts 開頭需要是 host 檔案系統中的資料夾,不像 volume 開頭只需要指定 volume name

docker run -dit -v /binds:/hostmount alpine
docker attach f2ba
/ # ls
bin        etc        hostmount  media      opt        root       sbin       sys        usr
dev        home       lib        mnt        proc       run        srv        tmp        var
/ # cd hostmount/
/hostmount # ls
myconfig

Summary

今天比較了 VOLUME 與 Bind Mounts 兩者之間的差異, VOLUME 比較適合多個 container 互相讀寫之間的操作
例如一個後端 Api 與一個資料庫,在加上 VOLUME 會自動處理作業系統的問題性能也比較高
相對的 Bind Mounts 比較適合用來讀取設定檔這樣的情況,例如多個 Api 同時需要讀取同一份設定檔這樣就很適合使用 Bind Mounts 不過就是要手動處理文件路徑的問題