docker - 无法与具有多个Flask容器实例的Nginx docker反向代理

标签 docker flask docker-compose dockerfile

我正在尝试使用nginx容器充当反向代理,它将在多个flask应用程序实例之间分配负载,我正在使用docker-composer做到这一点。

version: '3'
services:
  app:
    build:
      context:  ./app
      dockerfile: Dockerfile
    expose:
      - "8001"

  proxy:
    build:
      context:  ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
    links:
      - app

我的nginx docker文件是
FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf

而我的应用dockerfile是
FROM python:3-alpine

RUN apk update && apk upgrade && pip install -U pip
RUN apk add --update alpine-sdk make gcc python3-dev python-dev libxslt-dev libxml2-dev libc-dev openssl-dev libffi-dev zlib-dev py-pip \
    && rm -rf /var/cache/apk/*

RUN set -x \
    && VER="17.03.0-ce" \
    && curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz \
    && tar -xz -C /tmp -f /tmp/docker-$VER.tgz \
    && mv /tmp/docker/* /usr/bin

WORKDIR /app
ADD . /app

RUN pip install --trusted-host pypi.python.org -r requirements.txt

EXPOSE 8001

CMD ["python3.6", "main.py"]

我正在使用以下命令进行构建
docker-compose build

和以下命令来启动容器
docker-compose up -d --scale app=5

这表现了
Starting testapp_app_1 ... done
Creating testapp_app_2 ... done
Creating testapp_app_3 ... done
Creating testapp_app_4 ... done
Creating testapp_app_5 ... done

但是我检查了docker日志,似乎所有的请求都是通过测试app_app_1服务器

我的nginx conf文件是
#worker_processes 4;

events { worker_connections 1024; }

http {
#    sendfile on;

#    upstream app_servers {
#        server app:8001;
#    }

    server {
        listen 80;
        server_name localhost;

        resolver 127.0.0.11;
        set $backends app;
        location / {
            proxy_pass         http://$backends:8001;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}

请说明如何动态轮询对每个应用程序的请求
货柜

最佳答案

您提到的方法无效,服务器无法使用默认的nginx服务器检测到新实例,您将需要jwilder / docker-gen镜像才能将动态创建的应用程序实例集成到nginx负载均衡器。

您在根目录中的dockerfile应该类似于:

version: '3'
services:
  nginx:
    image: nginx
    #restart: unless-stopped
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./vhost.d:/etc/nginx/vhost.d

  nginx-gen:
    image: jwilder/docker-gen
    command: -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    container_name: nginx-gen
    #restart: unless-stopped
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./vhost.d:/etc/nginx/vhost.d
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
networks:
  default:
    external:
      name: nginx-proxy

和app目录中的dockerfile一样:
version: '3'
services:
  app:
    build:
      context:  ./app
      dockerfile: Dockerfile
    expose:
      - "8001"
    environment:
      VIRTUAL_HOST: localhost

networks:
  default:
    external:
      name: nginx-proxy

在所有实例中使用相同的虚拟主机名非常重要,并且jwilder / docker-gen实例将重新启动并以循环方式进行设置。

关于docker - 无法与具有多个Flask容器实例的Nginx docker反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51038789/

相关文章:

docker - 如何从Docker容器中``avahi浏览''?

bash - 生成文件中的链命令通过IP连接到postgres容器

python - 如何使用 SQLAlchemy 获取一条记录?

jenkins - 如何在Dockerfile中获取主机上组的GID

mongodb - mongodb与docker-compose [SocketTimeoutException]

docker - 使用 docker-py 在同一个容器上运行多个命令

python - 使用 Flask-SQLAlchemy 在多个不同的数据库中运行 SQL

javascript - jQuery 在扩展 html python Flask 中无法识别

docker-compose.yaml 不会解析

django - docker-compose在require.txt更改时重置Django数据库