Docker学习笔记 — Docker Volume

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

注意:容器并非为了持久化。web

Volume的建立


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

Docker会在主机上建立一个目录,默认状况下是在/var/lib/docker下,而后将其挂载到指定的路径(/some/dir),当删除使用该Volume的容器时,Volume自己不会受到影响,能够一直保存下去。咱们在主机上对/var/lib/docker目录的操做会同步到挂载该目录的容器中。docker

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

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

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

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

Volume的删除


咱们能够在删除容器的时候同时删除Volume。svg

$ docker rm -v my_container

不过若是当前有其余容器仍挂载该Volume时,其是不会被删除的。
所以,因为咱们在删除一些容器的时候未加-v参数,致使主机的/var/lib/docker/vfs/dir目录下出现了一些僵尸目录和文件。code

数据共享


咱们能够在docker run的时候使用–volumes-from参数从一个容器中访问另外一个容器的Volume。xml

$ 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