有可能在同一台主机上运行多个nginx docker容器吗



是否可以仅使用docker compose在同一台主机上安装多个nginx容器,每个容器共享端口80?

我想整理一个在同一台主机上运行多个应用程序的系统。每个应用程序都由几个链接的docker容器组成,这些容器与一个docker compose文件绑定在一起,每个应用程序使用主机系统的nginx作为反向代理向世界公开。到目前为止,一切都很好。

每次我添加一个新的docker应用程序时,我都必须将该应用程序的一个新nginx.conf文件添加到主机nginx中,但我更喜欢将nginx配置与应用程序的docker compose文件捆绑为nginx容器,从而使每个应用程序在容器中干净地维护它所需要的一切。然而,每个nginx容器都需要在端口80上侦听,因此只有第一个可以绑定。主机nginx可以监听端口80上的几个web应用程序,但多个nginx实例可以做同样的事情吗?

更新:

所以这似乎不是完全可能的。目标是将尽可能多的特定于应用程序的nginx配置与应用程序捆绑在一起,所以我正在尝试一种解决方案,在该解决方案中,应用程序仍然使用该逻辑启动自己的nginx容器,而主机nginx只处理到应用程序nginx的url路由。不确定性能,但这大大减少了应用程序与主机的纠缠。

尽管已经过去几年了,我还是想为遇到这个问题的其他人回答一下。

不幸的是,没有。不可能在同一个端口上有多个集装箱。这是由于操作系统的性质。但我想我能理解你想做什么。你想拥有多个自定义的配置web应用程序。

最好的方法是通过反向代理。反向代理的作用是允许您将请求从主端口(如80和433)转发到其他端口或地址上的web服务器。假设您的所有容器中都有自己的Nginx实例(或任何其他web服务器)以及您的配置和代码。有两种方法可以做到这一点。

在docker中,最简单的方法是通过nginx代理项目。只需在docker compose中向环境中添加一个变量,托管nginx容器就会自动将您的请求转发到设置的站点。这似乎是你想要做的,因为它只需要一个码头工人组成。

你也可以自己处理。让你的所有站点都监听nginx中的其他端口,并让一个主nginx容器监听80和433,它使用你创建的反向代理将请求转发到另一个端口。

祝你好运!

这是一篇非常古老的帖子,但对于那些从搜索中获得的帖子,您可能可以在2023年使用以下组合配置:


version: "3"
services:
nginx:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80"

注意:


ports:
- "80"

这不是一个错误。docker compose应该使用虚拟端口分片,使用循环法将请求动态映射到正在运行的服务的每个实例,而不是典型的端口映射,例如80:80,只指定一个端口。因此,要运行三个实例,理论上应该能够做到这一点:

docker-compose up --scale nginx=3

这应该运行nginx的3个实例。如果您在撰写文件中定义了另一个服务,例如expressjs,您也可以通过使用一个简单的nginx配置来利用相同的策略,该配置使用docker的嵌入式动态dns。


# nginx.conf
user  nginx;

events {
worker_connections   1000;
}
http {
server {
listen 80;
location / {
proxy_pass http://expressjs:3000;
}
}
}

然后这样定义你的作文:


version: "3"

services:
expressjs:
image: expressjs:latest
ports:
- "3000"
depends_on:
- nginx
nginx:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80"

我还没有对此进行测试,但理论上应该是可行的。

参考:https://docs.docker.com/config/containers/container-networking/

最新更新