【问题标题】:Nginx docker container proxy pass to another portNginx docker 容器代理传递到另一个端口
【发布时间】:2018-01-01 09:59:13
【问题描述】:

我想在 docker 容器中运行 Nginx,它侦听端口 80,当 url 以单词 api 开头时,我希望它代理_pass 到端口 8080,并且我有一些 Web 应用程序侦听端口 8080。这是在没有 docker 的情况下为我工作,但有了 docker,我无法让它工作。

我的 nginx.conf 是这样的:

    location /{
        # serve static page
    }
    location /api {
        proxy_pass http://0.0.0.0:8080;
    }

我使用 docker run -d -p 80:80 -p 8080: 8080 nginx 运行我的 nginx 容器

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

【问题讨论】:

  • 使用 docker,您通常不应该在单个容器中运行多个进程。尝试在单独的容器中运行您的 Web 应用程序,并让 nginx 代理向它发出请求。
  • @Sebastian 我不是。 nginx 容器只包含 nginx,但我不知道如何将请求从 nginx 容器传递到我的 web 应用程序容器。
  • 如果您使用不同的容器,就不会有端口冲突(正如您在问题中指出的那样)

标签: docker nginx


【解决方案1】:

docker run -d --net host nginx

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

【讨论】:

    【解决方案2】:

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

    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 配置中的域名匹配
    2. 只为你的 nginx 容器指定 80 端口就足够了
    3. 首先运行 API 的容器,然后运行 ​​Nginx 的容器(见下文)
    4. 两个容器必须在同一个网络中

    这应该可行。

    如果你先运行 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;
    }
    

    【讨论】:

      【解决方案3】:

      您可以(或者应该)每个 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,但是阅读文章并尝试一下,我相信它会起作用。

      【讨论】:

        猜你喜欢
        • 2018-07-28
        • 2020-12-10
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多