数据主要分为两类,持久化的与非持久化的。
两者都很重要,并且Docker均有对应的支持方式。每个Docker容器都有自己的非持久化存储。非持久化存储自动创建,从属于容器,生命周期与容器相同。这意味着删除容器也会删除全部非持久化数据。如果希望自己的容器数据保留下来(持久化),则需要将数据存储在卷上。卷与容器是解耦的,从而可以独立地创建并管理卷,并且卷并未与任意容器生命周期绑定。最终效果即用户可以删除一个关联了卷的容器,但是卷并不会被删除。
容器与非持久数据:容器擅长无状态和非持久化事务。每个容器都被自动分配了本地存储。默认情况下,这是容器全部文件和文件系统保存的地方。读者可能听过一些非持久存储相关的名称,如本地存储、GraphDriver存储以及SnapShotter存储。总之,非持久存储属于容器的一部分,并且与容器的生命周期一致——容器创建时会创建非持久化存储,同时该存储也会随容器的删除而删除
在Linux系统中,该存储的目录在/var/lib/docker/<storage-driver>/之下,
是容器的一部分。在Windows系统中位于C\ProgramData\Docker\windowsfilter\目录之下。
如果在生产环境中使用Linux运行Docker,需要确认当前存储驱动(GraphDriver)与Linux版本是否相符。
在容器中持久化数据的方式一般采用卷。
总体来说,用户创建卷,然后创建容器,接着将卷挂载到容器上。卷会挂载到容器文件系统的某个目录之下,任何写到该目录下的内容都会写到卷中。即使容器被删除,卷与其上面的数据仍然存在。
如图:
Docker卷挂载到容器的/code目录。任何写入/code目录的数据都会保存到卷当中,并且在容器删除后依然存在。
1.创建和管理容器卷
$ docker volume create myvol
默认情况下,Docker创建新卷时采用内置的local驱动。恰如其名,本地卷只能被所在节点的容器使用。使用-d参数可以指定不同的驱动。
第三方驱动可以通过插件方式接入。这些驱动提供了高级存储特性,并为Docker集成了外部存储系统
如图:
现在卷已经创建成功,读者可以通过docker volume ls命令进行查看,还可以使用docker volume inspect命令查看详情。
[root@open ~]# docker volume inspect myvol
[
{
"CreatedAt": "2023-06-26T15:05:15+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvol/_data",
"Name": "myvol",
"Options": {},
"Scope": "local"
}
]
Driver和Scope都是local。这意味着卷使用默认local驱动创建,只能用于当前Docker主机上的容器。Mountpoint属性说明卷位于Docker主机上的位置。在本例中卷位于Docker主机的/var/lib/docker/volumes/myvol/_data目录。在Windows Docker主机上对应内容为Mountpoint": "C:\ProgramData\Docker\ volumes\myvol\_data。
有两种方式删除Docker卷。
● docker volume prune。
● docker volume rm。
docker volume prune会删除未装入到某个容器或者服务的所有卷,所以谨慎使用!docker volume rm允许删除指定卷。两种删除命令都不能删除正在被容器或者服务使用的卷。
此外,还可以通过在Dockerfile中使用VOLUME指令的方式部署卷。具体的格式为VOLUME <container-mount-point。但是,在Dockerfile中无法指定主机目录。这是因为主机目录通常情况下是相对主机的一个目录,意味着这个目录在不同主机间会变化,并且可能导致构建失败。如果通过Dockerfile指定,那么每次部署时都需要指定主机目录。
卷在容器和服务中的使用
$ docker container run -dit --name voltainer \
--mount source=bizvol,target=/vol \
alpine
即使系统中没有叫作bizvol的卷,命令也应该能够成功运行。这里引出了很有意思的一点。
● 如果指定了已经存在的卷,Docker会使用该卷。
● 如果指定的卷不存在,Docker会创建一个卷。
卷与持久化数据——命令
● docker volume create命令用于创建新卷。默认情况下,新卷创建使用local驱动,但是可以通过-d参数来指定不同的驱动。
● docker volume ls会列出本地Docker主机上的全部卷。
● docker volume inspect用于查看卷的详细信息。可以使用该命令查看卷在Docker主机文件系统中的具体位置。
● docker volume prune会删除未被容器或者服务副本使用的全部卷。谨慎使用!
● docker volume rm删除未被使用的指定卷。
这里只是说明了本体卷的使用,还有在集群节点间共享存储等内容。