Nginx反向代理到主机中的应用

时间:2018-06-21 20:24:19

标签: docker nginx go webserver reverse-proxy

我有一个应用程序在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;
        }
    }
}

当我尝试卷曲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中的“主机名”命令来获得计算机主机。

2 个答案:

答案 0 :(得分:3)

问题在于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. 现在,用此 ip_address:5000 替换Nginx conf文件中的 0.0.0.0:5000 。您将能够为您的应用程序提供服务

答案 1 :(得分:3)

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