基于Docker的Flask项目部署完整指南
项目结构与文件说明
TEXT
TextWeb/
├── .dockerignore # Docker构建忽略配置
├── Dockerfile # Docker镜像构建文件
├── requirements.txt # Python依赖清单
└── WebServer/
└── main.py # Flask主程序
核心代码解析
main.py
python
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解析
txt
flask==3.0.0
Dockerfile解析
txt
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说明
txt
# 忽略非必要文件,加速构建过程
venv/ # 本地虚拟环境
__pycache__/ # Python字节码缓存
.git/ # 版本控制目录
*.log # 日志文件
Dockerfile # 自身文件(避免递归复制)
完整部署流程
1. 构建Docker镜像
cmd
docker build -t textweb-app:1.0 -f Dockerfile .
-t textweb-app:1.0
:指定镜像名称与标签-f Dockerfile
:显式指定Dockerfile路径(默认可省略).
:构建上下文路径(当前目录)
2. 运行容器
cmd
docker run -d --name textweb-container -p 8099:8099 textweb-app:1.0
-d
:后台运行(detached模式)--name
:自定义容器名称-p 宿主机端口:容器端口
:端口映射绑定
3. 验证服务
cmd
curl http://localhost:8099
# 预期输出:{"message":"Hi!!!"}
cmd
docker logs -f textweb-container # 实时查看容器日志
关键名称解析
名称 | 作用域 | 出现位置 | 说明 |
---|---|---|---|
textweb-app:1.0 | 镜像 | docker images | 镜像标识符(名称:标签) |
textweb-container | 容器 | docker ps | 运行中的容器实例名称 |
/app | 容器内部 | Docker容器文件系统 | WORKDIR指定的工作目录 |
常见问题排查
1. 端口冲突
cmd
Error: Port 8099 is already in use
解决方案:修改docker内部8099修改到别的端口如8080
cmd
# 查看占用进程
sudo lsof -i :8099
# 或修改映射端口
docker run -p 8080:8099 [...]
2. 依赖安装失败
cmd
ERROR: Could not find a version that satisfies the requirement flask==3.0.0
处理方法:
- 检查
requirements.txt
拼写 - 确认PyPI源可用性(可添加清华源):
cmd
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple [...]
3. 容器启动失败
cmd
docker logs textweb-container # 查看错误日志
# 常见错误:模块导入错误
# 检查文件路径是否正确(确保WebServer目录存在)
4. 镜像体积优化
原始镜像约1GB+,优化建议:
txt
# 使用多阶段构建
FROM python:3.11-slim as builder
# ...安装步骤...
FROM python:3.11-alpine # 最终使用更小基础镜像
COPY --from=builder /app /app
5. 启动成功无法访问
在docker中运行后提示运行成功,但是在局域网内无法访问到服务:
1.检查容器运行状态
查看当前运行的容器:
CMD
docker ps
-
预期输出:
如果容器正在运行,你会看到类似以下信息(注意 STATUS 为 Up):txtCONTAINER 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.手动进入容器验证
进入容器内部,测试服务连接:
txt
docker exec -it <container_id_or_name> /bin/bash
curl http://localhost:8099
如果访问失败,说明启动错误,需要检查代码或端口冲突。
如果访问成功,继续下面操作。
3.从宿主机访问服务
直接在CMD上运行:
txt
curl http://localhost:8099
可能的问题:
- 无响应:检查防火墙或安全组是否放行 8088 端口。
- Connection refused:容器内服务未监听 0.0.0.0(需确保代码中绑定到 0.0.0.0)。
- docker设置问题:修改配置如下图

总结
通过Docker部署实现了:
- 环境隔离:确保开发/生产环境一致性
- 快速部署:镜像可重复使用
- 资源控制:通过容器限制资源使用
建议后续改进:
- 添加健康检查接口
- 配置日志轮转
- 设置生产环境配置(关闭debug模式)