首页 > 解决方案 > docker nginx 将端口转发到容器错误

问题描述

寻找有关配置 Nginx 以将端口 10000 上的传入请求转发到容器中运行的应用程序的一些帮助。

我有一个包含 3 个容器的 docker 映像。第一个容器是 Nginx 服务器,第二个烧瓶应用程序和第三个是 Dataiku DSS 服务器。

烧瓶应用程序正常工作,我可以通过端口 443 进行连接,但是当尝试连接到 Dataiku DSS 服务器时,我收到 502 错误“错误请求”。

我可以通过运行自己运行 DSS Server 容器,docker run 10000:10000 dataiku/dss并且一切都按预期工作。我可以通过 127.0.0.1:10000 连接。我还尝试了 Nginx 配置,同时运行完全独立于项目的 DSS 服务器,但仍然没有运气。

撰写文件如下所示:

version: "3.7"

services:

  flask:
    build: ./flask
    container_name: flask
    restart: always
    image: trac
    environment:
      - APP_NAME=Trac
    expose:
      - 8080
    depends_on:
      - nginx
    volumes:
      - c:/trac_temp_files:/temp_files

  dss:
    build: ./dss
    image: dss
    container_name: dss
    restart: always
    expose:
      - 10000
    ports:
      - "10000:10000"
    depends_on:
      - nginx

  nginx:
    build: ./nginx
    image: nginx
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "10000:10000"

nginx的配置:

server {
    # Host/port on which to expose Data Science Studio to users
    listen 10000 ssl;
    ssl_certificate wildcard.crt;
    ssl_certificate_key wildcard.key;
    location / {
        # Base url of the Data Science Studio installation
        proxy_pass http://0.0.0.0:10000/;
        proxy_redirect off;
        # Allow long queries
        proxy_read_timeout 3600;
        proxy_send_timeout 600;
        # Allow large uploads
        client_max_body_size 0;
        # Allow protocol upgrade to websocket
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}


server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl http2 default_server;
    ssl_certificate wildcard.crt;
    ssl_certificate_key wildcard.key;
    client_max_body_size 100M;
    location / {
        include uwsgi_params;
        uwsgi_pass flask:8080;
    }
}

我对 docker 很陌生,所以我想知道是否有一些我想念的东西。

我正在尝试遵循 Dataiku 关于通过 SSL 连接的建议,但我假设该指南并未假设您正在使用他们的 docker 映像https://doc.dataiku.com/dss/latest/installation/proxies.html #反向代理

此外,使用 docker 的原因是托管所有这些的机器没有互联网访问权限,并且仅对我所在的网络可见。

任何帮助都会很棒,因为没有这个工作我有点卡住了。

更新:

我想要实现的预期结果是用户能够连接到任一应用程序。

例如:

www.example.com:5000 = app1
www.example.com:5001 = app2

如果以上是不可能的,我将如何实现类似

www.example.com/app1 = app1
www.example.com/app2 = app2

标签: dockernginxdocker-compose

解决方案


您只需要在 nginx 中公开端口,因为您将其用作代理服务器。此外,在您的 docker compose 文件中,为 nginx 配置文件添加如下卷:

volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf:ro

推荐阅读