Docker的数据持久化
Docker的数据持久化
Docker的数据持久化主要有两种方式:
• bind mount
• volume
Docker的数据持久化即使数据不随着container的结束而结束,数据存在于宿主机上——要么存在于host的某个指定目录中(使用bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes下)。
1.bind mount
bind mount自docker早期便开始为人们使用了,用于将host机器的目录mount到container中。
但是bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。
这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
将host机器上当前目录下的/www目录mount到container中的/var/www/html目录:
# docker run -itd -v ./www:/var/www/html centos-apache:v1
有几点需要注意:
• host机器的目录路径必须为全路径(准确的说需要以/或~/开始的路径),不然docker会将其当做volume而不是bind mount处理
• 如果只指定一个目录, 则默认为container中的目录, docker会创建一个匿名volume并挂载到container中指定的目录
• 如果目录(不论哪边)不存在,docker会自动创建该目录
• 如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉
2.volume
volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的
docker下所有的volume都在host机器上的/var/lib/docker/volumes目录下
2-1.将名为mysql的volume挂载到container的/var/lib/mysql目录:
# docker run -itd --name mysql -v mysql:/var/lib/mysql/ centos-mariadb #运行容器时,如果mysql这个volume不存在,会自动创建
或
# docker run -itd --name mysql --mount 'src=mysql,dst=/var/lib/mysql' centos-mariadb (官方推荐)
# docker inspect mysql -f {{.Mounts}}
[{volume mysql /var/lib/docker/volumes/mysql/_data /var/lib/mysql local z true }] #绿色字为volume目录
当然,我们也可以提前创建此volume
volume管理:
语法: docker volume COMMAND
COMMANDS:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
2-2.如果我们运行容器的时候不指定volume, docker将为容器创建一个匿名卷挂载:
# docker run -itd --name mysql1 -v /var/lib/mysql/ centos-mariadb
# docker inspect mysql1 -f {{.Mounts}}
[{volume d42defbe40cf33517e6c5d72bcce613d80f01e0822f0dc8b723706e43421febc /var/lib/docker/volumes/d42defbe40cf33517e6c5d72bcce613d80f01e0822f0dc8b723706e43421febc/_data /var/lib/mysql local true }]
与bind mount不同的是
如果volume是空的而container中的目录有内容,那么docker会将container目录中的内容拷贝到volume中
如果volume中已经有内容,则会将container中的目录覆盖

浙公网安备 33010602011771号