Docker基礎 3 資料卷

2021-10-03 10:41:00 字數 3279 閱讀 2889

docker容器一旦被刪除,容器本身對應的rootfs檔案系統就會被刪除,容器中的所有資料也將隨之消失。

docker提供了資料卷的方式來持久化容器產生的資料,通過資料卷,還可以在容器之間共享資料。

建立容器時,通過-v引數可以資料卷,-v引數的格式為

[host-dir]:[container-dir]:[rw|ro]
其中

如果不指定host-dir,docker也會在容器內部建立目錄

$ docker run -it --rm -v /volume1 --name testbox busybox
在另乙個終端執行inspect命令可以看到這種方式下,docker會在host的/var/lib/docker/volumes/目錄生成乙個隨機的目錄來掛載/volume1。

$ docker inspect -f } busybox
"mounts": [

],

也可以掛載host目錄作為容器的資料卷

docker run -it --rm -v /home/dotnet2/:/volume1 --name testbox busybox
這時會將host的/home/dotnet2/目錄掛載,對應容器的/volume1目錄,在目錄下執行ls可以看到同樣的內容。而且在不管在host還是容器內修改這個目錄中的內容,兩邊都可以生效。

在host修改

$ echo "hello v124"> testzzx.txt

在容器檢視

# cat testzzx.txt

# hello v124

掛載時通過ro變數,還可以設定目錄為唯讀

docker run -it --rm -v /home/dotnet2/:/volume1:ro --name testbox busybox
此時如果在容器內嘗試修改這個目錄中的內容會失敗,但在host還是可以修改的。

# echo "hello v125"> testzzx.txt

sh: can't create testzzx.txt: read-only file system

docker run -it --rm -v /home/dotnet2/testzzx.txt:/volume1 --name testbox busybox
此時容器內的volume1實際上是檔案,內容與testzzx.txt一樣。而如果這樣

docker run -it --rm -v /home/dotnet2/testzzx.txt:/volume1/testzzx.txt --name testbox busybox
docker才會在容器內部建立volume1目錄並在這個目錄下掛載testzzx.txt。

同掛載目錄一樣,也可以設定唯讀

docker run -it --rm -v /home/dotnet2/testzzx.txt:/volume1/testzzx.txt:ro --name testbox busybox
這種掛載host檔案的方式可用來在host與容器之間共享配置檔案,這樣只需在host修改配置,所有掛載的容器都會生效。

資料卷容器提供了一種在容器間共享資料的更強大的方式。

首先建立乙個命名的資料卷容器供其他容器掛載。

$ docker run -it --rm -v /volume1 --name testbox busybox
掛載容器使用–volumes-from引數

$ docker run -it --rm --volumes-from testbox --name testboxvf1 busybox
這個容器啟動後也可以看到volume1目錄,而且在資料卷容器的volume1進行的操作在testboxvf1容器可以即時生效。

可以同時使用多個–volumes-from引數,從多個容器掛載多個資料卷。

此外還可以從其他已經掛載容器卷的容器(如testboxvf1)掛載資料卷:

$ docker run -it --rm --volumes-from testboxvf1 --name testboxvf2 busybox
在容器testboxvf2內部也出現了volume1目錄,如果之前在資料卷容器或者testboxvf1新建了檔案,在這裡可以讀取、修改

如果刪除掛載了資料卷的容器(包括初始的testbox容器和其他的容器testboxvf1、testboxvf2),資料卷並不會被刪除。如果想刪除該資料卷,需要在刪除最後乙個引用該資料卷的時候呼叫docker rm -v顯式刪除資料卷。

除了docker容器資料的持久化,在使用資料卷容器時,還會面對資料的備份和恢復的問題。

備份資料卷可以通過這樣的方式:

$ docker run --volumes-from testbox -v $(pwd):/backup --name testboxbak busybox tar cvf /backup/backup.tar /volume1
這條命令會掛載資料卷容器,並將host當前目錄掛載為容器的backup目錄,然後使用tar命令將資料卷容器的volume1目錄壓縮放置到backup目錄下,這樣回到host後,就可以在當前目錄拿到backup.tar了。

恢復時可以直接恢復到原有容器或者其他任何容器。假設想把backup.tar的資料恢復到乙個新的資料卷容器testbox2,首先啟動testbox2:

$ docker run -it --rm -v /volume1 --name testbox2 busybox
然後開始恢復,下面這條命令會掛載資料卷容器,並將host當前目錄掛載為容器的volume2目錄,因為backup.tar在host的當前目錄,所以在容器中執行解壓操作時的路徑為/volume2/backup.tar,這樣就把解壓後的volume1目錄放在了在容器的根目錄,volume1也是資料卷容器的共享目錄,於是恢復完成。

$ docker run -it --rm --volumes-from testbox2 -v $(pwd):/volume2 --name testboxbak1 busybox tar xvf /volume2/backup.tar
參考資料

李金榜 尹燁 劉天斯 陳純 著 《循序漸進學docker》

Docker基礎 3 資料卷

docker容器一旦被刪除,容器本身對應的rootfs檔案系統就會被刪除,容器中的所有資料也將隨之消失。docker提供了資料卷的方式來持久化容器產生的資料,通過資料卷,還可以在容器之間共享資料。建立容器時,通過 v引數可以資料卷,v引數的格式為 host dir container dir rw ...

docker 資料卷 基礎篇

使用者在使用 docker 的過程中,往往需要能檢視容器內應用產生的資料,或者需要把容器內的資料進行備份,甚至多個容器之間進行資料的共享,這必然涉及容器的資料管理操作。容器中管理資料主要有兩種方式 資料卷 data volumes 資料卷容器 data volume containers 資料卷是乙...

Docker 資料卷 資料卷容器

一,概念解析 1,資料卷 資料卷就是在宿主中可以在容器之間進行共享和重用的一系列和檔案和資料夾,通過docker run v命令可以將資料卷掛載到對應的容器目錄空間,進行檔案讀取,容器卷特性如下 資料卷可以在容器之間共享和重用,容器間傳遞資料將變得高效方便 對資料卷內資料的修改會立馬生效,無論是容器...