Nginx docker容器不会代理Web应用程序容器

时间:2017-11-12 07:08:24

标签: docker nginx networking reverse-proxy ports

我有一个运行Web应用程序的docker容器和一个运行Nginx的docker容器:ubuntu。

Web应用程序容器在port:3000上运行并暴露在外面(浏览器连接到主机的ip at port:3000访问应用程序)

Nginx容器在端口80上运行,可从连接到主机ip的浏览器访问

Nginx容器和Web应用程序都连接到同一个Docker网桥。我可以在它的内部IP(172.21.0.2)上停靠exec -it(nginx)bash和ping(web-app),反之亦然。我也可以从两个容器外部使用nmap,看看(nginx)的内部IP为80的开放端口,应用程序的开放端口为3000.

什么没有破坏:

Nginx安装正确,可能没有正确配置。 Web应用程序正常运行,但遗憾的是无法重新配置以适应Nginx。

我尝试了什么:

通过docker-compose.yml,dockerfile,空容器> bash和手动apt-get install nginx安装nginx。

由于应用程序图像的细节,我不能在一个docker-compose文件中包含web应用程序和nginx(并修复网络问题)(图像实际上是一个node.js容器,并且有一个子服务app)所以试图在两个docker-compose.yml中包含两个服务只会导致compose创建nginx和一个app-less node.js容器。

我想做什么:

通过dockerfile和docker run命令创建一个nginx容器(以支持可伸缩性),通过它们都连接到的docker网络代理已经运行的app容器。我希望nginx在端口80上侦听,并将其路由到端口3000的容器。我很困惑,是;在nginx.conf文件中,我将它路由到容器的内部ip为172.21.0.2:3000,(hostIP):3000,Localhost:3000还是0.0.0.0:3000?我的文件如下:

Dockerfile:

FROM xqdocker/ubuntu-nginx

COPY nginx.conf /etc/nginx/nginx.conf ##.confd IS LOCAL TO DOCKERFILE

nginx.conf:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream docker-nginx {
        server 172.21.0.2:3000; #WHAT DO I PUT HERE??
    }


    server {
        listen 80;

        location / {
            proxy_pass         http://docker-nginx;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }


}

docker run命令:

$ docker build -t reverseproxy
$ docker run --name nginx_proxy -p 80:80 -d reverseproxy
$ docker network connect nginx_app_bridge <nginx_proxy container ID>

请注意,应用的docker-compose文件指定了nginx_app_bridge网络。 docker network inspect nginx_app_bridge列出了172.21.0.2(app)和172.21.0.3(nginx)的2个连接容器

所以我想知道的是,如果两个容器都正常运行,可以从外面看到,可以看到对方,并且在同一个网桥上,为什么/如何nginx不会将请求路由到容器上港口:3000?

我已经完成了大约40个不同的教程和堆栈溢出建议,如何解决这个问题。我已经尝试了很多方法来实现这个目标。所有我正在寻找的方法是强制nginx拦截所有端口80请求到主机IP并将其路由到Web应用程序。

0 个答案:

没有答案