繁体   English   中英

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

[英]Nginx docker container proxy pass to another port

我想在docker容器中运行Nginx,它侦听端口80,并且当URL以word api开头时,我希望它通过proxy_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容器

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

docker run -d --net host nginx

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

每个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;
}

但是,根据Docker官方文档,此方法已弃用,您仅应使用“绝对需要”的方法。 相反,您应该使用docker网络 从理论上讲,如果两个容器都在同一个网络中并且本地DNS服务器正在工作(嵌入docker),则它们应该能够在没有--link参数的情况下看到彼此。 不幸的是,由于某种原因,它对我不起作用。 Nginx在/etc/resolv.conf中没有配置正确的DNS,但是请阅读本文并进行尝试,我敢肯定它会起作用。

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM