bingoogolapple / bingoogolapple.github.io

个人主页。同时也通过 Issues 记录学习笔记
http://www.bingoogolapple.cn
86 stars 19 forks source link

Docker 数据卷 #150

Open bingoogolapple opened 7 years ago

bingoogolapple commented 7 years ago

基础知识

如果本机中不存在 ~/datavolume 这个目录,或者容器中不存在 /data 这个目录,在 docker run 命令执行后会自动创建该目录

docker run -it --name tv1 -v ~/datavolume:/data bingoogolapple/bga-ubuntu

为数据卷添加访问权限。可以通过 docker inspect tv2 看到 Mounts 下的 RW 为 false

docker run -it --name tv2 -v ~/datavolume:/data:ro bingoogolapple/bga-ubuntu

Dockerfile 中通过 VOLUME 来指定数据卷,Dockerfile 中创建的数据卷不能映射到已经存在的本地文件目录中

FROM bingoogolapple/bga-ubuntu:latest
MAINTAINER bingoogolapple "bingoogolapple@gmail.com"
VOLUME ["/datavolume1","/datavolume2"]

docker build -t bga/tv .

运行同样镜像的不同容器创建的数据卷是不一样的

docker run -it --name tv3 bga/tv
docker run -it --name tv4 bga/tv

docker inspect -f {{.Mounts}} tv4
docker inspect -f {{.Mounts}} tv4
bingoogolapple commented 7 years ago

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器就叫做数据卷容器,数据卷容器可以不用运行 image

删除上一节中的所有容器,-v 参数表示同时删除容器对应的数据卷

docker rm -v $(docker ps -aq)

使用上一节中的 bga/tv 镜像来创建一个数据卷容器,里面包含了 /datavolume1 和 /datavolume2,并向其中各写入一个文件

➜  ~ docker run -it --name datacenter bga/tv
root@e2d5dba1b85c:/# touch /datavolume1/datacenter
root@e2d5dba1b85c:/# touch /datavolume2/datacenter

创建 tv1 容器,通过 --volumes-from 参数挂载 datacenter 这个数据卷容器,能看到 datacenter 中创建的文件,然后再各创建一个文件

➜  ~ docker run -it --name tv1 --volumes-from datacenter bingoogolapple/bga-ubuntu
root@a0ceefd8fc00:/# ls /datavolume1/
datacenter
root@a0ceefd8fc00:/# ls /datavolume2/
datacenter
root@a0ceefd8fc00:/# touch /datavolume1/tv1
root@a0ceefd8fc00:/# touch /datavolume2/tv1

创建 tv1 容器,通过 --volumes-from 参数挂载 datacenter 这个数据卷容器,能看到 datacenter 和 tv1 中创建的文件

➜  ~ docker run -it --name tv2 --volumes-from datacenter bingoogolapple/bga-ubuntu
root@cb0fdd92b4a9:/# ls /datavolume1/
datacenter  tv1
root@cb0fdd92b4a9:/# ls /datavolume2/
datacenter  tv1

通过 docker inspect 命令也能够看到他们是用的是相同的数据卷。使用数据卷容器来挂载数据卷时,在 inspect 信息中并不会直接反应数据卷容器的信息,而是直接返回了数据卷容器所挂载的数据卷目录

➜  ~ docker inspect -f {{.Mounts}} tv1
[{1f6a659a3d0c0720b9509fc202077251b44065791f55e120389e4b7219935a67 /var/lib/docker/volumes/1f6a659a3d0c0720b9509fc202077251b44065791f55e120389e4b7219935a67/_data /datavolume1 local  true } {645c26bb0c19dc718f1cd5c58259f07458e1e1953d631316a5a87acf9672ca2a /var/lib/docker/volumes/645c26bb0c19dc718f1cd5c58259f07458e1e1953d631316a5a87acf9672ca2a/_data /datavolume2 local  true }]
➜  ~ docker inspect -f {{.Mounts}} tv2
[{1f6a659a3d0c0720b9509fc202077251b44065791f55e120389e4b7219935a67 /var/lib/docker/volumes/1f6a659a3d0c0720b9509fc202077251b44065791f55e120389e4b7219935a67/_data /datavolume1 local  true } {645c26bb0c19dc718f1cd5c58259f07458e1e1953d631316a5a87acf9672ca2a /var/lib/docker/volumes/645c26bb0c19dc718f1cd5c58259f07458e1e1953d631316a5a87acf9672ca2a/_data /datavolume2 local  true }]
➜  ~ docker inspect -f {{.Mounts}} datacenter
[{1f6a659a3d0c0720b9509fc202077251b44065791f55e120389e4b7219935a67 /var/lib/docker/volumes/1f6a659a3d0c0720b9509fc202077251b44065791f55e120389e4b7219935a67/_data /datavolume1 local  true } {645c26bb0c19dc718f1cd5c58259f07458e1e1953d631316a5a87acf9672ca2a /var/lib/docker/volumes/645c26bb0c19dc718f1cd5c58259f07458e1e1953d631316a5a87acf9672ca2a/_data /datavolume2 local  true }]
bingoogolapple commented 7 years ago

数据卷的备份和还原

数据卷备份

image

➜  ~ docker run -it --name datacenter bga/tv
root@15d11ad3931b:/# touch /datavolume1/tv1
root@15d11ad3931b:/# touch /datavolume1/tv2
root@15d11ad3931b:/# touch /datavolume1/tv3
root@15d11ad3931b:/# exit
exit
➜  ~ docker run -it --name tv2 --volumes-from datacenter bingoogolapple/bga-ubuntu
root@f021f5386c9a:/# touch /datavolume1/haha1
root@f021f5386c9a:/# touch /datavolume1/haha2
root@f021f5386c9a:/# exit
exit
➜  ~ docker run --volumes-from tv2 -v ~/backup:/backup --name backup bingoogolapple/bga-ubuntu tar cvf /backup/tv2.tar /datavolume1
tar: Removing leading `/' from member names
/datavolume1/
/datavolume1/tv2
/datavolume1/tv1
/datavolume1/tv3
/datavolume1/haha2
/datavolume1/haha1
➜  ~ ls backup
tv2.tar
➜  ~ sudo tar xvf backup/tv2.tar -C backup
datavolume1/
datavolume1/tv2
datavolume1/tv1
datavolume1/tv3
datavolume1/haha2
datavolume1/haha1
➜  ~ ls backup/datavolume1
haha1  haha2  tv1  tv2  tv3

数据卷还原

➜  ~ ls ~/backup
tv2.tar
docker run --volumes-from tv2 -v ~/backup:/backup --name backup bingoogolapple/bga-ubuntu tar xvf /backup/tv2.tar -C /
datavolume1/
datavolume1/tv2
datavolume1/tv1
datavolume1/tv3
datavolume1/haha2
datavolume1/haha1
➜  ~ docker restart tv2
tv2
➜  ~ docker attach tv2
root@411d531e0646:/#
root@411d531e0646:/# ls /datavolume1/
haha1  haha2  tv1  tv2  tv3