前言
容器中管理数据主要有两种方式:
- 数据卷:容器内数据直接映射到本地主机环境
- 数据卷容器:使用特定容器维护数据卷
数据卷可以提供很多有用的特性:
- 数据卷可以在容器间共享和重用,容器间传递数据变得高效方便
- 对数据卷内数据的修改即刻生效,无论容器内操作还是本地操作
- 对数据卷的更新不会影响镜像,解耦了应用和数据
- 卷会一直存在,知道没有容器使用,可以安全卸载
在容器内创建一个数据卷
1 | docker run -d -P --name web -v /webapp training/webapp python app.py |
使用training/webapp 创建一个名为web的容器,在后台运行,自动映射到主机端口,创建一个数据卷挂载到容器的 /webapp 下,并执行app.py文件

可以看到 /webapp 的时间戳发生了变化
挂载一个主机目录作为数据卷
1 | docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py |
使用training/webapp 创建一个名为web的容器,在后台运行,自动映射到主机端口,加载主机的/src/webapp到容器的/opt/webapp 下,并执行app.py文件
挂载数据卷时,要使用绝对路径,如果目录不存在则会自动创建


可以在容器中看到在宿主机上新建的hello_world文件
挂载一个主机文件作为数据卷
1 | docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash |
使用centos镜像创建一个容器,当容器为退出状态时自动删除,加载本机的.bash_history 到容器的.bash_history 中
如果直接挂载一个文件到容器,使用文件编辑工具(vim ,sed等等)时,可能造成文件inode变化,造成报错


加载到容器中的文件仍能使用,但是和本机的文件不同步了(具体问题我也没有找到)
数据卷容器
数据卷容器也是一个容器,专门用来提供数据卷供其他容器挂载,使得多个容器间共享一些持续更新的数据



db1和db2 中都可以看到dbdata 创建的test文件
可以多次使用–volumes-from 参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷
1 | docker run -d --name db3 --volumes-from db1 training/postgres |
使用–volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态
删除了挂载的容器,数据卷并不会被自动删除挂载信息,数据卷信息会保存在/var/lib/docker/volumes下

利用数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷备份、恢复,以实现数据的迁移
备份
1 | docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar -cvf /backup/backup.tar /dbdata |
使用centos 镜像创建 ,根据数据卷容器dbdata来挂载数据卷,将本地当前目录挂载到容器worker的/backup,并将/dbdata 归档为/backup下的backup.tar

恢复
1 | docker run --volumes-from dbdata -v $(pwd):/backup --name backup centos tar-xvf /backup/backup.tar |

注意事项
挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。
可通过两种方式解决:
关闭selinux。
1 | 临时关闭:setenforce 0 |
以特权方式启动容器
1 | 指定--privileged参数 |