内容提要
一、Docker Volume 是什么
二、Docker Volumes 使用简介
三、Docker Volume containers 使用简介
四、备份、回复和迁移Docker Volumes
五、使用Docker Volume 注意事项
================================
1、Docker Volumes (数据卷)是什么
Volume可以使容器以及容器产生的数据分离开,这样当一个容器被删除时,其容器应用产生的数据不会被删除,而且该数据还可以被其他容器挂载和使用。数据卷的使用方便了用户对容器应用产生数据的管理。可以方便的进行查看、备份、数据共享等
Docker 引擎对Volume管理方式可以通过如下两种方式来进行:
- Docker Volumes (数据卷)
- Docker Volume containers(数据卷容器)
2、Docker Volumes 使用简介
数据卷是一个可供容器使用的特殊目录,它绕过文件系统(Union File System),可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会及时生效
- 对数据卷的更新不会影响镜像本身
- 即使容器本身没有启动,甚至容器本身被删除,数据卷会一直存在
- 数据卷被设计成保存数据,独立于容器的生命周期,因此,在删除容器时,Docker不会自动删除卷,也不会“垃圾回收”不再被容器引用的卷
2.1 添加数据卷
您可以使用 docker create 和 docker run 命令,加- v 参数将数据卷添加到容器中。
您还可以多次使用- v来挂载多个数据卷。
例如:下面的命令,将在web容器内创建一个新卷 /data
$ docker run -d -P --name web -v /data training/webapp
$ docker run -d -P --name web -v /data1 -v /data2 training/webapp
2.2 查找数据卷
您可以通过使用 docker inspect 命令来查看应用容器的卷。
$ docker inspect web
该命令输出容器配置的详细信息。输出类似于下面的内容:
...
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
...
2.3 将主机目录挂载为数据卷
$ docker run -d -P --name web -v /src/data:/data training/webapp
该命令将主机目录(/src/data)挂载到容器的/data目录中。如果路径/data已经存在于容器中,/src/data将覆盖,但不删除已存在的内容。一旦移除挂载,将再次访问内容。这与mount命令的预期行为一致。
3、Docker Volume containers 使用简介
如果您有一些持久数据,希望在容器之间共享,或者想在非持久性容器中使用,最好创建一个命名的数据卷容器,然后从它装载数据。下面我们创建一个新命名的容器,其中有一个数据卷用来共享。虽然这个容器不运行应用程序,但它重新使用了training/postgres映像,以便所有的容器都使用相同的层来保存数据,节省磁盘空间。
3.1 创建一个数据卷容器
$ docker create -v /dbdata --name dbstore training/postgres /bin/true
然后,您可以使用 --volumes-from 参数来在另一个容器中挂载/dbdata卷。
$ docker run -d --volumes-from dbstore --name db1 training/postgres
$ docker run -d --volumes-from dbstore --name db2 training/postgres
在本例中,如果postgres映像包含一个名为 /dbdata 的目录,那么从dbstore容器中安装卷将从postgres映像中隐藏 /dbdata文件。结果只有来自dbstore容器的文件是可见的。
您可以多次使用 --volumes-from 参数,将数据卷从多个容器中组合起来。
3.2 挂载数据卷
例如:
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
--volumes-from 参数从指定容器中装载所有已定义的卷。容器可以通过复用参数--volumes-from,容器ID可选后缀为:ro或:rw,分别以只读或读写模式装载该卷。默认情况下,卷将以相同的模式装载(读写或只读)作为引用容器。
4、备份、回复和迁移Docker Volumes
我们可以使用卷执行的另一个有用功能是用于备份、恢复或迁移。
您可以使用 --volumes-from 参数来创建一个新的容器来装载这个卷,比如这样:
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
在这里,您已经启动了一个新的容器,并从dbstore容器中安装了卷。然后将本地主机目录安装为/backup。然后,该命令使用tar将 dbdata 数据卷的内容备份到 /backup/backu.tar文件。当命令完成,容器停止时,我们将保留 dbdata卷的备份。
您可以将其恢复到相同的容器,或者您在其他地方所做的另一个容器。
创建一个新容器。
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
然后将备份文件从新容器的数据卷中解压。
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
您可以使用上面的技术来自动化备份、迁移和使用您的首选工具来恢复测试。
5 查看数据卷
您可以使用docker卷列出所有现有的卷。
$ docker volume ls
DRIVER VOLUME NAME
local ec75c47aa8b8c61fdabcf37f89dad44266841b99dc4b48261a4757e70357ec06
local f73e499de345187639cdf3c865d97f241216c2382fe5fa67555c64f258892128
local tmp_data
6 删除数据卷
在删除一个容器后,Docker数据量仍然存在。您可以创建命名或匿名卷。命名卷在容器外有一个特定的源形式,例如:awesome:/ bar。匿名卷没有特定的来源。当容器被删除时,您应该指导Docker引擎守护进程清除匿名卷。为此使用- rm选项,例如:
$ docker run --rm -v /foo -v awesome:/bar busybox top
这个命令创建一个匿名 /foo 卷。当容器被删除时,Docker引擎会删除/foo卷,但不是awesome卷。 删除所有未使用的卷和腾出空间
$ docker volume prune
它将删除与任何容器无关的所有未使用的卷。
7、使用 Docker Volume 注意事项
多个容器也可以共享一个或多个Volume。但是,多个容器写入单个共享卷可能导致数据损坏。所以请确保您的应用程序被设计成写入共享数据存储。
从Docker主机直接访问数据卷。这意味着您可以使用普通的Linux工具来读和写。在大多数情况下,您不应该这样做,因为如果您的容器和应用程序不知道您的直接访问,就会导致数据损坏。
本文主要是对 Docker官方文档https://docs.docker.com/engine/tutorials/dockervolumes/ 翻译