Docker的数据持久化
非持久数据
每个容器都分配了本地存储。非持久数据属于容器的一部分,并且与容器的生命周期一致。
在Linux系统中,存储目录位于/var/lib/docker/<storage-driver>/下;
在Windows系统中,位于c:\ProgramData\Docker\windowsfilter\目录下。
持久化数据
卷
总体来说,用户创建卷,然后创建容器,接着把卷挂载到容器上。卷挂载到容器文件系统的某个目录之下。任何写到该目录下的内容都会写到卷中。即使容器删除,卷与其中的数据仍然存在。
创建和管理卷
$ docker volume create myvol
#创建了一个myvol卷默认情况下,Docker创建新卷时采用内置的local驱动。本地卷智能被所在节点的容器使用。-d参数可以指定不同的驱动。
第三方驱动可以通过插件方式接入。这些驱动提供了高级存储特性,并为Docker集成了外部存储系统。
查看卷信息
$ docker volume ls
#查看卷列表
$ docker volume inspect <volume name>
#查看卷详情inspect命令的输出内容
$ docker volume inspect myvol
[
{
"CreatedAt": "2018- 01- 12T12: 12: 10Z",
#卷创建时间
"Driver": "local",
#卷驱动,使用local驱动创建的卷位于/var/lib/docker/volume目录下。
"Labels": {},
#卷标签
"Mountpoint": "/var/ lib/ docker/ volumes/ myvol/_ data",
#容器内的挂载点
"Name": "myvol",
#卷名称
"Options": {},
"Scope": "local"
}
]
删除卷
$ docker volume prune
#谨慎使用!删除未装入容器或服务的所有卷
$ docker volume rm <volume name>
#删除指定卷在Dockerfile中部署卷
VOLUME <container-mount-point>在Dockerfile中无法指定主机目录。这是因为主机目录通常情况下是相对主机的一个目录,意味着这个目录在不同主机间会变化,并且可能导致构建失败。如果通过Dockerfile指定,那么每次部署时都需要指定主机目录。
实际应用
运行容器并挂载卷
$ docker container run -d -p 80:80 --name nginx --mount source=nginx_wwwroot,target=/usr/share/nginx/html nginx如果指定的卷不存在,Docker会自动创建一个卷。
尝试向卷内写入数据
$ docker container exec -it nginx sh
$ echo "the 1st web page" > /usr/share/nginx/html/index.html
#进入容器内,向nginx网站目录写入内容。访问nginx服务
使用浏览器访问nginx服务。可以看到网页内容。
在Docker主机中修改卷内容
默认的卷位置在/var/lib/docker/volume/<volume name>/_data中。
修改此目录中的文件,容器中的文件相应发生改变。