数据主要分为两类,持久化的与非持久化的。
持久化数据是需要保存的数据。例如客户信息、财务、预定、审计日志以及某些应用日志数据。非持久化数据是不需要保存的那些数据。
每个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》