以下是我的 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/