【问题标题】:Docker Compose with NGINX proxy pass thru not workingDocker Compose 与 NGINX 代理通过不工作
【发布时间】:2020-10-31 00:02:35
【问题描述】:

以下是我的 Docker Compose 文件和 NGINX conf 文件。

应用程序似乎可以工作,NGINX 也已启动,但 proxy_pass 设置似乎无法正常工作。

文件 docker-compose.yaml


networks:
  webapp:

services:
 
  web:
    image: nginx
    volumes:
      - ./data/ntemplates:/etc/nginx/templates
      - ./webapp.conf:/etc/nginx/conf.d/webapp.conf
    ports:
      - "8080:80"
    networks:
      - webapp

  pyweb:
    build: .
    ports:
      - "5000:5000"
    networks:
      - webapp

  redis:
    image: "redis:alpine"
    networks:
      - webapp

文件 webapp.conf

server { 
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
       proxy_pass "http://pyweb_1:5000/";
    }

    #error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;

}

如果直接通过 http://pyweb_1:5000 访问,服务 pyweb 工作正常

我基于 docker 入门 page 创建了这个应用程序 为了完整起见,下面是其他文件,似乎工作正常。

文件 Dockerfile

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

文件requirement.txt

flask
redis

文件app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

【问题讨论】:

标签: docker nginx docker-compose


【解决方案1】:

编辑:

您当前没有使用 nginx 配置。我没有仔细阅读您的 docker-compose 文件。您可以通过在 /etc/nginx/conf.d/default.conf 上映射 webapp.conf 来修复它。例如

services:
 
  web:
    image: nginx
    volumes:
      - ./data/ntemplates:/etc/nginx/templates
      - ./webapp.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"
    depends_on:
      - pyweb
    networks:
      - webapp

有两个问题:

  • 你不知道 docker-compose 将使用什么容器名称
  • 您不知道用于启动容器的顺序

docker-compose 允许您通过 2 种方式解决第一个问题:

  • 定义container_name 小节
  • 使用服务名称

这意味着您可以在 nginx 设置中简单地使用 proxy_pass "http://pyweb:5000/";

第二个问题可以通过在 nginx 服务中添加 depends_on 小节来解决。例如

services:
 
  web:
    image: nginx
    volumes:
      - ./data/ntemplates:/etc/nginx/templates
      - ./webapp.conf:/etc/nginx/conf.d/webapp.conf
    depends_on:
      - pyweb
    ports:
      - "8080:80"
    networks:
      - webapp

尽管如此,depends_on 可能还不够,因为它不会检查服务状态,而只会确保 docker 服务已启动(如documentation 中所述)。

您需要找到另一种方法来监控服务是否实际启动。

【讨论】:

  • 上述@stefano 的建议有助于解决问题
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
相关资源
最近更新 更多