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

时间:2018-06-26 08:56:58

标签: 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码头工人文件是

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;
        }
    }
}

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

1 个答案:

答案 0 :(得分:1)

您提到的方法不起作用,服务器无法使用默认的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实例将重新启动并以循环方式进行设置。