簡體   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