Python 中使用 Docker Compose

  • 使用 Docker Compose 运行一个简单的 Python Web应用程序。
  • 该应用程序使用 Flask 框架,并在 Redis 中维护一个计数器。

【1】使用 Compose 容器运行 Flask 项目

  1. 新建一个项目目录,在该项目中创建虚拟环境

    • windows 系统
    powershell 复制代码
    # 查看python 版本
    python --version
    # 或
    py --version
    
    # 创建虚拟环境
    python -m venv .venv 
    # 或
    py -m venv .venv
  2. 激活虚拟环境

    • windows系统
    powershell 复制代码
    .venv\Scripts\activate
    • 当命令提示符前显示虚拟环境名称,表示激活成功
    powershell 复制代码
    (.venv) PS D:/edu-flask> 
  3. 安装 Flask

  • 激活虚拟环境后,使用下面的命令来安装 Flask:

    powershell 复制代码
    # pip install flask==3.1.2 可以指定flask版本为 3.1.2
    (.venv) PS D:/edu-flask> pip install flask
  1. 项目根目录中创建 app.py 文件

    powershell 复制代码
    from flask import Flask
    import redis
    import time
    
    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 e:
                if retries == 0:
                    raise e
                retries -= 1
                time.sleep(0.5)
    
    
    @app.route("/")
    def hello():
        count = get_hit_count()
        return f"Hello, World! I have been seen {count} times.\n"
  2. 在项目根目录下创建 requirements.txt 文件,文件内容如下

    • 列出 Python 项目需要的所有第三方库,方便统一安装。
    • 在 Dockerfile 中通过 pip install -r requirements.txt 自动安装所有依赖。
    powershell 复制代码
    flask
    redis
  3. 在项目根目录下创建 Dockerfile 文件,文件内容如下

    • 描述如何从零构建一个自定义的 Docker 镜像
    powershell 复制代码
    FROM python:3.7-alpine
    WORKDIR /code
    # 环境变量:指定 Flask 主文件
    ENV FLASK_APP=app.py
    # 环境变量:Flask 监听地址
    ENV FLASK_RUN_HOST=0.0.0.0 
    COPY requirements.txt requirements.txt
    # 安装 python 依赖
    RUN pip install -r requirements.txt
    EXPOSE 5000
    COPY . .
    # 运行 Flask 应用
    CMD ["flask", "run"]
  4. 在项目根目录下创建 compose.yml 文件,文件内容如下

    • 定义和管理多个容器(服务),让它们可以一键启动、停止、互相通信。
    powershell 复制代码
    # Compose 文件版本
    version: '3.9'
    
    # 定义服务(容器)
    services:
      # 第一个服务:我们的 Flask 应用
      web:
        # 从当前目录构建镜像
        # . 就是指 compose.yml 所在的当前目录 ,
        # Docker 会在该目录下找 Dockerfile 来构建镜像。
        build: .
        # 端口映射:宿主机5000 -> 容器5000
        ports:
          - 5000:5000
      
      # 第二个服务:Redis
      # 从镜像 redis:alpine 构建
      redis:
        image: redis:alpine
  5. 在项目的根目录下执行如下命令,启动项目

    • 执行下面命令后,将会找到compose.yml 文件开始执行
    • 根据compose.yml 文件会找到 Dockerfile 文件(根据build: .),然后执行 Dockerfile 文件,构建 web 镜像
    • Dockerfile 文件执行完之后,重新回到compose.yml 文件拉取 redis 镜像,完成之后启动web(Flask) 和 redis 容器
    powershell 复制代码
    docker compose up
  6. 项目启动后,在浏览器上输入http://localhost:5000/,可以看到页面有对应的信息

【2】挂载本地项目到Docker中

  • 在代码开发阶段,我们可以将本地的代码挂载到Docker中,修改本地的代码可以实时预览修改的结果
  1. 修改 compose.yml 文件,添加 volumes

    • volumes 指定项目目录映射到容器的 /code 目录,当修改项目代码时,可以随时看到,而不用重新构建镜像。
    • 同时也设置了environmentFLASK_ENV=development 该环境变量指示 flask run 要在开发模式下运行并在更改代码时重新加载代码。此模式只能在开发中使用。
    powershell 复制代码
    # Compose 文件版本
    version: '3.9'
    
    # 定义服务(容器)
    services:
      # 第一个服务:我们的 Flask 应用
      web:
        # 从当前目录构建镜像
        # . 就是指 compose.yml 所在的当前目录 ,
        # Docker 会在该目录下找 Dockerfile 来构建镜像。
        build: .
        # 端口映射:宿主机5000 -> 容器5000
        ports:
          - 5000:5000
        # 挂载当前目录为容器内 /code 目录
        volumes:
          - ./:/code
        # 环境变量:指定 Flask 环境为开发模式
        environment:
          - FLASK_ENV=development
      # 第二个服务:Redis
      # 从镜像 redis:alpine 构建
      redis:
        image: redis:alpine
  2. 重新启动项目

    powershell 复制代码
    # docker compose up -d 表示在后台启动服务
    docker compose up
  3. 可以在容器中的web服务下的 files 中的 code 文件夹上看到 MOUNT ,表示挂载成功

  4. 我们可以修改一下本地代码app.py 文件,然后刷新浏览器,可以看到新修改的代码信息。

相关推荐
qq_413847402 小时前
JavaScript中剩余参数在函数签名中的定义位置与限制
jvm·数据库·python
qq_330037992 小时前
mysql如何配置多实例运行环境_单机部署多个数据库服务
jvm·数据库·python
weixin_580614002 小时前
如何防止SQL注入泄露元数据_限制数据库信息查询权限
jvm·数据库·python
2301_777599372 小时前
mysql如何编写递归存储过程_mysql max_sp_recursion_depth设置
jvm·数据库·python
ofoxcoding2 小时前
GPT-5.4 API 怎么低延迟调用?2026 年 5 种接入方案实测对比
python·gpt·ai·flask
lsx2024062 小时前
PostgreSQL WITH 子句详解
开发语言
baidu_340998822 小时前
mysql如何导出表结构而不导出数据_mysqldump无数据模式
jvm·数据库·python
Wyz201210242 小时前
C#怎么判断网络是否掉线_C#如何实现心跳包检测机制【进阶】
jvm·数据库·python
m0_377618232 小时前
Redis如何利用位图快速判断数据存在性
jvm·数据库·python