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

基于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):

    txt 复制代码
    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.手动进入容器验证

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

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部署实现了:

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

建议后续改进:

  1. 添加健康检查接口
  2. 配置日志轮转
  3. 设置生产环境配置(关闭debug模式)
相关推荐
Anarkh_Lee1 小时前
Neo4j在win下安装教程(docker环境)
docker·容器·neo4j
正经教主2 小时前
【问题】解决docker的方式安装n8n,找不到docker.n8n.io/n8nio/n8n:latest镜像的问题
运维·docker·容器·n8n
joker_zsl4 小时前
docker的安装和简单使用(ubuntu环境)
运维·docker·容器
啥都想学的又啥都不会的研究生4 小时前
Kubernetes in action-初相识
java·docker·微服务·容器·kubernetes·etcd·kubelet
江畔独步6 小时前
docker容器监控&自动恢复
docker·容器·eureka
iangyu7 小时前
centos7部署k8s集群
云原生·容器·kubernetes
海绵波波1078 小时前
玉米产量遥感估产系统的开发实践(持续迭代与更新)
python·flask
时迁2479 小时前
【k8s】k8s是怎么实现自动扩缩的
云原生·容器·kubernetes·k8s
诡异森林。12 小时前
Docker--Docker网络原理
网络·docker·容器