python - 使用 docker-compose 的 Python 应用程序的 Nginx 反向代理
问题描述
嗨,我正在尝试使用 nginx 反向代理创建 python 应用程序和 redis,但是当我运行 docker-compose 文件时,它会运行所有容器,但是当我转到 localhost:90 时,它显示 nginx 页面,而不是 python 文件中定义的页面. 我在这里学习本教程
码头工人文件:
FROM python:3
RUN pip install flask
蟒蛇文件:
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)
码头工人撰写文件
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.conf
server {
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 应用程序。
索引.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)
我们将使用烧瓶,所以我们需要安装它。我们可以通过创建requirements.txt
文件并使用pip3 install -r requirements.txt
来安装它。
要求.txt
flask==1.1.2
现在将为Dockerfile
python 应用程序创建。
Dockerfile
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
配置文件。
默认.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://flask_app:5000/;
proxy_set_header Host "localhost";
}
}
现在将创建docker-compose
文件。
码头工人-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
它们都在同一个网络中。
推荐阅读
- linux - 使用鱼壳创建多个目录
- javascript - GScript If/Then 语句
- reporting-services - SSIS/SSRS - 当我在 VS 2017 中为 SSIS 创建一个新项目时出现此错误
- r - Can't connect to CRAN mirror from RStudio
- sql - achieve "friends data model" with postgres
- flutter - Flutter:使用 Radio 选择单个项目
- java - How to darken CardView using onClick?
- express - express-generator 是否在脚手架完成后添加视图?
- c - Relocation of data from flash to RAM during boot phase
- c# - Get the realtime CPU speed in C#?