Docker学习--数据卷Volumes

258 阅读2分钟

一、介绍

  数据卷是一个可供一个或多个容器使用的特殊容器,它有以下特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用


二、创建一个数据卷

  可以在使用docker run命令的时候添加-v参数来创建一个数据卷并挂载到容器里

docker run -d -P --name web -v /webapp training/webapp python app.py

  在Dockerfile中可以使用VOLUME来添加一个或者多个新的卷到容器中。


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

  可以使用-v参数指定挂载一个本地主机的目录到容器中

docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

  以上命令是加载主机的/src/webapp目录到容器的/opt/webapp目录,本地路径必须是绝对路径。

  Dockerfile中不支持这种做法,因为Dockerfile是为了移植和分享用的。

  Docker挂载的数据卷默认的读写的,可以通过:ro命令修改为只读

docker run -d -P --name web -v /srv/webapp:/opt/webapp:ro


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

  可以添加-v命令从主机挂载单个文件到容器中

docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

  这样就可以记录在容器中输入的命令。如果直接挂载一个文件,很多文件编辑工具,包括vi或者sed --in-place,可能会造成文件inode的改变,会导致报错误信息,所以最简单的办法就是直接挂载文件的父目录。


五、数据卷容器

  若需要将一些持续更新的数据需要在容器之间共享,那么可以创建数据卷容器,它是一个正常的容器,专门用来提供数据卷供其他容器挂载的。

1、创建数据卷容器

docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

2、挂载数据卷

  可以使用--volumes-from命令来挂载数据卷

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

  也可以通过其他已经挂载了数据卷的容器来挂载数据卷

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

3、删除数据卷

  必须在删除最后一个还挂载数据卷的容器时使用docker rm -v命令来同时删除关联的数据卷


六、利用数据卷容器来备份、恢复、迁移数据卷

1、备份

  可以使用tar命令来备份数据卷

docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

  上述命令中,会将dbdata卷备份为本地的/backup/backup.tar

2、恢复

  可以通过untar命令解压备份文件到挂载的容器卷中,假设现有一个数据卷容器dbdata2,

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