存储
在 Docker 中管理数据
选择正确的安装类型
无论你选择使用哪种类型的挂载,容器内的数据看起来都是一样的。它显示为容器文件系统中的目录或单个文件。
直观地了解卷、绑定挂载和tmpfs
挂载之间的差异的一个简单方法是考虑数据在 Docker 主机上的位置。
卷
推荐使用。
-v
和--mount
行为之间的差异
与绑定挂载相反,卷的所有选项对于 --mount
和-v
标志均可用。
与服务一起使用的卷,仅支持--mount
。
mount语法:挂载的类型type
,可以是bind
、volume
或tmpfs
。
- 挂载的路径
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: