互联网技术 / 互联网资讯 · 2024年1月4日

Docker Compose 中卷的使用方法

卷(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

需要注意的是,删除服务只会停止并移除对应任务,不会自动删除已经创建的卷。卷的清理需要单独执行,这是为了避免误删仍然有价值的数据。