使用 docker-compose 文件版本 3 优于 shell 脚本的优势?
Advantage of using docker-compose file version 3 over a shellscript?
我创建 docker-compose.yml 的最初原因是利用 build:
和 depends-on:
等功能制作一个构建所有文件的文件我的图像并在容器中运行它们。但是,我注意到版本
3 贬低了大部分这些功能,我很好奇为什么我会在构建 shellscript 时使用它。
这是我目前运行所有容器的 shellscript(我假设这是第 3 版 docker-compose 文件将替换的内容,如果我要使用它的话):
echo "Creating docker network net1"
docker network create net1
echo "Running api as a container with port 5000 exposed on net1"
docker run --name api_cntr --net net1 -d -p 5000:5000 api_img
echo "Running redis service with port 6379 exposed on net1"
docker run --name message_service --net net1 -p 6379:6379 -d redis
echo "Running celery worker on net1"
docker run --name celery_worker1 --net net1 -d celery_worker_img
echo "Running flower HUD on net1 with port 5555 exposed"
docker run --name flower_hud --net net1 -d -p 5555:5555 flower_hud_img
docker-swarm 是否依赖于使用堆栈?如果是这样,那么我可以看到 docker-compose 和堆栈的用途,但我似乎无法在线找到答案。我会使用第 3 版,因为它与 swarm 兼容,如果我读到的是真的,则与第 2 版不同。也许我完全忽略了 docker-compose 的要点,但就目前而言,我对它给 table.
带来的影响有点困惑
可读性
将您的示例 shell 脚本与相同的 YAML 版本进行比较:
services:
api_cntr:
image: api_img
network: net1
ports:
- 5000:5000
message_service:
image: redis
network: net1
ports:
- 6379:6379
celery_worker1:
image: celery_worker_img
network: net1
flower_hud:
image: flower_hud_img
network: net1
ports:
- 5555:5555
至少在我看来,通过阅读 YAML 确定应用程序的整体架构比通过阅读 shell 命令要容易得多。
清理
如果您使用 docker-compose,那么 运行ning docker-compose down
将停止并清理所有内容,删除网络等。要在您的 shell 脚本,你必须单独编写一个删除部分来停止和删除所有容器和网络。
多个继承YAML文件
在某些情况下,例如开发和测试,您可能希望拥有一个主 YAML 文件和另一个覆盖某些值的文件以供 dev/test 工作。
例如,我有一个应用程序,其中有 docker-compose.yml
和 docker-compose.dev.yml
。第一个包含我的应用程序的所有生产设置。但是 "dev" 版本的内容更有限。它使用相同的服务名称,但有一些不同。
- 将我的代码目录安装到容器中,覆盖图像中内置的代码版本
- 在外部公开 postgres 端口(因此我可以连接到它进行调试)- 这不会在生产中公开
- 使用另一个安装来伪造用户数据库,这样我就可以轻松地拥有一些测试用户,而无需连接到我的真实身份验证服务器以进行开发
通常该服务仅使用 docker-compose.yml
(在生产中)。但是当我做开发工作的时候,我运行是这样的:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
它将首先从docker-compose.yml
加载正常参数,然后再读取docker-compose.dev.yml
,并且仅覆盖在dev 文件中找到的参数。其他参数都从生产版本中保留下来。但我不需要两个完全独立的 YAML 文件,我可能需要在两个文件中更改相同的参数。
易于维护
我在最后几段中描述的所有内容 都可以 使用 shell 脚本完成。这样做只会增加工作量,而且可能更难维护,也更容易出错。
你可以让你的 shell 脚本读取配置文件等来简化它......但在某些时候你必须问你是否只是重新实现你自己的 docker 版本-撰写,以及这对您是否值得。
我创建 docker-compose.yml 的最初原因是利用 build:
和 depends-on:
等功能制作一个构建所有文件的文件我的图像并在容器中运行它们。但是,我注意到版本
3 贬低了大部分这些功能,我很好奇为什么我会在构建 shellscript 时使用它。
这是我目前运行所有容器的 shellscript(我假设这是第 3 版 docker-compose 文件将替换的内容,如果我要使用它的话):
echo "Creating docker network net1"
docker network create net1
echo "Running api as a container with port 5000 exposed on net1"
docker run --name api_cntr --net net1 -d -p 5000:5000 api_img
echo "Running redis service with port 6379 exposed on net1"
docker run --name message_service --net net1 -p 6379:6379 -d redis
echo "Running celery worker on net1"
docker run --name celery_worker1 --net net1 -d celery_worker_img
echo "Running flower HUD on net1 with port 5555 exposed"
docker run --name flower_hud --net net1 -d -p 5555:5555 flower_hud_img
docker-swarm 是否依赖于使用堆栈?如果是这样,那么我可以看到 docker-compose 和堆栈的用途,但我似乎无法在线找到答案。我会使用第 3 版,因为它与 swarm 兼容,如果我读到的是真的,则与第 2 版不同。也许我完全忽略了 docker-compose 的要点,但就目前而言,我对它给 table.
带来的影响有点困惑可读性
将您的示例 shell 脚本与相同的 YAML 版本进行比较:
services:
api_cntr:
image: api_img
network: net1
ports:
- 5000:5000
message_service:
image: redis
network: net1
ports:
- 6379:6379
celery_worker1:
image: celery_worker_img
network: net1
flower_hud:
image: flower_hud_img
network: net1
ports:
- 5555:5555
至少在我看来,通过阅读 YAML 确定应用程序的整体架构比通过阅读 shell 命令要容易得多。
清理
如果您使用 docker-compose,那么 运行ning docker-compose down
将停止并清理所有内容,删除网络等。要在您的 shell 脚本,你必须单独编写一个删除部分来停止和删除所有容器和网络。
多个继承YAML文件
在某些情况下,例如开发和测试,您可能希望拥有一个主 YAML 文件和另一个覆盖某些值的文件以供 dev/test 工作。
例如,我有一个应用程序,其中有 docker-compose.yml
和 docker-compose.dev.yml
。第一个包含我的应用程序的所有生产设置。但是 "dev" 版本的内容更有限。它使用相同的服务名称,但有一些不同。
- 将我的代码目录安装到容器中,覆盖图像中内置的代码版本
- 在外部公开 postgres 端口(因此我可以连接到它进行调试)- 这不会在生产中公开
- 使用另一个安装来伪造用户数据库,这样我就可以轻松地拥有一些测试用户,而无需连接到我的真实身份验证服务器以进行开发
通常该服务仅使用 docker-compose.yml
(在生产中)。但是当我做开发工作的时候,我运行是这样的:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
它将首先从docker-compose.yml
加载正常参数,然后再读取docker-compose.dev.yml
,并且仅覆盖在dev 文件中找到的参数。其他参数都从生产版本中保留下来。但我不需要两个完全独立的 YAML 文件,我可能需要在两个文件中更改相同的参数。
易于维护
我在最后几段中描述的所有内容 都可以 使用 shell 脚本完成。这样做只会增加工作量,而且可能更难维护,也更容易出错。
你可以让你的 shell 脚本读取配置文件等来简化它......但在某些时候你必须问你是否只是重新实现你自己的 docker 版本-撰写,以及这对您是否值得。