Docker(8)---匿名卷(匿名挂载)和命名卷(具名挂载)

本文深入探讨Docker中匿名挂载与具名挂载的区别,包括如何使用两种挂载方式,以及它们对数据持久化的影响。通过具体示例,展示了命名卷如何在容器重启后保持数据,而匿名卷则随容器消失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是匿名挂载和具名挂载?

  所谓匿名挂载(匿名卷),即在进行数据卷挂载的时候不指定卷的名称,仅指定容器内的挂载路径。Docker会自动为其分配一个随机的卷名。
  而具名挂载(命名卷)则是在创建数据卷时显式指定卷的名称和容器内的挂载路径。

  先通过下面这种命令的方式感受一下两者的区别:

#匿名挂载(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01

#具名挂载(命名卷) -v 宿主机数据卷所在路径:容器数据卷所在路径
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01

  除此种方式之外,我们也可以在在dockerfile构建docker镜像的时候使用VOLUME保留字来对数据卷进行挂载,此种挂载方式会创建匿名卷,我们可以指定一个或多个数据卷路径:

VOLUME ["容器内数据卷路径1","容器内数据卷路径2"……]

由于匿名挂载的时候只是指定了容器内数据卷的路径,要查看该数据卷在宿主机上的实际位置,可以使用以下命令

# 查看当前正在运行的镜像容器id
docker ps

# 使用 inspect 查看镜像信息
docker inspect <container_id>

# 在输出信息中找到 "Mounts" 部分:
"Mounts": [
    {
        "Type": "volume",
        "Name": "随机生成的卷名",
        "Source": "/var/lib/docker/volumes/xxx/_data",
        "Destination": "/container/path",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

   从上面的 Mounts 中可以看到 Destination 和 Source 分别就是 容器内的数据卷 和 宿主机内的容器卷

2.匿名卷和命名卷的区别?

  命名卷的主要优势在于可以方便地在多个容器间共享和重用,并且便于管理和维护。由于有明确的名称,可以很容易地找到并管理这些数据卷。下面通过示例来展示具名卷的使用:

例:具名挂载示例

#1.查看目前的镜像
[root@privateCloud / ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB

#2.启动centos镜像并且使用具名挂载的方式进行数据卷挂载
[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e

#3.查看刚刚启动的容器id
[root@privateCloud / ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
48dece440eb3        470671670cac        "/bin/bash"         4 minutes ago       Up 4 minutes                            mycentos

#4.进入容器内部
[root@privateCloud / ]# docker exec -it 48dece440eb3 /bin/bash

#5.查看/usr/local/,发现多了一个 volume01文件夹
[root@48dece440eb3 /]# cd /usr/local/
[root@48dece440eb3 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  volume01

#6.创建一个测试文件
[root@48dece440eb3 local]# cd volume01/
[root@48dece440eb3 volume01]# touch file01.txt
[root@48dece440eb3 volume01]# echo "this file create in container" > file01.txt

#7.使用 ctrl+p+q 不停止容器退出

#8.进入宿主机挂载目录查看
[root@privateCloud ]# cd /home/centos_volume/
[root@privateCloud /home/centos_volume ]# cat file01.txt
this file create in container

匿名挂载示例:

#1.使用匿名挂载方式启动容器
[root@privateCloud /]# docker run -it -d --name mycentos2 -v /usr/local/data centos
175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f

#2.进入容器
[root@privateCloud /]# docker exec -it 175034d3759b /bin/bash

#3.在挂载目录创建测试文件
[root@175034d3759b /]# cd /usr/local/data/
[root@175034d3759b data]# echo "test anonymous volume" > file02.txt

#4.查看挂载信息
[root@privateCloud /]# docker inspect 175034d3759b

#5.在"Mounts"部分可以看到Docker自动分配的卷位置:
"Mounts": [
    {
        "Type": "volume",
        "Name": "随机生成的卷名",
        "Source": "/var/lib/docker/volumes/xxx/_data",
        "Destination": "/usr/local/data",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

需要注意的重要事项:

  1. 数据卷的生命周期:

    • 容器停止(stop)不会导致数据卷被删除
    • 容器删除(rm)默认也不会删除数据中
    • 只有显式使用 docker volume rm 命令或在创建容器时使用 --rm 参数,相应的数据卷才会被删除
  2. 常用的数据管理命令:

    # 查看所有数据卷
    docker volume ls
    
    # 查看数据卷详细信息
    docker volume inspect volume_name
    
    # 删除指定数据卷
    docker volume rm volume_name
    
    # 删除所有未使用的数据卷
    docker volume prune
    
  3. 数据卷的权限设置:

# 只读挂载
docker run -v volume_name:/container/path:ro

# 读写挂载(默认)
docker run -v volume_name:/container/path:rw
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值