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
不過就是要手動處理文件路徑的問題