Docker学习笔记 — Docker Volume

Volume可以将容器以及容器产生的数据分离开来,这样当你删除容器的时候,才不会影响相关的数据。

注意:容器并不是为了持久化。

Volume的创建


Volume可以使用两种方式创建:
- 在Dockerfile中制定VOLUME /some/dir
- 执行Docker run -v /some/dir命令指定

Docker会在主机上创建一个目录,默认情况下是在/var/lib/docker下,然后将其挂载到指定的路径(/some/dir),当删除使用该Volume的容器时,Volume本身不会受到影响,可以一直保存下去。我们在主机上对/var/lib/docker目录的操作会同步到挂载该目录的容器中。

我们也可以使用-v参数来挂载指定的主机目录。例如:

$ docker run -v /opt/data:/data ubuntu

该命令将挂载主机的/opt/data目录到容器内的/data目录上,任何在/opt/data目录的文件都将会出现在容器内。这可以用来实现主机和容器之间的文件共享。

当容器中的指定的目录不存在的时候会自动创建,当已存在的时候,该目录下的文件并不会同步到主机上的Volume,然后Volume中的数据则会被复制到容器中。

Volume的删除


我们可以在删除容器的时候同时删除Volume。

$ docker rm -v my_container

不过如果当前有其他容器仍挂载该Volume时,其是不会被删除的。
因此,由于我们在删除一些容器的时候未加-v参数,导致主机的/var/lib/docker/vfs/dir目录下出现了一些僵尸目录和文件。

数据共享


我们可以在docker run的时候使用–volumes-from参数从一个容器中访问另一个容器的Volume。

$ docker run -it --name newcontainer --volumes-from container-test ubuntu /bin/bash

此时并不管容器container-test是否在运行。

数据容器


通常使用数据容器来持久化数据库和数据文件。

$ docker run --name dbdata mysql echo "data only"

创建了一个名为dbdata的数据容器,运行完echo之后就停止了。数据容器是不需要运行的,只要创建好了就可以了。

$ docker run -d --volumes-from dbdata --name db1 mysql

启动一个数据库服务容器,连接到dbdata数据容器上。

注意:
- 数据容器不需运行,纯粹是在浪费资源
- 不需为数据容器单独使用一个小的镜像,直接使用数据库镜像本身就可以了

数据备份


如果要备份MySQL数据库,我们需要备份数据容器中的/var/lib/mysql文件夹。

 $ docker run --rm --volumes-from dbdata -v $(pwd):/backup ubuntu tar zcvf /backup/mysql.tar.gz /var/lib/mysql

此时就会在当前目录下生成一个msql.tar.gz文件。


参考资料:
Docker入门实践 —— 深入理解Docker Volume

http://blog.csdn.net/wangtaoking1/article/details/46005741

猜你喜欢

转载自m635674608.iteye.com/blog/2335722