我正在寻找关于如何以最干净的方式制作 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/