卷(Volume)是持久化容器数据的推荐方式,用于保存和管理 Docker 容器生成或使用的数据。与绑定挂载依赖宿主机目录结构和操作系统不同,卷完全由 Docker 自身管理,因此在跨环境使用时通常更稳定、更方便。
在 Docker Compose 中定义卷
下面是一个在 Docker Compose 服务中使用卷的基础示例:
version: “3.9”
services:
frontend:
image: node:lts
volumes:
– myapp:/home/node/app
volumes:
myapp:
当第一次执行 docker-compose up 时,这个卷会被自动创建。之后再次启动同一组服务时,Compose 会继续复用这个卷中的数据。
引用外部已存在的卷
除了让 Compose 自动创建卷,也可以先在 Compose 之外手动创建卷,再在配置文件中直接引用。
先创建卷:
docker volume create myapp
然后在 docker-compose.yml 中这样声明:
version: “3.9”
services:
frontend:
image: node:lts
volumes:
– myapp:/home/node/app
volumes:
myapp:
external: true
这样配置后,Compose 不会自行创建该卷,而是直接使用已经存在的外部卷。
使用卷启动服务时需要注意的事项
当服务启动并挂载卷后,每个服务容器默认使用自己的本地卷。如果采用的是 local 卷驱动,不同容器之间通常不能直接共享这些数据。不过,一些卷驱动支持共享存储,可以满足多实例之间的数据访问需求。
例如,某些云环境中的 Docker 存储方案可通过插件提供持久化和共享能力,从而更适合分布式部署场景。
示例:为服务副本挂载卷
下面的示例使用 Nginx 启动一个包含 4 个副本的服务,并为其挂载名为 myvol2 的本地卷:
docker service create -d
--replicas=4
--name devtest-service
--mount source=myvol2,target=/app
nginx:latest
创建完成后,可以使用以下命令检查服务是否正常运行:
docker service ps devtest-service
删除服务与删除卷是两个步骤
如果不再需要该服务,可以执行下面的命令将其删除:
docker service rm devtest-service
需要注意的是,删除服务只会停止并移除对应任务,不会自动删除已经创建的卷。卷的清理需要单独执行,这是为了避免误删仍然有价值的数据。
