Docker 持久化存储 Bind mounts
- Bind mounts 的 -v 与 --mount 区别
- 启动容器基于bind mount
- 挂载到容器中的非空目录
- 只读 bind mount
- compose 中使用 bind mount
官方文档:https://docs.docker.com/storage/bind-mounts/
Bind mounts 的 -v 与 --mount 区别
- 如果使用
-v
或--volume
绑定挂载 Docker主机上尚不存在的文件或目录,-v
将自动创建一个目录
。 - 如果使用
--mount
绑定挂载Docker主机上尚不存在的文件或目录,Docker不会自动创建它,而是会生成一个错误。
启动容器基于bind mount
- 启动容器基于
bind mount
--mount
docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app \ nginx:latest
-v
docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ nginx:latest
- 使用
docker inspect devtest
查看详情中的Mounts
部分。"Mounts": [ { "Type": "bind", "Source": "/tmp/source/target", "Destination": "/app", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
挂载到容器中的非空目录
- 如果将目录绑定挂载到容器上的非空目录中,则绑定挂载会遮挡该目录的现有内容。
- 益处:在不构建新镜像的情况下,测试应用程序的新版本。
- 弊处:如果将容器的
/usr
替换成主机上的/tmp
, 在大多数情况下,会导致容器无法正常启动。--mount
docker run -d \ -it \ --name broken-container \ --mount type=bind,source=/tmp,target=/usr \ nginx:latest docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "exec: \"nginx\": executable file not found in $PATH".
-v
docker run -d \ -it \ --name broken-container \ -v /tmp:/usr \ nginx:latest docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "exec: \"nginx\": executable file not found in $PATH".
容器已经创建但是未启动,用
docker container rm broken-container
删除。
只读 bind mount
- 创建
--mount
docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app,readonly \ nginx:latest
-v
docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app:ro \ nginx:latest
- 用
docker inspect devtest
查看详情Mounts
部分"Mounts": [ { "Type": "bind", "Source": "/tmp/source/target", "Destination": "/app", "Mode": "ro", "RW": false, "Propagation": "rprivate" } ],
compose 中使用 bind mount
version: "3.9"
services:
frontend:
image: node:lts
volumes:
- type: bind
source: ./static
target: /opt/app/static
volumes:
myapp: