原文鏈接:http://wyb0.com/posts/docker-volume/
0x00 為什么使用數(shù)據(jù)卷
Docker鏡像是由多個(gè)文件系統(tǒng)(只讀層)疊加而成的秧饮。
當(dāng)一個(gè)容器啟動(dòng)時(shí)Docker會加載只讀鏡像層并在其上添加一個(gè)讀寫層娇掏。
讀寫層中的修改在鏡像重新啟動(dòng)后會全部丟失。
在Docker中诈泼,只讀層及在頂部的讀寫層的組合被稱為Union File System(聯(lián)合文件系統(tǒng))魁袜。
如果想要保存數(shù)據(jù)污抬,則可以使用數(shù)據(jù)卷來在容器外面保存數(shù)據(jù)沐鼠,主要為如下兩種方式:
* 使用docker run運(yùn)行容器時(shí)指定數(shù)據(jù)卷
* 在Dockerfile中直接指定數(shù)據(jù)卷
0x01 docker run掛載Volume(使用-v參數(shù))
- 不指定主機(jī)目錄
#運(yùn)行完后容器中的根目錄下就會多個(gè)data文件夾,這個(gè)就是數(shù)據(jù)卷
$ docker run -itd --name v_test -v /data debian:jessie /bin/bash
root@d145e8c6f874:/# ls
bin data etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
root@d145e8c6f874:/# exit
exit
#查看數(shù)據(jù)卷的對應(yīng)位置哄褒,前者是宿主機(jī)的位置,后者是容器中的位置
$ docker inspect -f {{.Mounts}} v_test
[{volume 8f39f7de0f851e0bfbcfdd4561fbb20484f01f864ce00a159b09bdcdf743e068 /var/lib/docker/volumes/8f39f7de0f851e0bfbcfdd4561fbb20484f01f864ce00a159b09bdcdf743e068/_data /data local true }]
- 指定主機(jī)目錄(只能通過-v參數(shù)實(shí)現(xiàn)煌张,Dockerfile不行)
$ docker run -itd -v /home/var/docker_data:/data debian:jessie /bin/bash
root@d853c4ca7632:/# exit
exit
$ docker inspect -f {{.Mounts}} d853c4ca7632
[{bind /home/var/docker_data /data true rprivate}]
$ docker inspect -f {{.Mounts}} d853c4ca7632
[{bind /home/var/docker_data /data true rprivate}]
# 本機(jī)創(chuàng)建文件呐赡,容器中就會同時(shí)出現(xiàn)
#宿主機(jī)創(chuàng)建文件
$ sudo touch /var/lib/docker/volumes/8f39f7de0f851e0bfbcfdd4561fbb20484f01f864ceb09bdcdf743e068/_data/a.txt
#容器可以查看到文件同樣被創(chuàng)建
root@8e1ccd30fe33:/# ls data/
a.txt
0x02 通過Dockerfile聲明Volume
FROM debian:jessie VOLUME /data #之后的任何命令都不能更改Volume的任何東西
0x03 數(shù)據(jù)共享
使用--volumes-from參數(shù)項(xiàng)即可訪問另外一個(gè)容器的Volume。
因?yàn)閿?shù)據(jù)容器不啟動(dòng)也可以被其它容器訪問骏融,所以一般不推薦啟動(dòng)數(shù)據(jù)容器链嘀。
#啟動(dòng)一個(gè)容器,使用v_test這個(gè)容器的數(shù)據(jù)卷档玻,v_test沒有啟動(dòng)怀泊,但依然有data這個(gè)數(shù)據(jù)卷
$ docker run -itd --volumes-from v_test debian:jessie /bin/bash
root@65aedf9c2ee1:/# ls
bin data etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
root@65aedf9c2ee1:/# exit
exit
#可以看下65aedf9c2ee1這個(gè)容器的數(shù)據(jù)卷和v_test數(shù)據(jù)卷在宿主機(jī)對應(yīng)的是同一個(gè)文件夾
$ docker inspect -f {{.Mounts}} 65aedf9c2ee1
[{volume 8f39f7de0f851e0bfbcfdd4561fbb20484f01f864ce00a159b09bdcdf743e068 /var/lib/docker/volumes/8f39f7de0f851e0bfbcfdd4561fbb20484f01f864ce00a159b09bdcdf743e068/_data /data local true }]
0x04 刪除Volumes
docker rm -v d145e8c6f874 #刪除容器時(shí)一起刪除數(shù)據(jù)