用 Docker 部署 Python 应用:从本地开发到云端运行的实用指南

举报
yd_253818178 发表于 2026/11/09 23:19:26 2026/11/09
【摘要】 本文介绍如何用 Docker 把 Python 应用打包成镜像并部署到 Linux 服务器,覆盖 Dockerfile 编写、镜像构建与运行、Docker Compose 多服务管理及常见问题排查。

一、为什么用 Docker 部署 Python 应用

Python 项目常遇到“在我机器上能跑,到服务器上就报错”的问题:Python 版本不同、依赖库版本冲突、系统缺少编译工具,都会导致部署失败。Docker 把应用和运行环境打包成镜像,镜像在哪里运行,结果都一样。对个人开发者和小团队来说,开发、测试、生产可以用同一份环境,大大减少排错时间。

二、准备工作

准备一台 Linux 服务器或本地 Linux 环境,安装 Docker Engine 与 Docker Compose。安装后先检查版本,确认命令可用:

docker --version
docker compose version

如果使用云服务器,记得在安全组放行应用端口,例如 8000 端口。

三、写一个最小可用的 Dockerfile

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]

三个注意点:使用 slim 基础镜像减小体积,先复制 requirements.txt 再安装依赖以利用镜像分层缓存,使用国内镜像源加速安装。

四、构建与运行

docker build -t myapp:1.0 .
docker run -d --name myapp -p 8000:8000 myapp:1.0
docker ps
curl http://localhost:8000/health

启动后用 docker ps 查看容器状态,用 docker logs -f myapp 跟踪日志,用 curl 请求健康检查接口确认服务可用。

五、用 Docker Compose 管理多服务

很多 Python 应用还要连接数据库或 Redis,可以用 Compose 一次启动多个容器:

services:
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

执行 docker compose up -d 启动,docker compose down 停止并删除容器,数据卷默认保留,数据不会随容器删除而丢失。

六、Linux 上常用的排查命令

容器启动失败时,先看日志:docker logs --tail 200 容器名;端口被占用时检查监听端口:ss -tlnp | grep 8000;磁盘满了会导致镜像拉取失败:df -h 和 docker system df;内存不足时查看 free -h 与 docker stats。定期执行 docker system prune 清理无用镜像与缓存,但生产环境使用前要先确认。

七、三个常见坑

  1. 镜像里缺少系统依赖:有些 Python 库需要编译,应在 Dockerfile 中用 apt-get 安装 build-essential、libpq-dev 等系统包。
  2. 时区不对导致日志时间错乱:设置环境变量 TZ=Asia/Shanghai,并挂载 /etc/localtime,让容器时间与服务器保持一致。
  3. 代码改了但容器里还是旧版本:修改后需要重新构建镜像;docker run 时用 -v 挂载代码目录只适合本地开发调试,生产环境请使用新镜像。

八、小结

Docker 不是万能药,但它把“环境不一致”这一类问题几乎消灭了。先从一个最小的 Dockerfile 跑通,再逐步加入 Compose、健康检查与日志管理,Python 应用就可以从本地平滑地部署到任何一台 Linux 服务器或云主机上。建议把 Dockerfile、docker-compose.yml 和部署脚本一起放进代码仓库,让每一次部署都可重复、可回滚。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。