Skip to content

docker 默认并不会直接的持久化数据,因此当我们有对数据的持久化或者有在多个容器中共享数据时必然会涉及到对 docker 的数据的管理操作,而在容器中管理数据主要有一下两种方式,数据卷和数据卷容器。

数据卷

数据卷本质上是可供容器使用的特殊的目录,可以将主机上的目录直接的映射到容器之中,他的使用类似于 linux 的 mount 操作。

数据卷金额以提供很多有用的特性:

  1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得更高效。
  2. 由于数据卷使用的是映射,无论是在容器内的修改还是在容器外的修改都将会立即的生效。
  3. 对数据卷的更新不会影响镜像,从而解耦了应用和数据。
  4. 数据卷会一直的存在,直到没有容器使用,可以很安全的卸载他。

在容器内创建一个数据卷

在使用 docker run 命令的时候可以使用-v 标记在容器内创建一个数据卷,多次重读的使用-v 参数可以创建多个数据卷。

shell
docker run -d -p -name web -v /webapp training/webapp python app.py
# -p 的使用是为了暴露容器的端口,未指定端口是自动的随机映射本地的临时端口

挂载一个主机目录作为数据卷

shell
# 需要注意的是本地路径必须是绝对路径
docker run -d -p -name web -v /src/webapp:/opt/webapp training/webapp python app.py

# docker 数据卷的权限默认是 rw 也可以通过 ro 指定数据卷为只读。
docker run -d -p -name web -v /src/webapp:/opt/webapp training/webapp:ro python app.py

挂载一个本地主机文件作为数据卷

需要注意的是这种方式的使用可能会导致文件的 inode 信息的改变,在 docker1.1.0 版本后 docker 将对一个错误信息,所以推荐的是使用一个目录作为数据卷使用。

shell
docker run -d -p -v ~/.bash_history:/.bash_history ununtu /bin/bash

数据卷容器

数据卷容器也是一个容器,不同的是他是专门来提供数据卷供其他容器挂载使用的容器。当用户需要在多个容器之间共享一些持续更新的数据时,使用数据卷容器将是一个绝佳的选择。

  1. 创建一个数据卷容器 dbdata,并在其中创建一个数据卷挂载到 dbdata
shell
docker run -it -v /dbdata --name dbdata ubuntu
  1. 在其他容器中使用--volumes-from 来挂载 dbdata 容器中的数据卷。
shell
docker run -it -volumes-from dbdata --name db1 ubuntu
docker run -it -volumes-from dbdata --name db2 ubuntu

使用上述的命令之后,将在容器 db1 和 db2 中都挂载同一个数据卷到相同的 dbdata 目录。多次使用此命令可以挂在多个数据卷容器,

需要注意的是被挂载的数据卷容器并不需要保持运行状态,删除挂载了数据卷容器的容器时数据卷容器并不会被自动的删除,如果要删除被挂在其他容器的数据卷容器,需要在删除最后一个挂载了数据卷容器的容器时显式的使用 docker rm -v 命令来指定同时删除关联的容器。

使用数据卷容器来迁移数据

可以使用数据容器来镜像数据卷的备份和恢复已实现数据的迁移。

  1. 备份
shell
docker run  -volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
  1. 恢复
shell
docker run -v /dbdata --name dbdata2 unbuntu /bin/bash

docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar