Docker 数据卷 Volume 说明和操作

2018-11-28 0 By admin

Docker 容器服务运行时,有“只读层”和“读写层”两个数据层。读写层在使用中存在“多容器间读写层数据无法共享”和“删除容器时,容器删除的数据将丢失”等缺点。为了解决这些问题,引入了数据卷(Volume)机制。

Volume是存在一个或多个容器中的特定目录或文件,以独立于联合文件系统的形式在宿主机中存在,并为数据的共享和持久化提供解决方式。
Docker 提供了Volumedriver接口,通过该接口可以为Docker容器提供不同的volume存储支持。当前官方默认实现了Local这种volumedriver,使用宿主机的文件系统为Docker容器提供Volume。

说明:Volume的生命周期是独立于容器的生命周期之外的,不随容器删除而删除。
数据卷不使用分层文件系统,这对经常读取和写入的数据很有利。

docker volume 常用命令

docker volume --help
Commands:
create 创建一个数据卷
inspect 打印一个或多个数据卷的详细信息
ls 列出所有数据卷
prune 删除所有未使用的数据卷
rm 删除一个或多个数据卷

数据卷操作

创建一个数据卷
docker volume create www-data
列出所有数据卷
docker volume ls
DRIVER VOLUME NAME
local www-data

查看数据卷在宿主机上的路径:
docker inspect www-data
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/www-data/_data",
"Name": "www-data",
"Options": {},
"Scope": "local"
}
]

注:每创建一个volume,docker会在/var/lib/docker/volumes/下创建一个子目录,默认情况下目录名是一串UUID。
如果指定了名称,则目录名是volume名称(例如上面的www-data)。volume里的数据都存储在这个子目录的_data目录下。
MountPoint 宿主机上的路径为/var/lib/docker/volumes/www-data/_data,数据卷的名称为www-data。
将数据卷挂载容器中
docker run --rm --name web -p 80:80 -v www-data:/usr/share/nginx/html:ro -d nginx
查看数据卷对应的宿主机上的目录
列出所有不被引用的数据卷
docker volume ls -f dangling=true
DRIVER VOLUME NAME
local www-data

删除所有不被使用的数据卷
docker volume prune
删除所有的数据卷
docker volume rm $(docker volume ls -q)
停止所有的容器
docker stop $(docker ps -a -q)
删除所有的容器
docker rm $(docker ps -a -q)
-q选项只打印容器id。

数据容器

数据容器是一类特殊的容器,它并不运行任何程序,只是用来保存数据,可以通过它让不同的容器可以共享数据。
创建一个数据容器:
docker create -v /dbdata --name dbstore busybox

通过–volumes-from 来挂载数据容器
docker run -it --volumes-from dbstore ubuntu /bin/bash

挂载完成后,你可以在容器中看到/dbdata目录,这里面的文件修改会保存回dbstore容器中。

备份与还原数据
运维的日常工作中通常少不了数据的备份,还原,迁移等操作。下面介绍如何在数据卷中进行上面的操作:
docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

我们通过–volumes-from挂载要备份的数据卷,-v挂载一个宿主机上要保存备份文件的路径,然后在容器里运行tar cvf /backup/backup.tar /dbdata保存/dbdata中的数据到/backup目录中,而/backup正好是我们前面挂载的宿主机上的路径,这样就把数据卷备份下来了。–rm选项表示备份完数据之后删除这个容器。

下面我们来介绍如何把备份数据还原到一个新的容器中: 首先我们启动一个新的容器:
docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

然后把备份数据还原到新的容器中
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
http://www.tricksofthetrades.net/2016/03/14/docker-data-volumes/