Skip to content

磁盘

-v 时本地目录不存在,Docker 会自动创建。

--mount 时本地目录不存在,Docker 会报错。

--mount 更规范、可读性高、生产推荐;-v 简单、适合临时测试或快速命令。

✨ Volume

匿名卷(Anonymous Volume)

sh
docker run -v /app/data myimage

👉 Docker 会在 /var/lib/docker/volumes/ 下生成一个随机目录。

命名卷(Named Volume)

https://vuepress.mirror.docker-practice.com/data_management/volume/

Volume 是特殊目录,它绕过 UFS,可以提供很多有用的特性。

  • Volume 可以共享重用
  • Volume 的修改会立刻生效
  • Volume 的更新不会影响镜像
  • Volume 会一直存在,即使容器被删除
sh
docker run -v my-vol:/app/data myimage

也可以主动创建

sh
docker volume create my-vol

绑定挂载(Bind Mount)

sh
docker run -v /opt/data:/app/data myimage

第一个是本地目录,第二个是容器目录。

常用命令

sh
# 创建一个卷
docker volume create mydata

# 查看卷列表
docker volume ls

# 查看卷详情
docker volume inspect mydata

# 删除卷
docker volume rm mydata

# 删除所有未使用的卷
docker volume prune

✨ Volume 迁移

未实践

busybox 是一个精简的 Linux 系统,它包含了很多常用的命令,比如 tar、gzip、gunzip 等。

导出

sh
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  busybox tar czvf /backup/mydata.tar.gz -C /data .

导入

sh
docker volume create mydata
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  busybox tar xzvf /backup/mydata.tar.gz -C /data

✨ mount

https://vuepress.mirror.docker-practice.com/data_management/bind-mounts/

指定挂载一个本地主机的目录到容器中。

注意示例中的:source

target 路径必须是绝对路径

具名挂载

sh
docker run -d \
  --name mydb \
  --mount type=volume,source=mydata,target=/var/lib/mysql \
  mysql:8

绑定挂载

sh
docker run -d \
  --name web \
  --mount type=bind,source=/opt/app,target=/usr/share/nginx/html \
  nginx:alpine

临时挂载

存内存中

sh
docker run -d \
  --name cache \
  --mount type=tmpfs,target=/app/cache \
  nginx:alpine

readonly

sh
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly

注意最后那个 readonly,只读。