嗨,我正在尝试使用nginx反向代理创建一个python应用程序和redis,但是当我运行docker-compose文件时,它将运行所有容器,但是当我进入localhost:90时,它将显示nginx页面,而不是python文件中定义的页面。我正在关注本教程here
Docker文件:
FROM python:3
RUN pip install flask
Python文件:from flask import Flask
app = Flask(__name__)
# to connect redis
# use host "redis_app"
# use port "6379"
# use password "add_password_here"
@app.route('/')
def hello():
return 'Hello NGINX reverse proxy'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
Docker撰写文件version: '3.1'
services:
nginx:
image: nginx:latest
container_name: nginx_reverseproxy
depends_on:
- flask
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
networks:
- docker-network
ports:
- 90:80
flask:
build:
context: ./
dockerfile: Dockerfile
image: flask:v1
container_name: flask_webapp
volumes:
- ./:/flask_code/
environment:
- FLASK_APP=/flask_code/main.py
command: python /flask_code/main.py
networks:
docker-network:
aliases:
- flask_webapp
ports:
- 8080:5000
depends_on:
- redis
redis:
image: redis
networks:
docker-network:
nginx.confserver {
listen 90;
server_name localhost;
location / {
proxy_pass http://flask_webapp:5000/;
proxy_set_header Host "localhost";
}
}
最佳答案
首先需要创建网桥网络。可以说网络名称是my_project_network
。
docker network create --driver=bridge my_project_network
现在我们将创建python应用程序。
index.py
from flask import Flask
app = Flask(__name__)
# to connect redis
# use host "redis_app"
# use port "6379"
# use password "add_password_here"
@app.route('/')
def hello():
return 'Hello NGINX reverse proxy'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
我们将使用 flask ,因此我们需要安装它。我们可以通过创建
requirements.txt
文件并使用pip3 install -r requirements.txt
来安装它。requirements.txt
flask==1.1.2
现在将为python应用程序创建
Dockerfile
。Docker文件
FROM python:3
RUN mkdir -p /my_project
WORKDIR /my_project
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
COPY . .
CMD [ "python3", "./index.py"]
现在将创建
nginx
配置文件。default.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://flask_app:5000/;
proxy_set_header Host "localhost";
}
}
现在将创建
docker-compose
文件。docker-compose.yml
version: "3.7"
services:
nginx_app:
image: nginx:latest
depends_on:
- flask_app
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
ports:
- 8080:80
networks:
- my_project_network
flask_app:
build:
context: .
dockerfile: Dockerfile
expose:
- 5000
depends_on:
- redis_app
networks:
- my_project_network
redis_app:
image: redis:latest
command: redis-server --requirepass add_password_here
expose:
- 6379
networks:
- my_project_network
networks:
my_project_network:
external: true
现在我们完成了所有文件。因此我们将运行docker compose。
docker-compose up --build -d
要停止它,只需使用docker-compose stop
结果
注意:您可以使用所需的任何端口替换
8080
端口。注意:我创建了
my_project_network
以便可以在Docker中连接服务彼此组成。但是我可以不用my_project_network
来做到。但是我更喜欢使用my_project_network
将其他服务从另一个docker compose连接到该docker compose服务。可以说我们有。
./anther_project/docker-compose.yml
version: "3.7"
services:
flask_app_v2:
build:
context: .
dockerfile: Dockerfile
ports:
- 5001:5001
networks:
- my_project_network
networks:
my_project_network:
external: true
flask_app_v2
可以连接到redis_app
,因为它们都在同一网络中。
关于python - 使用docker-compose的python应用程序的Nginx反向代理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62945229/