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

标签 docker docker-compose

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

  • 容器状态与容器明确分离。
  • 为了简单起见,将容器状态安装到主机(单个数据点,只需在主机上备份/数据即可完成)。我愿意承认错误,请参阅下面的问题)。

该应用程序是一个经典的 Web 应用程序,具有用于后端的 mysql 和 redis 数据库,以及位于直接提供静态 Assets 的代理后面的 Web 服务器。一些细节,如 depends_on、环境变量和网络被故意省略。

这是我目前使用的:

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: 键“将数据存储在主机上的特定路径”,这样说是否正确?
  • 使用命名卷(带有顶级“卷”键)有哪些优点和缺点?我应该更喜欢使用命名卷而不是主机挂载吗?工作流程比较会很好。

最佳答案

Is it problematic to use different images between the container and it's container-data

不,这很正常。

Is it correct to say that there's no way of having "data stored at a specific path on the host" with a top level volumes: key?

正确。顶级卷键用于命名卷,但您无法命名主机卷。

What are the advantages and inconveniences of using a named volume (with a top-level "volumes" key)? Should I prefer using a named volume over a host mount? Workflow comparisons would be nice.

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

关于docker-compose v2 命名卷和主机上的卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36722709/

相关文章:

c# - 运行 dotnet publish -c Release -o out 时,在 ASP.NET Core 项目中构建 Dockerfile 失败

selenium - 在本地 docker 管道上运行 nightwatch + selenium 的问题

python - 在 Docker 中使用 starlette 实现 SSL

python - (2002, "Can' t 通过套接字 '/var/run/mysqld/mysqld.sock' (2) 连接到本地 MySQL 服务器”)

mongodb - Docker 中的 Symfony 应用程序在 URL 调用中没有响应

docker - 无法使用ENTRYPOINT Docker运行script.sh

mysql - NodeJS和Sequelize在docker compose中无法连接到MySQL

docker - 如何从Docker容器重定向命令输出

Docker compose - 构建顺序,数据库在应用程序之前

linux - Bluemix 容器 - 如何拥有 Linux