Docker nginx代理托管

时间:2017-02-24 12:14:10

标签: nginx docker docker-compose

简短说明:

在docker上运行Nginx,如何配置nginx以便将呼叫转发给主机。

详细说明:

我们有一个Web应用程序与几个后端通信(让我们说rest1,rest2和rest3)。我们负责rest1

让我们考虑一下,我在电脑上手动启动rest1并在2345端口上运行。我希望nginx(在docker中运行)将所有对rest1的调用重定向到我自己的运行实例(注意,实例在主机上运行,​​而不是任何容器,而不是在docker中)。对于rest2rest3到其他一些docker节点,或者可能是其他服务器(谁在乎)。

我要找的是:

  1. docker-compose.yml配置(如果需要)。
  2. nginx配置。
  3. 提前致谢。

3 个答案:

答案 0 :(得分:3)

配置nginx,如下所示(确保替换Docker Host的IP)并将其保存为default.conf

server {
    listen       80;
    server_name  _;
    location / {
        proxy_pass http://<IP of Docker Host>;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

现在打开容器:

docker run -d --name nginx -p 80:80 -v /path/to/nginx/config/default.conf:/etc/nginx/conf.d/default.conf nginx

答案 1 :(得分:2)

解决方案1 ​​

使用network_mode: host,这会将您的nginx实例绑定到主机的网络接口。 在运行多个Nginx容器时,这可能会导致冲突:每个暴露的端口都绑定到主机的接口。

解决方案2

我想为外界提供的每项服务都运行更多的nginx实例。 为了简化nginx的配置并避免将每个nginx绑定到主机,请使用容器结构:

dockerhost-具有network_mode: host

的虚拟容器

proxy-nginx容器用作托管服务的代理,

dockerhost链接到proxy,这将在/etc/hosts容器中添加一个proxy条目-我们可以在nginx配置中使用'dockerhost'作为主机名。

docker-compose.yaml

version: '3'
services:
  dockerhost:
    image: alpine
    entrypoint: /bin/sh -c "tail -f /dev/null"
    network_mode: host
  proxy:
    image: nginx:alpine
    links: 
     - dockerhost:dockerhost
    ports:
     - "18080:80"
    volumes:
     - /share/Container/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro

default.conf

 location / {
        proxy_pass http://dockerhost:8080;

此方法使我们能够自动为服务器上运行的每个服务生成加密证书。如果有兴趣,我可以发布有关解决方案的要点。

答案 2 :(得分:0)

如果您使用的是Docker Compose文件版本3,则根本不需要docker-compose.yml文件的任何特殊配置,只需使用特殊的DNS名称host.docker.internal即可访问主机服务,如遵循nginx.conf示例:

events {
    worker_connections  1024;
}

http {
    upstream host_service {
       server host.docker.internal:2345;
    }

    server {
        listen 80;

        access_log  /var/log/nginx/http_access.log  combined;
        error_log   /var/log/nginx/http_error.log;

        location / {
            proxy_pass http://host_service;

            proxy_set_header    Host                $http_host;
            proxy_set_header    X-Real-IP           $realip_remote_addr;
            proxy_set_header    X-Forwarded-Proto   $scheme;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;

            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
 }