存储

在 Docker 中管理数据

选择正确的安装类型

无论你选择使用哪种类型的挂载,容器内的数据看起来都是一样的。它显示为容器文件系统中的目录或单个文件。

直观地了解卷、绑定挂载和tmpfs 挂载之间的差异的一个简单方法是考虑数据在 Docker 主机上的位置。

 

推荐使用。

-v--mount行为之间的差异

与绑定挂载相反,卷的所有选项对于 --mount-v标志均可用。

与服务一起使用的卷,仅支持--mount

mount语法:挂载的类型type,可以是bindvolumetmpfs

  • 挂载的路径source。对于绑定挂载,这是 Docker 守护进程主机上的文件或目录的路径。可以指定为source或 src
  • 目标将文件或目录装载在容器中的路径作为其值。可以指定为destination、dst或target。
docker run -d \  
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

 用于docker inspect devtest验证绑定挂载是否已正确创建。查找以下Mounts部分:

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"   #配置绑定传播
    }
],

绑定传播默认适用rprivate于绑定挂载和卷。它仅可针对绑定挂载进行配置,并且仅在 Linux 主机上进行配置。绑定传播是一个高级主题,许多用户永远不需要对其进行配置。

绑定传播是指在给定绑定挂载中创建的挂载是否可以传播到该挂载的副本。

传播设置描述
shared 原始挂载的子挂载会暴露给副本挂载,副本挂载的子挂载也会传播到原始挂载。
slave 类似于共享挂载,但只能在一个方向上。如果原始挂载公开了子挂载,则副本挂载可以看到它。但是,如果副本挂载公开了子挂载,则原始挂载看不到它。
private 该挂载是私有的。其中的子挂载不会暴露给副本挂载,副本挂载的子挂载也不会暴露给原始挂载。
rshared 与共享相同,但传播还扩展到嵌套在任何原始或副本挂载点内的挂载点。
rslave 与从属相同,但传播还扩展到嵌套在任何原始或副本挂载点内的挂载点。
rprivate 默认值。与 private 相同,意味着原始或副本挂载点中的任何挂载点都不会向任何方向传播。

创建和管理卷

与绑定挂载不同,您可以在任何容器范围之外创建和管理卷。

创建卷:

docker volume create my-vol

列出卷:

docker volume ls

local               my-vol

检查卷:

docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

删除卷:

docker volume rm my-vol

使用卷启动容器

如果您启动一个带有尚不存在的卷的容器,Docker 将为您创建该卷。

docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

用于docker inspect devtest验证 Docker 是否创建了卷并正确挂载。查找以下Mounts部分:

"Mounts": [
    {
        "Type": "volume",
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

这表明该挂载是一个卷,它显示了正确的源和目标,并且该挂载是可读写的。

停止容器并删除卷。注意,删除卷是一个单独的步骤。

docker container stop devtest

docker container rm devtest

docker volume rm myvol2

将卷与 Docker Compose 结合使用

下面的示例展示了一个带有卷的 Docker Compose 服务:

services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:

 

posted @ 2024-07-05 05:25  wongchaofan  阅读(1)  评论(0编辑  收藏  举报