主机的Docker nginx代理

vawmfj5a  于 2023-02-21  发布在  Nginx
关注(0)|答案(5)|浏览(186)
    • 简要说明:**

nginx运行在docker上,如何配置nginx,使其将调用转发到主机。

    • 详细说明:**

我们有一个web应用程序,它与几个后端(比如rest1、rest2和rest3)通信,我们负责rest1
让我们考虑一下我在我的PC上手动启动rest1并在2345端口上运行,我希望nginx(运行在docker中)将所有对rest1的调用重定向到我自己正在运行的示例(注意,示例运行在主机上,而不是任何容器上,也不是在docker中),并将rest2rest3重定向到其他docker节点或其他服务器(谁在乎呢)。

    • 我正在寻找的是:**
  1. docker-compose.yml配置(如果需要)。
  2. nginx配置。
    先谢了。
t8e9dugd

t8e9dugd1#

如下所示配置nginx(确保替换Docker主机的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
sy5wg1nm

sy5wg1nm2#

如果您正在使用Docker合成文件版本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 "";
        }
    }
 }
kg7wmglp

kg7wmglp3#

    • 溶液1**

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

    • 溶液2**

我为每个服务运行了更多的nginx示例,为了保持nginx配置的简单性,避免将每个nginx绑定到主机,使用容器结构:
dockerhost-具有network_mode: host的虚拟容器
proxy-用作主机服务的代理的nginx容器,
dockerhost链接到proxy,这将在proxy容器中添加一个/etc/hosts条目-我们可以使用"dockerhost"作为nginx配置中的主机名。
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;

这个方法允许我们为我的服务器上运行的每一个服务自动生成let's encrtypt证书。如果有兴趣,我可以发布一个解决方案的要点。

50few1ms

50few1ms4#

服务器{收听80;
服务器名称本地主机;

location / {
proxy_pass http://host.docker.internal:3000;

}
}
Docker暴露的主机地址在Mac OS中为host. docker. internal

kxkpmulp

kxkpmulp5#

有几件事你必须记住:
1.默认情况下,Dockercompose(从版本3开始)使用服务名作为容器间网络的主机名

  1. Nginx需要先了解上游
    1.我强烈建议将default.conf直接挂载到您的docker-compose.yml中。
    1.最后,你必须对接你的后端,以利用docker内部网络。
    我在一个全栈项目中使用nginx和docker-compose的示例repo:https://gitlab.com/datails/api.
    以下示例具有一些先决条件:
  • 您的文件夹结构如下所示:
- backend/
- frontend/
- default.conf
- docker-compose.yml
  • 其次,后端和前端dit都有一个Docker文件,它在端口3000上公开了一个应用程序。

示例default.conf

upstream backend {
    server backend:3000;
}

upstream frontend {
    server frontend:3000;
}

server {
    listen 80;

    location /api {
        proxy_pass http://backend;
    }

    location / {           
        proxy_pass http://frontend/;
    }
}

示例docker-compose.yml

version: '3.8'
services:
  nginx:
    image: nginx:1.19.4
    depends_on:
      - server
      - frontend
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - '8080:80'

然后,确保后端已经对接并被称为(在本例中)backend作为服务,前端(如果需要)被称为frontend作为服务。

version: '3.8'
services:    
  nginx:
    image: nginx:1.19.4
    depends_on:
      - server
      - frontend
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - '8080:80'

  frontend:
    build: ./frontend

  backend:
    build: ./backend

这是一个最基本的入门示例。希望这对未来的开发人员有帮助。

相关问题