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

3
我希望在Docker容器中运行Nginx,它监听端口80,当URL以单词api开头时,我希望它代理到端口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,因此我无法再运行我的Web应用程序。

使用Docker时,通常不应在单个容器中运行多个进程。尝试将您的Web应用程序在一个独立的容器中运行,并让Nginx代理请求到它。 - Sebastian
@Sebastian 我不是。Nginx容器只包含Nginx,但我不知道如何将请求从Nginx容器传递到我的Web应用容器。 - Arch1tect
如果您使用不同的容器,就不会出现端口冲突(正如您在问题中所指出的)。 - Sebastian
3个回答

6

docker run -d --net host nginx

尝试一下!Nginx容器将与主机共享网络,包括IP和所有端口。


在我的情况下也起作用了。 - Alex Bran

1
首先,您需要创建一个网络来放置两个容器:
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;
}

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

然而根据官方Docker文档,这种方法已经被弃用了,你只应该在"绝对需要"的情况下使用它。相反,你应该使用Docker网络。理论上,如果两个容器在同一个网络中,并且本地DNS服务器正常工作(嵌入在Docker中),它们应该能够在没有--link参数的情况下相互访问。不幸的是,由于某些原因,这对我来说并没有起作用。Nginx在/etc/resolv.conf中没有正确配置DNS,但是阅读一下文章并进行一些尝试,我相信它会起作用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接