Docker Compose 与 NGINX 代理传递不起作用

标签 docker nginx docker-compose

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

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

File 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

File 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 为了完整起见,下面是其他文件,并且似乎工作得很好。

File 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"]

File requirement.txt

flask
redis

File 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)

最佳答案

编辑:

您当前没有使用 nginx 配置。我没有仔细阅读你的 docker-compose 文件。您可以通过将 webapp.conf 映射到/etc/nginx/conf.d/default.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

有 2 个问题:

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

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

  • 定义一个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 中所述)。

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

关于Docker Compose 与 NGINX 代理传递不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64611200/

相关文章:

docker - VPN 连接的 Docker 容器无法访问其他容器

docker - Com.github.dockerjava.api.exception.DockerClientException:证书路径(DOCKER_CERT_PATH) ‘/root/.docker/certs’不存在一般讨论

ubuntu - 无法在 Nginx 服务器上访问 phpMyAdmin

mongodb - 无法从Docker中的Flask获取和发布数据到MongoDB

mysql - TCPConnectWrap.afterConnect - Node 在 docker compose 中时无法从 mysql 获取数据

docker - 为什么在交叉编译为 musl 时 Rust 文档测试没有在 Docker 中执行?

docker - 如何在 "Docker for Windows"中启用 docker 远程 API

apache - AWS 和 Node.js,我需要 nginx 还是 apache?

django - 重新启动 Nginx 或在证书更改时重新加载证书缓存

docker - 如何为多个Docker Swarm堆栈提供全局.htpasswd文件?