Docker Volume 是個介於主機與容器間的共享資料夾,可用來匯入或匯出容器內的資料,或者共享容器間的資料
Usage:
- 在使用
docker create
或者docker run
指令時加上 -v 旗標,並且 -v 旗標可以同時下很多次 -
$ docker run -d -P --name web -v <host path>:<container path> training/webapp python app.py
- Read Only
-
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
當加上 ro 選項時,表示 Container 內的綁定目錄是唯讀
-
使用自定義的 volume
-
$ docker run -d -P --volume-driver=flocker -v my-named-volume:/opt/webapp --name web training/webapp python app.py #or $ docker volume create -d flocker --name my-named-volume -o size=20GB $ docker run -d -P -v my-named-volume:/opt/webapp --name web training/webapp python app.py
如果 -v 參數後面放的格式是 <volume name>:<container path> 的話,那 docker 會為我們建立一個 volume 並且放在
/var/lib/docker/volumes
底下,就跟我們只有指定 container 內的位置是一樣的 -
Creating and mounting a data volume container
-
新增一個被命名且帶有 volume 的 Container,雖然這 Container 內的應用程式並不會被執行
$ docker create -v /dbdata --name dbstore training/postgres /bin/true
然後我們就可以在啟動 Container 的時候使用
--volumes-from
參數將剛建立的 Data Volume Container 帶進去 -
$ docker run -d --volumes-from dbstore --name db1 training/postgres
並且還可以
-
$ docker run -d --name db2 --volumes-from db1 training/postgres
這樣子就能直接將某個 Container 所用到的 Volumes 直接套用在其他的 Container 上面了,並且共享 Container 間的資料
- Backup, restore, or migrate data volumes
-
這指令把 /dbdata 裡的東西打包後放在 backup 的資料夾內,並且因為 backup 資料夾與本機當前的目錄是連通的,所以在本機當前目錄也會取得備份檔
$ docker create -v /dbdata --name dbstore training/postgres /bin/true $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
這指令會讓資料復原回來
-
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
其實就是東西透過 Container 移來移去而已
-
Removing volumes
-
$ docker run --rm -v /foo -v awesome:/bar busybox top
因為有參數 --rm 的關係,所以當 busybox 因為不再運作而被自動刪除時本機對應到 Container 內 /foo 的 volume 也會自動被刪除,但是被命名為 awesome 的 volume 卻還會留著
-
如果已在執行的 Container 並沒有設定任何的 volume ,卻需要對容器內的資料進行匯入或匯出時該怎麼辦呢
使用 docker cp 指令就行了,例如: -
$ docker cp <Container Name or ID>:<Container Source Path> <Host Destination Path> #將 Container 的資料匯出
$ docker cp <Host Source Path> <Container Name or ID>:<Container Destination Path> #將資料匯入到 Container