Nginx docker容器代理传递到另一个端口

时间:2018-01-01 09:59:14

标签: docker nginx

我想在docker容器中运行Nginx,它会侦听端口80,当url以字 location /{ # serve static page } location /api { proxy_pass http://0.0.0.0:8080; } 开头时,我希望它将proxy_pass传送到端口8080,并且我有一些Web应用程序侦听端口8080。一直在为我工作,没有码头工人,但对于码头工人,我无法让它工作。

我的nginx.conf就像:

docker run -d -p 80:80 -p 8080: 8080 nginx

我使用select customer_name,company_name,email,quotation_data from sent_quotation_data1 where cast( --> as you want to check numeric operator I use cast to unsigned (replace( --> as your data is between " I use replace to remove them quotation_data->"$.total[0].Amount" --> Here you can extract json data ,'"','')) as unsigned ) > 3000;

运行我的nginx容器

我的问题是现在我无法运行我的网络应用程序,因为它无法侦听端口8080,因为该容器已经在监听它。

3 个答案:

答案 0 :(得分:2)

docker run -d --net host nginx

试试吧! Nginx容器将与IP和所有端口共享主机网络

答案 1 :(得分:0)

您可以(或者更应该)每个docker容器只有一个进程,这意味着您将在一个容器中运行nginx,而在另一个容器中运行您的应用程序。旧方法是在容器之间创建链接,如下所示:

$ docker run --name my-app -d myself/myapp
$ docker run --name proxy --link my-app:my-app -d nginx

这将在nginx容器中的/etc/hosts中添加一行,以便它能够通过它的名称调用另一个容器。

然后在nginx.conf文件中:

location /api {
    proxy_pass http://my-app:8080;
}

然而,根据official Docker docs,这种方法已被弃用,您只能使用它"绝对需要"。相反,您应该使用docker networking。从理论上讲,如果两个容器都在同一个网络中并且本地DNS服务器正在工作(嵌入在docker中),那么它们应该能够在没有--link参数的情况下看到彼此。不幸的是,由于某些原因它并没有为我工作。 Nginx没有在/etc/resolv.conf中配置正确的DNS,但阅读文章并围绕它玩,我相信它会起作用。

答案 2 :(得分:0)

首先,您需要创建一个网络来放置两个容器:

docker network create nginx_network

然后,您应该在nginx配置中指定Docker的DNS服务器:

location /api {
    #Docker DNS
    resolver 127.0.0.11;

    #my_api - name of container with your API, see below
    proxy_pass http://my_api:8080;
}

最后,运行你的容器:

docker run --network="nginx_network" -d --name my_api your_api_container
docker run --network="nginx_network" -d -p 80:80 nginx

注意:

  1. - API的容器的name参数值必须与Nginx config中的域名匹配
  2. 只需为您的nginx容器指定80个端口
  3. 首先运行API的容器,然后运行Nginx的容器(见下文)
  4. 两个容器必须位于同一网络中
  5. 这应该有用。

    如果您首先运行nginx容器,那么nginx将尝试在启动时解析域名my_api并失败,因为具有此名称的容器尚不存在。在这种情况下,有以下解决方法(不确定它是否是一个好的解决方案)。修改nginx配置:

    location /api {
        #Docker DNS
        resolver 127.0.0.11;
    
        #hack to prevent nginx to resolve domain on start up
        set $docker_host "my_api";
    
        #my_api - name of container with your API, see below
        proxy_pass http://$docker_host:8080;
    }