第五章-综合实战:从零开始部署一个Flask应用

5.1 项目准备:一个简单的Flask应用

我们创建一个简单的Flask应用,包含以下文件:

复制代码
flask-demo/
├── app.py          # 应用主文件
├── requirements.txt # 依赖列表
└── Dockerfile      # Docker配置文件

app.py内容:

python 复制代码
from flask import Flask
import redis
import os

app = Flask(__name__)

# 从环境变量获取Redis地址,默认localhost
redis_host = os.environ.get('REDIS_HOST', 'localhost')
r = redis.Redis(host=redis_host, port=6379, decode_responses=True)

@app.route('/')
def hello():
    # 访问计数器
    count = r.incr('hits')
    return f'Hello World! I have been seen {count} times.'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

requirements.txt内容:

复制代码
Flask==2.1.0
redis==4.3.0

5.2 编写Dockerfile

Dockerfile内容:

dockerfile 复制代码
# 使用Python 3.9精简版作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装依赖
COPY requirements.txt .
RUN pip install -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动应用
CMD ["python", "app.py"]

5.3 构建和运行

5.3.1 构建镜像

bash 复制代码
# 在flask-demo目录下执行
docker build -t flask-demo:1.0 .

5.3.2 运行容器

由于我们的应用依赖Redis,需要先启动Redis容器:

bash 复制代码
# 启动Redis容器
docker run -d --name my-redis redis:alpine

# 启动Flask应用容器,链接到Redis容器
docker run -d -p 5000:5000 --name my-flask --link my-redis:redis flask-demo:1.0

5.3.3 验证部署

打开浏览器访问http://localhost:5000,应该能看到"Hello World! I have been seen X times."的页面,每次刷新数字都会增加。

5.4 优化改进

5.4.1 使用Docker Compose简化多容器部署

创建docker-compose.yml文件:

yaml 复制代码
version: '3'
services:
  redis:
    image: redis:alpine
    container_name: my-redis
    
  flask:
    build: .
    image: flask-demo:1.0
    container_name: my-flask
    ports:
      - "5000:5000"
    environment:
      - REDIS_HOST=my-redis
    depends_on:
      - redis

然后只需一条命令即可启动整个应用:

bash 复制代码
docker-compose up -d

这个实战项目展示了如何将一个真实的应用通过Docker进行容器化部署,涵盖了镜像构建、容器运行、多容器协作等多个知识点。

下一章,我们将学习Docker Compose,它是管理多容器应用的强大工具。

相关推荐
IT_陈寒21 分钟前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
fliter1 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
luckdewei2 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
fliter2 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪2 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter2 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶3 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
JensCS猿3 小时前
从 Spring Boot 回看 SSM 框架:手动挡与自动挡的驾驶哲学
后端
爱勇宝3 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员
科米米3 小时前
嵌入式日志模块
后端