Docker 数据卷

87 阅读3分钟

Docker 数据卷

是什么

简单来说,数据卷是一个可供一个或多个容器使用的特殊目录,用于持久化数据以及共享容器间的数据,它以正常的文件或目录的形式存在于宿主机上。
另外,其生命周期独立于容器的生命周期,即当你删除容器时,数据卷并不会被删除。

数据卷特性

  • 可以在容器之间共享和重用;
  • 对数据卷的修改会立刻生效;
  • 更新数据卷不会影响镜像;
  • 数据卷默认一直存在,即使容器被删除;

挂载

Docker 提供了 3 种不同的方式将数据从宿主机挂载到容器中。

  • volume :Docker 管理宿主机文件系统的一部分,
    默认位于 /var/lib/docker/volumes 目录下, 也是最常用的方式。
  • bind mount :意为可以存储在宿主机中的任意位置。
  • tmpfs mount :挂载存储在宿主机的内存中,而不会写入宿主机的文件系统,一般不用此种方式。

使用

创建

 docker volume create test-vol

查看

docker volume inspect test-vol

运行容器时挂载

docker run -d -it --name=test-nginx -p 8011:80 -v test-vol:/usr/share/nginx/html nginx:1.13.12

# --mount
docker run -d -it --name=test-nginx -p 8011:80 --mount source=test-vol,target=/usr/share/nginx/html nginx:1.13.12

-v 和 --mount 有什么区别?

使用 -v 挂载时,如果宿主机上没有指定文件不会报错,会自动创建指定文件
当使用 --mount时,如果宿主机中没有这个文件会报错找不到指定文件,不会自动创建指定文件

删除

docker volume rm test-vol

bind mount 使用

# 通过 bind mount 模式可以挂载到宿主机的任意位置
docker run -d -it --name=test-nginx -p 8011:80 -v /docker/nginx1:/usr/share/nginx/html nginx:1.13.12

数据卷容器

数据卷容器,其实就是一个正常的 Docker 容器,专门用于提供数据卷供其他容器挂载的。

创建

# 数据卷容器并不需要处于运行状态,只需用于提供数据卷挂载即可。
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

挂载

--volumes-from 命令支持从另一个容器挂载容器中已创建好的数据卷。 docker rm -v 命令来指定同时删除关联的容器。

docker run -d --volumes-from dbdata --name db1 training/postgres

备份 & 恢复

  • 首先使用 --volumes-from 命令创建一个加载 dbdata 的容器卷容器,并将宿主机当前目录挂载到容器的 /backup 目录
  • 使用了 tar 命令来将 dbdata 数据卷备份为容器中 /backup/backup.tar 文件,因为挂载了的关系,宿主机的当前目录下也会生成 backup.tar 备份文件。
  • 如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
  • 然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。
  • 查看/验证: 再启动一个容器挂载同样的容器卷来查看