用户在使用Docker过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这样就涉及容器的数据管理操作。
数据管理包括
数据卷
数据卷容器
1.数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
数据卷可以在容器之间共享和重用。
对数据卷的修改会立刻生效
对数据卷的更新,不会影响镜像
卷会一直存在,直到没有容器使用
数据卷的使用类似Linux下对目录或文件进行mount操作。
一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
/var/lib/docker/volumes/html/_data
a.在容器内创建一个数据卷
docker run -v
使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到/webapp目录
docker run -d -P --name web -v /webapp training/webapp python app.py
b.挂载一个主机目录作为数据卷
加载主机/src/webapp目录到容器的/opt/webapp目录。目录必须是绝对路径,如果路径不存在Docker会自动创建,这样用户可以放置一些程序或数据到本地目录中,然后在容器内运行和使用。
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
数据卷挂载默认权限是读写,也可以进行指定更改,ro为只读
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp:ro python app.py
c.挂载一个本地文件作为数据卷
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
docker volume cretae 创建数据卷
docker volume ls 查看所有数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清除数据卷
-在执行docker run命令时,使用-v数据卷:容器内目录 可以完成数据卷挂载
-当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
docker run -d --name nginx -v html:/usr/share/nginx/html -p 8080:80 nginx
docker volume ls
docker volume inspect html
查看数据库是否有数据卷
docker inspect mysql
-在执行docker run命令时,使用-v本地目录:容器内目录 可以完成本地目录挂载
-本地目录必须以 / 或 ./开头,否则被识别成数据卷
基于宿主机目录实现数据目录、配置文件目录、初始化脚本的挂载
挂载/root/mysql/data到容器/var/lib/mysql 目录
挂载/root/mysql/init到容器/docker-entrypoint-initdb.d目录
挂载/root/mysql/conf到容器/etc/mysql/conf.d 目录
2.数据卷容器
如果用户需要在容器之间共享一些持续更新的文件,就是使用数据卷容器。
首先创建一个数据卷容器dbdata,并创建一个数据卷挂载到/dbdata
docker run -it -v /dbdata --name dbdata ubuntu
然后在其他容器中使用--volumes-form来挂载dbdata容器中的数据卷,比如创建db1和db2两个容器,并从dbdata挂载容器卷
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
此时容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器在任何一个该目录下的写入,其他容器都可以看到。
如果删除挂载的容器(包括dbdata,db1和db2)数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示使用docker rm -v命令来指定同时删除关联的容器。
使用数据卷容器可以让用户在容器之间自由升级和移动数据卷。
3.利用数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复、以及数据的迁移
a.备份
备份dbdata数据卷容器内的数据卷
docker run --volumes-from dbdata -v $(pwd):/backup \
--name work ubuntu tar cfv /backup/backup.tar /dbdata
首先利用ubuntu镜像创建了一个容器worker,使用--volumes-from dbdata,让worker容器挂载dbdata容器的数据卷(即dbdata数据卷);使用-v $(pwd):/backup 挂载本地的当前目录到worker容器的/backup目录。
容器启动后备份/dbdata下内容为容器内的/backup/backup.tar,即宿主机当前目录下的backup.tar。
b.恢复
首先创建一个带有数据卷的容器
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建一个新的容器,挂载dbdata2的容器,并使用tar解压备份文件到所挂载的容器卷中
docker run --volumes-from dbdata2 -v ${pwd}:/backup busybox tar xvf /backup/backup.tar