docker-数据卷

前言

容器中管理数据主要有两种方式:

  • 数据卷:容器内数据直接映射到本地主机环境
  • 数据卷容器:使用特定容器维护数据卷

数据卷可以提供很多有用的特性

  • 数据卷可以在容器间共享和重用,容器间传递数据变得高效方便
  • 对数据卷内数据的修改即刻生效,无论容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像,解耦了应用和数据
  • 卷会一直存在,知道没有容器使用,可以安全卸载

在容器内创建一个数据卷

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
2
临时关闭:setenforce 0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。

以特权方式启动容器

1
2
指定--privileged参数
docker run -it --privileged=true -v /test:/soft centos /usr/bin/init
------ end ------
0%