为何Docker Compose需同时配置服务内与全局volumes?能否仅用一种?
Docker Compose中服务内与全局Volumes配置的疑问解答
两种配置的核心区别
- 服务内部的
volumes配置:负责挂载映射——明确告诉容器“把某个卷挂到我内部的指定目录下”,是卷与容器之间的关联动作声明。 - 全局
volumes块:负责卷的定义与管理——在这里创建的是Docker的命名卷,属于持久化存储,容器删除后数据不会丢失;同时可以统一设置卷的属性(比如指定存储驱动、关联外部已存在的卷等),方便集中维护。
是否可以只用其中一种方式?
1. 只在服务内配置(不写全局volumes块)
完全可行。如果你在服务的volumes里直接写卷名:/容器路径,Docker Compose会自动帮你创建同名的命名卷,效果和全局配置的一致。但存在两个明显缺点:
- 没法对卷做自定义配置(比如设置
external: true关联已存在的外部卷); - 卷的定义分散在各个服务中,项目复杂时不利于统一梳理和维护。
比如把示例里的全局volumes块删掉,服务里的挂载依然能正常工作,Docker会自动创建那四个命名卷。
2. 只写全局volumes块(不在服务内配置)
这没有任何实际意义。全局配置只是在Docker系统中创建了卷,但没有把卷挂载到任何容器里,卷只会闲置着,不会被容器使用。
修正后的示例(含中文注释)
version: '2' services: drupal: image: drupal ports: - '8080:80' volumes: # 挂载全局卷到容器模块目录 - drupal-modules:/var/www/html/modules # 挂载全局卷到容器配置文件目录 - drupal-profiles:/var/www/html/profiles # 挂载全局卷到容器站点配置目录 - drupal-sites:/var/www/html/sites # 挂载全局卷到容器主题目录 - drupal-themes:/var/www/html/themes postgres: image: postgres environment: - POSTGRES_PASSWORD=mypasswd # 注意:环境变量的等号两边不要加空格,否则不生效 # 全局定义命名卷,可在此统一设置卷的属性(如驱动、外部关联等) volumes: drupal-modules: drupal-profiles: drupal-sites: drupal-themes:
内容的提问来源于stack exchange,提问作者Avv
相关产品推荐
相关产品推荐

