Skip to content

Menu
Menu

docker 卷与持久化数据

Posted on 2022年4月3日2022年7月5日 by zhezimi

数据主要分为两类,持久化的与非持久化的。

持久化数据是需要保存的数据。例如客户信息、财务、预定、审计日志以及某些应用日志数据。非持久化数据是不需要保存的那些数据。

每个Docker容器都有自己的非持久化存储。非持久化存储自动创建,从属于容器,生命周期与容器相同。这意味着删除容器也会删除全部非持久化数据。

如果希望自己的容器数据保留下来(持久化),则需要将数据存储在卷上。卷与容器是解耦的,从而可以独立地创建并管理卷,并且卷并未与任意容器生命周期绑定。最终效果即用户可以删除一个关联了卷的容器,但是卷并不会被删除。

在容器中持久化数据的方式推荐采用卷。

总体来说,用户创建卷,然后创建容器,接着将卷挂载到容器上。卷会挂载到容器文件系统的某个目录之下,任何写到该目录下的内容都会写到卷中。即使容器被删除,卷与其上面的数据仍然存在。

创建

我们先查看当前创建的卷列表

[root@iZuf665e8cwt048g1o6nfuZ ~]# docker volume ls
DRIVER VOLUME NAME

从上面可以看到,我们当前一个卷都没有,那么我们可以用以下命令创建一个卷

[root@iZuf665e8cwt048g1o6nfuZ ~]# docker volume create my_volume
my_volume

这时候我们就可以看到刚才创建的卷了。

[root@iZuf665e8cwt048g1o6nfuZ ~]# docker volume ls
DRIVER VOLUME NAME
local my_volume

删除

  • docker volume prune。
  • docker volume rm

docker volume prune会删除未装入到某个容器或者服务的所有卷,所以谨慎使用!

docker volume rm允许删除指定卷。两种删除命令都不能删除正在被容器或者服务使用的卷。

启动一个包含卷的容器

如果您使用尚不存在的卷启动容器,Docker 会为您创建卷。以下示例将卷bizvol 挂载到容器中的 /vol 中。

[root@iZuf665e8cwt048g1o6nfuZ _data]# docker container run -dit –name voltainer –mount source=bizvol,target=/vol alpine
Unable to find image ‘alpine:latest’ locally
latest: Pulling from library/alpine
40e059520d19: Pull complete
Digest: sha256:f22945d45ee2eb4dd463ed5a431d9f04fcd80ca768bb1acf898d91ce51f7bf04
Status: Downloaded newer image for alpine:latest
780689563b37f699119c70398494be85b2911a3ef8d9d2a8b6ec8fd9e609dac4

使用 docker inspect bizvol 验证卷是否已正确创建和安装。 查找Mounts部分:

[root@iZuf665e8cwt048g1o6nfuZ _data]# docker volume inspect bizvol
[
{
“CreatedAt”: “2022-04-03T09:36:33+08:00”,
“Driver”: “local”,
“Labels”: null,
“Mountpoint”: “/var/lib/docker/volumes/bizvol/_data”,
“Name”: “bizvol”,
“Options”: null,
“Scope”: “local”
}
]

我们可以看到Driver和Scope都是local。这意味着卷使用默认local驱动创建,只能用于当前Docker主机上的容器。Mountpoint属性说明卷位于Docker主机上的位置。

我们查看下Mountpoint文件下有没有数据

[root@iZuf665e8cwt048g1o6nfuZ _data]# ls -l /var/lib/docker/volumes/my_volume/_data/
total 0

尽管容器和卷各自拥有独立的生命周期,Docker也不允许删除正在被容器使用的卷。

[root@iZuf665e8cwt048g1o6nfuZ _data]# docker volume rm bizvol
Error response from daemon: remove bizvol: volume is in use – [780689563b37f699119c70398494be85b2911a3ef8d9d2a8b6ec8fd9e609dac4

下面我们开始执行exec连接到容器并向卷中写入一部分数据,例如向vol目录下面创建file1文件,内容是test

[root@iZuf665e8cwt048g1o6nfuZ _data]# docker container exec -it voltainer sh

/ # cd /vol/
/vol # ls -l
total 0
/vol # echo “test” > /vol/file1
/vol # ls -l
total 4
-rw-r–r– 1 root root 5 Apr 3 01:36 file1
/vol # exit

接下来我们把容器删除掉,看下数据和卷还在不在

[root@iZuf665e8cwt048g1o6nfuZ _data]# docker container rm voltainer -f
voltainer

我们可以看到卷是存在的

[root@iZuf665e8cwt048g1o6nfuZ _data]# docker volume inspect bizvol
[
{
“CreatedAt”: “2022-04-03T09:36:33+08:00”,
“Driver”: “local”,
“Labels”: null,
“Mountpoint”: “/var/lib/docker/volumes/bizvol/_data”,
“Name”: “bizvol”,
“Options”: null,
“Scope”: “local”
}
]

我们可以看到file1也还是存在的

[root@iZuf665e8cwt048g1o6nfuZ _data]# cat /var/lib/docker/volumes/bizvol/_data/file1
test

参考资料

《深入浅出Docker》

https://docs.docker.com/storage/

相关文章

  • docker bridge网络

  • docker镜像

  • docker容器

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

近期文章

  • 排查网络故障常用命令
  • PHP-FPM异常问题
  • RabbitMQ 1:介绍
  • 观察者模式
  • 装饰者模式

近期评论

没有评论可显示。

分类

  • cdn
  • css
  • docker
  • git
  • http
  • javascript
  • linux
  • mysql
  • nginx
  • php
  • RabbitMQ
  • 代码规范
  • 性能
  • 正则表达式
  • 网络协议
  • 设计模式
© 2025 | Powered by Minimalist Blog WordPress Theme