Volumes 分为匿名和命名两种。匿名 Volumes 在容器创建时被创建,在删除时会自动删除,而命名 Volumes 会始终存在,即是容器被删除,新创建的容器也可以访问对应的 Volumes。

Docker 会自行管理Volumes在主机上存储位置,并且不能被直接访问。

ls 列出所有 Volumes

docker volume ls

其中为名称为hash64的是匿名Volume,有名字的就是命名 Volume,而 bind mounts 并不会显示在上面,因为其就在本机目录中存储,不被docker管理。

添加命名 Volumes

在 Dockerfile 中只能添加匿名 Volumes,需要在 docker run 中加入 -v 参数才行:

docker run -v feedback:/app/feedback feedback-app

会创建一个名称为 feedback 且存储在容器内 /app/feedback 的 Volume。

设置匿名 Volume

docker run -v /app/feedback feedback-app

会创建一个对应容器内 /app/feedback 的匿名 volume,在容器删除时自动删除。

使用匿名 Volume 来保留依赖避免被绑定清除

使用 bind mounts 特性 来绑定项目文件到容器以便于热修改时不需要重新构建镜像时,会出现在已经安装的依赖被本机目录覆盖而丢失,故可以通过新建一个依赖对应的匿名 volume 来存储。

docker run -v "E:\Study\docker\dockerLearning:/app" -v /app/node_modules feedback-app

由于 docker run 中对于 volume 的应用是路径深的优先级高,故在 覆盖前就将容器内的内容给复制到对应的 volume 中由 docker 管理。