LOVEJOAN

文章 分类 评论
76 9 1453

站点介绍

人生是一场孤独的旅行,没有终点。。。

Docker数据卷与数据卷容器

chuck 2023-03-15 219 7条评论 Docker Docker

首页 / 正文

数据卷与数据卷容器

容器的数据默认在容器删除后会被删除,如果对于像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

通过数据卷容器可以让多个容器进行同步和挂载,对于一些情况下非常有用。

评论(7)

  1. 1 游客 2025-03-28 00:31 回复

    555fulIdEqZ' OR 160=(SELECT 160 FROM PG_SLEEP(15))--

  2. 1 游客 2025-03-28 00:31 回复

    555-1)) OR 58=(SELECT 58 FROM PG_SLEEP(15))--

  3. 1 游客 2025-03-28 00:31 回复

    555-1) OR 13=(SELECT 13 FROM PG_SLEEP(15))--

  4. 1 游客 2025-03-28 00:31 回复

    555-1 OR 475=(SELECT 475 FROM PG_SLEEP(15))--

  5. 1 游客 2025-03-28 00:30 回复

    555

  6. 1 游客 2025-03-28 00:28 回复

    555

  7. 1 游客 2025-03-28 00:27 回复

    555

热门文章

最新评论

  • 1

    555fulIdEqZ' OR 160=(SELECT 160 FROM PG_SLEEP(15))--

  • 1

    555-1)) OR 58=(SELECT 58 FROM PG_SLEEP(15))--

  • 1

    555-1) OR 13=(SELECT 13 FROM PG_SLEEP(15))--

  • 1

    555-1 OR 475=(SELECT 475 FROM PG_SLEEP(15))--

  • 1

    555

  • 1

    555

  • 1

    5554FobGRsu') OR 696=(SELECT 696 FROM PG_SLEEP(15))--

  • 1

    555C9F0upP1' OR 504=(SELECT 504 FROM PG_SLEEP(15))--

  • 1

    555

  • 1-1; waitfor delay '0:0:15' --

    555

日历

2025年05月

    123
45678910
11121314151617
18192021222324
25262728293031

文章目录