数据卷与数据卷容器
容器的数据默认在容器删除后会被删除,如果对于像mysql、nginx等有数据持久性保存需求的场景可能会受影响,因此需要通过docker的数据卷功能提供数据持久性。
几个概念:
- 匿名卷
通过在Dockerfile文件中指定VOLUME指令
指定特定文件夹,会在docker默认文件夹下面生成一个对应的目录,在容器被删除后不会同时删除,可以保留数据,默认在/var/lib/docker/volumes下面。 - 数据卷
和匿名卷类似,在docker run
指令允许时指定特定目录或文件作为数据卷,使用-v
参数设置,可以设置多个。
# 下面示例通过-v添加两个数据卷/etc/nginx /usr/share/nginx
docker run -d --name nginx-test -v /etc/nginx/ -v /usr/share/nginx/ nginx:latest
# 可以通过docker volume ls 查看数据卷
local 22319ad2530b551601db046bcc8e07240b262fc04f1f0551bf96bd9e40c9d66f
local 322860276fceec7d895f2732d37ac49c7e7c9c15c3e6772e0a69c338819d1dd4
# 通过docker inspect 查看指定的数据卷
docker inspect 22319ad2530b551601db046bcc8e07240b262fc04f1f0551bf96bd9e40c9d66f
[
{
"CreatedAt": "2022-12-22T01:57:42-05:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/keli/docker/volumes/22319ad2530b551601db046bcc8e07240b262fc04f1f0551bf96bd9e40c9d66f/_data",
"Name": "22319ad2530b551601db046bcc8e07240b262fc04f1f0551bf96bd9e40c9d66f",
"Options": null,
"Scope": "local"
}
]
# 也可以通过docker inspect 容器名称查看容器的详细详细,里面的mount选项里面有对应的信息。在数据卷的数据会同步到容器内部,可以用于数据测试以及一些持续写入的情况。
上面生成的文件夹是一大串的名称,我们可以在创建容器时指定数据卷的名称。
# 可以在使用-v 参数自定义名称, -v 数据卷名称:容器目录
docker run -d --name nginx-volume1 -v config_dir:/etc/nginx/ -v front_dir:/usr/share/nginx/ nginx:latest
# 查看卷
[root@localhost volumes]# docker volume ls
DRIVER VOLUME NAME
local 22319ad2530b551601db046bcc8e07240b262fc04f1f0551bf96bd9e40c9d66f
local 322860276fceec7d895f2732d37ac49c7e7c9c15c3e6772e0a69c338819d1dd4
local config_dir
local front_dir
数据卷在容器被删除时不会自动删除,需要在docker rm 容器添加 -v参数
# 使用-v参数如果数据卷被其他容器调用删除失败
docker rm nginx -v
# 通过docker volume rm 数据卷名称删除
docker volume rm front_dir
# 通过docker volume prune删除无用数据卷,没有被使用的数据卷会删除
docker volume prune
在删除数据卷需要非常谨慎,毕竟数据无价。
对于需要保存数据的可以将本地目录挂载到容器里进行数据持久化,官方建议是不在容器内部存储层操作文件内容,只允许必要程序,实现轻量化和可扩展性。
挂载本地目录
另外对于需要主机和容器内部数据实现同步可以将目录进行挂载。也是在创建容器时通过-v
参数挂载本地目录对应容器内目录。这个好处是可以自定义目录,明确挂载路径。# 通过-v挂载目录 docker run -d -p 80:80 --name nginx-test -v /keli/nginx_config:/etc/nginx/ -v nginx_html:/usr/share/nginx/ nginx:latest # 上面命令允许之后会发现容器马上就停止了,然后查看日志,上面的情况是由于宿主机目录是空的,挂载到容器目录是有数据的,会覆盖掉容器内文件夹的数据,导致没有nging.conf容器主进程启动失败,但是我挂载html文件好像又可以,在实际情况下需要注意。 docker logs 容器名称
实践情况是对于一些静态资源或者原来是空的目录挂载到本地目录。会以宿主机目录为主进行同步似乎。
- 数据卷容器
就是将一个容器专门用于数据卷,供其他容器使用数据卷。
# 创建数据卷容器data_volumes,将容器内的/mnt目录挂载,如果目录不存在会自动创建,由于不是挂载本地目录因此数据卷在/var/lib/docker/volumes/xxx/_data下面
docker run -itd --name data_volumes -v /mnt centos:latest
# 创建另外一个容器test01,使用--volumes-from 数据卷容器名称来挂载,然后在子容器的/mnt就会和数据卷容器同步
docker run -itd --name test01 --volumes-from data_volumes centos:latest
# 通过挂载本地目录到容器内实现宿主机、数据卷容器、子容器三方同步,如果没有该目录会自动创建
docker run -itd --name data_volumes -v /keli/docker_volume/:/docker_volume centos:latest
# 子容器
docker run -itd --name test01 --volumes-from data_volumes centos:latest
通过数据卷容器可以让多个容器进行同步和挂载,对于一些情况下非常有用。
1 游客 2025-03-28 00:31 回复
555fulIdEqZ' OR 160=(SELECT 160 FROM PG_SLEEP(15))--
1 游客 2025-03-28 00:31 回复
555-1)) OR 58=(SELECT 58 FROM PG_SLEEP(15))--
1 游客 2025-03-28 00:31 回复
555-1) OR 13=(SELECT 13 FROM PG_SLEEP(15))--
1 游客 2025-03-28 00:31 回复
555-1 OR 475=(SELECT 475 FROM PG_SLEEP(15))--
1 游客 2025-03-28 00:30 回复
555
1 游客 2025-03-28 00:28 回复
555
1 游客 2025-03-28 00:27 回复
555