基于Docker的Flask项目部署完整指南
基于Docker的Flask项目部署完整指南
项目结构与文件说明
TextWeb/
├── .dockerignore # Docker构建忽略配置
├── Dockerfile # Docker镜像构建文件
├── requirements.txt # Python依赖清单
└── WebServer/└── main.py # Flask主程序
核心代码解析
main.py
from flask import Flask, jsonifyapp = 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/bashcurl http://localhost:8099
如果访问失败,说明启动错误,需要检查代码或端口冲突。
如果访问成功,继续下面操作。
3.从宿主机访问服务
直接在CMD上运行:
curl http://localhost:8099
可能的问题:
- 无响应:检查防火墙或安全组是否放行 8088 端口。
- Connection refused:容器内服务未监听 0.0.0.0(需确保代码中绑定到 0.0.0.0)。
- docker设置问题:修改配置如下图
总结
通过Docker部署实现了:
- 环境隔离:确保开发/生产环境一致性
- 快速部署:镜像可重复使用
- 资源控制:通过容器限制资源使用
建议后续改进:
- 添加健康检查接口
- 配置日志轮转
- 设置生产环境配置(关闭debug模式)