Docker容器一旦被刪除,容器自己對應的rootfs文件系統就會被刪除,容器中的全部數據也將隨之消失。
Docker提供了數據卷的方式來持久化容器產生的數據,經過數據卷,還能夠在容器之間共享數據。docker
建立容器時,經過-v參數能夠數據卷,-v參數的格式爲code
[host-dir]:[container-dir]:[rw|ro]
其中it
若是不指定host-dir,Docker也會在容器內部建立目錄io
$ docker run -it --rm -v /volume1 --name testbox busybox
在另外一個終端執行inspect命令能夠看到這種方式下,Docker會在Host的/var/lib/docker/volumes/目錄生成一個隨機的目錄來掛載/volume1。test
$ docker inspect -f {{.Mounts}} busybox
"Mounts": [ { "Type": "volume", "Name": "112e8ff579fcda26cd933ea37946bf7a9b53b0f2bf87382184731884990e2746", "Source": "/var/lib/docker/volumes/112e8ff579fcda26cd933ea37946bf7a9b53b0f2bf87382184731884990e2746/_data", "Destination": "/volume1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
也能夠掛載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仍是能夠修改的。file
# 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容器和其餘的容器testboxvf一、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》