【问题标题】:Nginx reverse-proxy for python app using docker-compose使用 docker-compose 的 Python 应用程序的 Nginx 反向代理
【发布时间】:2020-07-17 00:04:16
【问题描述】:

您好,我正在尝试使用 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-compose-file

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";
    }
}

【问题讨论】:

    标签: python docker nginx docker-compose dockerfile


    【解决方案1】:

    首先您需要创建桥接网络。假设网络名称是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)
    
    

    我们将使用烧瓶,所以我们需要安装它。我们可以通过创建requirements.txt 文件并使用pip3 install -r requirements.txt 来安装它。

    requirements.txt

    flask==1.1.2
    

    现在将为 python 应用创建Dockerfile

    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 配置文件。

    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 compose中连接服务。但我可以在没有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,因为它们都在同一个网络中 .


    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多