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

Nginx docker容器代理传递到另一个端口,docker,nginx,Docker,Nginx,我想在docker容器中运行Nginx,它监听端口80,我想当url以wordapi开头时,它代理传递到端口8080,我有一些web应用监听端口8080。在没有docker的情况下,这对我来说是有效的,但是有docker,我无法让它发挥作用 我的nginx.conf如下所示: location /{ # serve static page } location /api { proxy_pass http://0.0.0.0:8080;

我想在docker容器中运行Nginx,它监听端口80,我想当url以word
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-p80:80-p8080:808080nginx运行我的nginx容器

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

每个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;
}
然而,根据这个方法是不推荐的,你应该只使用它的“绝对需要”。相反,您应该使用。理论上,如果两个容器都在同一个网络中,并且本地DNS服务器正在工作(嵌入docker中),那么它们应该能够在不使用--link参数的情况下看到对方。不幸的是,由于某种原因,它对我不起作用。Nginx没有在/etc/resolv.conf中配置正确的DNS,但请阅读本文并仔细研究一下,我相信它会起作用。

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

然而,根据这个方法是不推荐的,你应该只使用它的“绝对需要”。相反,您应该使用。理论上,如果两个容器都在同一个网络中,并且本地DNS服务器正在工作(嵌入docker中),那么它们应该能够在不使用--link参数的情况下看到对方。不幸的是,由于某种原因,它对我不起作用。Nginx没有在/etc/resolv.conf中配置正确的DNS,但请阅读本文并尝试一下,我相信它会起作用。

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

docker network create nginx_network
docker run --network="nginx_network" -d --name my_api your_api_container
docker run --network="nginx_network" -d -p 80:80 nginx
然后,您应该在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 network create nginx_network
docker run --network="nginx_network" -d --name my_api your_api_container
docker run --network="nginx_network" -d -p 80:80 nginx
注:

  • --API容器的name参数值必须与Nginx config中的域名匹配
  • 仅为nginx容器指定80个端口就足够了
  • 首先运行API的容器,然后运行Nginx的容器(见下文)
  • 两个容器必须位于同一网络中
  • 这应该行得通

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

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

    docker network create nginx_network
    
    docker run --network="nginx_network" -d --name my_api your_api_container
    docker run --network="nginx_network" -d -p 80:80 nginx
    
    然后,您应该在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 network create nginx_network
    
    docker run --network="nginx_network" -d --name my_api your_api_container
    docker run --network="nginx_network" -d -p 80:80 nginx
    
    注:

  • --API容器的name参数值必须与Nginx config中的域名匹配
  • 仅为nginx容器指定80个端口就足够了
  • 首先运行API的容器,然后运行Nginx的容器(见下文)
  • 两个容器必须位于同一网络中
  • 这应该行得通

    如果您首先运行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;
    }
    
    docker run-d——网络主机nginx

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

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

    使用docker,通常不应在单个容器中运行多个进程。尝试在单独的容器中运行您的web应用程序,并让nginx代理请求它。@Sebastian我不是。nginx容器仅包含nginx,但我不知道如何将请求从nginx容器传递到我的web应用程序容器。如果您使用不同的容器,则使用docker不会出现端口冲突(如您在问题中所指出的),一般来说,您不应在单个容器中运行多个进程。尝试在单独的容器中运行您的web应用程序,并让nginx代理请求它。@Sebastian我不是。nginx容器仅包含nginx,但我不知道如何将请求从nginx容器传递到我的web应用程序容器。如果您使用不同的容器,则不会出现端口冲突(如您在问题中所述)