docker compose v2命名卷和主机上的卷

docker compose v2命名卷和主机上的卷,docker,docker-compose,Docker,Docker Compose,我正在寻找关于如何以最干净的方式制作docker-compose.yml版本2的指南: 容器状态与容器明确分开 为了简单起见,已将容器状态装载到主机(单个数据点,只需在主机上备份/存储数据即可)。我对此持错误态度,请参见下面的问题) 该应用程序是一个经典的web应用程序,后端是mysql和redis数据库,其web服务器位于直接为静态资产提供服务的代理之后。一些细节,如取决于,环境变量和网络被有意忽略 以下是我目前使用的: version: "2" services: proxy:

我正在寻找关于如何以最干净的方式制作docker-compose.yml版本2的指南:

  • 容器状态与容器明确分开
  • 为了简单起见,已将容器状态装载到主机(单个数据点,只需在主机上备份/存储数据即可)。我对此持错误态度,请参见下面的问题)
该应用程序是一个经典的web应用程序,后端是mysql和redis数据库,其web服务器位于直接为静态资产提供服务的代理之后。一些细节,如
取决于
,环境变量和网络被有意忽略

以下是我目前使用的:

version: "2"
services:
  proxy:
    build:
      context: ./apps/nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data/web/assets:/var/www/assets:ro
      - ./data/web/puma:/var/run/puma
  web:
    build:
      context: ./apps/rails
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data/web/assets:/srv/app/public/assets
      - ./data/web/puma:/var/run/puma
  db:
    image: mysql:5.7
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data/mysql:/var/lib/mysql
  redis:
    image: redis
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data/redis:/data
以下是我计划在下一版本中使用的内容:

version: "2"
services:
  proxy:
    build:
      context: ./apps/nginx
    ports:
      - "80:80"
      - "443:443"
    volumes_from:
      - localtime
      - web-assets-data:ro
      - web-puma-data
  web:
    build:
      context: ./apps/rails
    volumes_from:
      - localtime
      - web-assets-data
      - web-puma-data
  db:
    image: mysql:5.7
    volumes_from:
      - localtime
      - db-data
  redis:
    image: redis
    volumes_from:
      - localtime
      - redis-data
  web-assets-data:
    image: ubuntu:14.04
    volumes:
      - ./data/web/assets:/srv/app/public/assets
  web-puma-data:
    image: ubuntu:14.04
    volumes:
      - ./data/web/puma:/var/run/puma
  db-data:
    image: ubuntu:14.04
    volumes:
      - ./data/mysql:/var/lib/mysql
  redis-data:
    image: ubuntu:14.04
    volumes:
      - ./data/redis:/data
  localtime:
    image: ubuntu:14.04
    volumes:
      - /etc/localtime:/etc/localtime:ro
我认为新版本的好处是:

  • 更清楚的是数据在哪里
  • 在多个容器之间共享数据更容易(无需像当前版本那样记住确切的路径)
因此,我的问题是:

  • 在容器及其容器数据之间使用不同的图像是否有问题?例如,
    db data
    应该使用
    mysql:5.7
    而不是
    ubuntu:14.04
  • 使用顶级
    volumes:
    键无法“将数据存储在主机上的特定路径”这样说是否正确
  • 使用命名卷(使用顶级“volumes”键)有哪些优点和不便之处?与主机装载相比,我更喜欢使用命名卷吗?工作流比较会很好
在容器及其容器数据之间使用不同的图像是否有问题

一点也不,这很正常

用顶级volumes:key来表示“数据存储在主机上的特定路径”是不正确的吗

对。顶级卷密钥用于命名卷,但不能命名主机卷

使用命名卷(使用顶级“volumes”键)有哪些优点和不便之处?与主机装载相比,我更喜欢使用命名卷吗?工作流比较会很好


命名卷允许您使用卷驱动程序,因此可以将数据存储在本地文件系统之外的其他位置。但是,命名卷需要使用数据进行初始化,因此您可能需要添加脚本或其他操作。

回答得很好。您能否详细介绍一下“但是命名的卷需要用数据初始化,因此您可能需要添加脚本或其他东西来完成初始化”部分?到目前为止,我目前的理解是Dockerfile VOLUME指令始终在此时装载映像中该路径上存在的数据的卷,而主机卷始终在容器中该路径上存在的数据上装载主机上的任何内容。这是正确的。已命名卷,但两者都不是。他们一开始是空的。我相信Docker1.11添加了一个类似的初始化,这样它们就会被第一个容器填充,这个容器使用路径上的数据,但我不完全确定它是如何工作的。