基于Docker的Flask项目部署完整指南

发布于:2025-05-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

基于Docker的Flask项目部署完整指南

项目结构与文件说明

TextWeb/
├── .dockerignore         # Docker构建忽略配置
├── Dockerfile            # Docker镜像构建文件
├── requirements.txt      # Python依赖清单
└── WebServer/
    └── main.py           # Flask主程序

核心代码解析

main.py

from flask import Flask, jsonify

app = Flask(__name__)
@app.route('/', methods=['GET'])
def start_conversation():
    try:
        return jsonify({"message": "Hi!!!"})  # 返回JSON格式响应
    except Exception as e:
        return jsonify({"error": str(e)}), 500  # 异常处理

if __name__ == '__main__':
    app.run(
        host='0.0.0.0',    # 允许外部访问
        port=8099,         # 指定服务端口
        debug=True,        # 调试模式(生产环境应关闭)
        use_reloader=False # 禁用自动重载
    )

requirements解析

flask==3.0.0

Dockerfile解析

FROM python:3.11-slim     # 基础镜像(轻量级Python环境)

WORKDIR /app              # 设置容器内工作目录

# 依赖安装(优先复制requirements.txt利用缓存)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt  # 安装依赖且不缓存

COPY . .                 # 复制项目文件

EXPOSE 8099              # 声明暴露端口(需与实际运行时映射端口配合)

CMD ["python", "WebServer/main.py"]  # 容器启动命令

.dockerignore说明

# 忽略非必要文件,加速构建过程
venv/                   # 本地虚拟环境
__pycache__/            # Python字节码缓存
.git/                   # 版本控制目录
*.log                   # 日志文件
Dockerfile              # 自身文件(避免递归复制)

完整部署流程

1. 构建Docker镜像

docker build -t textweb-app:1.0 -f Dockerfile .
  • -t textweb-app:1.0:指定镜像名称与标签
  • -f Dockerfile:显式指定Dockerfile路径(默认可省略)
  • .:构建上下文路径(当前目录)

2. 运行容器

docker run -d --name textweb-container -p 8099:8099 textweb-app:1.0
  • -d:后台运行(detached模式)
  • --name:自定义容器名称
  • -p 宿主机端口:容器端口:端口映射绑定

3. 验证服务

curl http://localhost:8099
# 预期输出:{"message":"Hi!!!"}
docker logs -f textweb-container  # 实时查看容器日志

关键名称解析

名称 作用域 出现位置 说明
textweb-app:1.0 镜像 docker images 镜像标识符(名称:标签)
textweb-container 容器 docker ps 运行中的容器实例名称
/app 容器内部 Docker容器文件系统 WORKDIR指定的工作目录

常见问题排查

1. 端口冲突

Error: Port 8099 is already in use

解决方案:修改docker内部8099修改到别的端口如8080

# 查看占用进程
sudo lsof -i :8099

# 或修改映射端口
docker run -p 8080:8099 [...]

2. 依赖安装失败

ERROR: Could not find a version that satisfies the requirement flask==3.0.0

处理方法:

  • 检查requirements.txt拼写
  • 确认PyPI源可用性(可添加清华源):
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple [...]

3. 容器启动失败

docker logs textweb-container  # 查看错误日志
# 常见错误:模块导入错误
# 检查文件路径是否正确(确保WebServer目录存在)

4. 镜像体积优化

原始镜像约1GB+,优化建议:

# 使用多阶段构建
FROM python:3.11-slim as builder
# ...安装步骤...

FROM python:3.11-alpine  # 最终使用更小基础镜像
COPY --from=builder /app /app

5. 启动成功无法访问

在docker中运行后提示运行成功,但是在局域网内无法访问到服务:

1.检查容器运行状态

查看当前运行的容器:

docker ps
  • 预期输出:
    如果容器正在运行,你会看到类似以下信息(注意 STATUS 为 Up):
    CONTAINER ID   IMAGE              COMMAND           CREATED        STATUS        PORTS                    NAMES
    a1b2c3d4e5f6   textweb-container    "python main.py"  5 minutes ago  Up 5 minutes  0.0.0.0:8099->8099/tcp   textweb-app
    
  • 关键字段:
    • PORTS:确认端口映射是否正确(如 8088->8088)。
    • STATUS:Up 表示容器正在运行。
2.手动进入容器验证

进入容器内部,测试服务连接:

docker exec -it <container_id_or_name> /bin/bash

curl http://localhost:8099

如果访问失败,说明启动错误,需要检查代码或端口冲突。
如果访问成功,继续下面操作。

3.从宿主机访问服务

直接在CMD上运行:

curl http://localhost:8099

可能的问题:

  • 无响应:检查防火墙或安全组是否放行 8088 端口。
  • Connection refused:容器内服务未监听 0.0.0.0(需确保代码中绑定到 0.0.0.0)。
  • docker设置问题:修改配置如下图

在这里插入图片描述

总结

通过Docker部署实现了:

  • 环境隔离:确保开发/生产环境一致性
  • 快速部署:镜像可重复使用
  • 资源控制:通过容器限制资源使用

建议后续改进:

  1. 添加健康检查接口
  2. 配置日志轮转
  3. 设置生产环境配置(关闭debug模式)

网站公告

今日签到

点亮在社区的每一天
去签到