在容器中管理数据主要有两种方式
- 数据卷
- 数据卷容器
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过了UFS,可以提供很多很有用的特性
- 数据卷可以在容器间共享和重用
- 对数据卷的修改会马上生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用 数据卷的使用,类似于linux目录下或文件进行挂载
创建一个数据卷
在使用docker run命令的时候,使用-v来创建一个数据卷并挂载到容器里面,在一次run中多次使用可以挂载多个数据卷
如下则是创建一个web容器,并加载一个数据卷到容器的/webapp目录中
$sudo docker run -d -P --name web -v /webapp training/webapp ptyhon app.py
也可以挂载一个主机的目录到容器中去
$sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
这条命令指的是创建一个名为web的守护容器,把主机的src/webapp目录挂载到容器的/opt/webapp目录下,该容器执行的程序是app.py
数据卷也可以是一个文件
$sudo docker run -rm -it -v ~/.bash_history:/bash_history ....
数据卷权限
数据卷默认权限是可读写,如果想把权限改成只读,则把权限指定为ro
$sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
数据卷容器
如果我们有一些持续更新的数据需要在容器间共享,最好创建数据卷容器。数据卷容器就是一个正常的容器,专门用来提供数据供其它容器挂载的。
创建一个数据卷容器dbdata
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container
在其它容器中使用 --volumes-from来挂载dbdata容器中的数据卷
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
一个数据卷容器可以被多个容器挂载,挂载的容器被删除后,数据卷容器不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着的容器时使用docker -rm -v 目录来指定同时删除关联的容器。这可以让用户在容器之间升级和移动数据卷。
备份
sudo docker run --volumes-from dbdata -v$(pwd):/backup tar cvf /backup/backup.tar
首先创建一个容器挂载dbdata数据卷,把当前路径挂载到容器的/backup,容器启动了就使用了tar命令来将dbdata卷备份为本地的/backup/backup.tar
恢复
首先创建一个带有数据卷的容器dbdata2
sudo docker run -v /dbdata --name dbdata2 /bin/bash
创建另一个容器,挂载dbdata2容器,并使用untar解压备份文件到挂载的容器卷中
sudo docker rn --volumes-from dbdata2 -v$(pwd):/backup busybox tar xvf /backup/backup.tar