【问题标题】:Nginx reverse proxy to an app in hostNginx 反向代理到主机中的应用程序
【发布时间】:2021-09-17 23:27:32
【问题描述】:

我有一个在 Docker 外部的 5000 端口上运行的应用程序。我正在尝试通过 Docker compose 在 nginx 中运行反向代理,但无法与主机的端口 5000 通信。在我的 docker-compose.yml 文件中:

ports:
  - 80:80
  - 443:443
  - 5000:5000

当我尝试运行它时,我得到:

ERROR: for nginx  Cannot start service nginx: driver failed programming external connectivity on endpoint nginx (374026a0d34c8b6b789dcd82d6aee6c4684b3201258cfbd3fb18623c4101): Error starting userland proxy: listen tcp 0.0.0.0:5000: bind: address already in use

如果我注释掉 - 5000:5000 我会得到:

[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream

如何从 Docker nginx 容器连接到主机中已经运行的应用程序?

编辑:

我的 nginx.conf 文件

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    upstream mysite {
        server 0.0.0.0:5000;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
        proxy_pass http://mysite;
        }
    }
}

当我尝试 curl localhost 时的响应是 502 Bad Gateway。应用程序本身和 curl 127.0.0.1:5000 从主机响应良好。

编辑 2: 我也尝试过solution found here,但我得到了nginx: [emerg] host not found in upstream "docker"。 Docker 是我主机的主机名。

编辑 3: 我的 docker-compose.yml

version: '3'
services:
  simple:
    build: ./simple
    container_name: simple
    ports:
      - 80:80
      - 443:443

我的 Dockerfile:

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]

编辑:

我正在通过 linux 中的“主机名”命令获取计算机主机。

【问题讨论】:

    标签: docker nginx go webserver reverse-proxy


    【解决方案1】:

    问题在于 0.0.0.0:5000。由于 Nginx 在 docker 内运行,它试图在 docker 机器内找到这个地址但失败了,因为 docker 内的 0.0.0.0:5000 上没有运行任何东西。

    所以为了解决这个问题

    1. 您需要给它一个它可以到达的地址。解决它需要你 首先在主机上的 0.0.0.0:5000 处运行您的应用程序,即您应该能够从浏览器在 0.0.0.0:5000 处打开您的应用程序。
    2. 找到你的 IP 地址。一旦你得到你的 IP 地址,你应该能够 通过 ip_address:5000. 打开您的应用程序,因为您的 docker 和主机共享同一个网络,因此也可以从 docker 访问此地址
    3. 现在,将 Nginx conf 文件中的 0.0.0.0:5000 替换为 ip_address:5000。您将能够为您的应用程序提供服务

    【讨论】:

      【解决方案2】:

      172.17.0.1 是主机上运行的 docker 容器可用的默认主机 ip。 只需在您的 nginx conf 文件中使用 172.17.0.1:5000 ,您应该能够连接到在容器外的主机上运行的应用程序。 我的 docker 版本是 19.03.12,我在其中进行了相同的测试。

      【讨论】:

        【解决方案3】:

        我需要使用不同的变量来访问主机容器:http://host.docker.internal

        注意:我在 Windows 主机上运行。不确定这是否重要。

        【讨论】:

          猜你喜欢
          • 2016-01-12
          • 2018-12-14
          • 2021-05-22
          • 2019-08-09
          • 2021-02-04
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多