docker - 如何在同一台机器上使用 docker 为一个项目托管多个环境?
问题描述
我有一个由 ++ 组件组成的典型nginx
Webdjango
堆栈database
。
我已经将它们设置在不同的 docker 容器中,docker-compose
并且运行良好。
services:
billing_app_dev:
image: jameslin/billing_app:latest
expose:
- 8000
billing_postgres:
image: postgres:10.5
restart: always
volumes:
- pg_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
billing_nginx:
image: jameslin/billing_nginx:${TAG}
volumes:
- app_files:/static
links:
- 'billing_app'
ports:
- 80:80
现在我想知道如何在一台机器上设置DEV
和QA
环境。我可以更改django
和database
容器来监听不同的端口,但看起来我不能nginx
单独运行容器,因为端口 80 只能被一个容器监听。
我将不得不nginx
为这两个看起来不太干净的环境共享容器。
如果无法运行 2 个虚拟机,是否有更好的想法?
解决方案
我有 3 个 apache 容器和 1 个 nginx 在同一台服务器上运行,所以很确定这不是问题。
对于每个 webserver + 数据库堆栈,我有一个不同的 docker-compose 文件,这样 docker 将为每个堆栈创建不同的网络,避免同时端口可能出现的问题,并且您只需将您的 nginx 绑定到您的不同端口服务器,因为,您只能将一项服务绑定到一个端口。尽管如此,每个容器都是一个独立的“机器”,所以即使在同一个网络上,它们也可以使用同一个端口。
如果您确实需要在服务器的端口 80 和 443 中运行所有服务,可能需要在这些端口中运行 nginx,例如在内部 docker 网络中调用这些服务的反向代理,这是一个选项,但我从不在通过 docker 内部网络之前尝试一下。
推荐阅读
- php - 防止将空字符串保存到数据库
- javascript - 在选择日期选择器值上动态显示 Morrise.js 悬停标签
- python - 从数组值中过滤字典
- amazon-web-services - 使用 Terraform for ECS 在 CloudWatch 中包含退出代码 1 事件
- javascript - Chrome 和 Edge 在选中时以不同方式处理设置为“不确定”的复选框
- c# - 如何在扩展方法中使用 automapper 实例 api
- c# - 将二维数组的索引 [0,0] 作为参数传递给设置字母“O”或“X”的方法
- angular - Angular(6)路由问题
- vue.js - 我可以向 v-for 发送不仅仅是使用 v-model 的值吗
- javascript - 如何在我的 javascript 代码中找到未履行的承诺?