news 2026/8/5 12:02:06

使用docker部署python应用上线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用docker部署python应用上线

程序员都遇到过上线部署项目的问题,那么在python中怎么部署一个应用呢?其实现在大家都用docker打包后进行部署。

为什么要用Docker?

同事是个老程序员,什么都喜欢手动,后来部署python应用他就出现了这些问题:

  1. 开发环境Python 3.9,服务器是3.6,某个语法不支持
  2. 本地用SQLite,线上用MySQL,连接方式完全不一样
  3. 依赖库版本对不上,一个隐蔽的bug只在生产环境出现

他折腾了几天。如果用Docker,这些问题根本不会出现。

第一步

在打包之前,先整理检查一下你的应用。以我的manyan项目为例:

manyan/ ├── app.py # 主程序 ├── requirements.txt # 依赖清单 ├── config/ # 配置文件 ├── logs/ # 日志目录 └── migrations/ # 数据库迁移

关键检查点:

  • 所有依赖都在requirements.txt里吗?(用pip freeze > requirements.txt检查)
  • 敏感信息(密码、API密钥)从代码里剥离了吗?
  • 日志是写到文件还是标准输出?(容器里建议用标准输出)

第二步

写Dockerfile配置文件,就是告诉Docker怎么打包你的应用。这是我给manyan项目写的:

# 选择基础镜像:Python 3.9的轻量版 FROM python:3.9-slim # 设置工作目录:容器里的/app目录 WORKDIR /app # 先复制依赖文件,这样能利用Docker的缓存层 COPY requirements.txt . # 安装依赖(清华源加速) RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制整个项目代码 COPY . . # 设置时区(避免日志时间不对) RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 创建一个非root用户运行应用(安全考虑) RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app USER appuser # 告诉Docker怎么启动应用 CMD ["gunicorn", "--bind", "0.0.0.0:8080", "--workers", "3", "app:app"]

关键点:

  • 分阶段复制:先复制requirements.txt,这样改代码时不用重新安装依赖
  • 非root用户:用root跑应用是大忌
  • 国内镜像源:加速安装过程

第三步

打包前先本地测试:

# 1. 构建镜像(最后的点表示当前目录)docker build -t manyan:latest.# 2. 运行容器(-d后台运行,-p端口映射)docker run -d --name manyan-test -p8000:8080 manyan:latest# 3. 测试访问curlhttp://localhost:8000/health# 4. 查看日志docker logs manyan-test# 5. 进入容器看看(调试用)dockerexec-it manyan-test /bin/bash

如果一切正常,你会看到应用在容器里欢快地跑着。

第四步

正确设置和读取配置文件。别把数据库密码写在代码里,然后打包进镜像了…

正确做法:环境变量 + 配置文件挂载

# app.py里这样读取配置importosfromdotenvimportload_dotenv load_dotenv()# 加载.env文件DATABASE_URL=os.getenv('DATABASE_URL','sqlite:///local.db')DEBUG=os.getenv('DEBUG','False').lower()=='true'

然后在运行容器时传入:

docker run -d\--name manyan\-p8000:8080\-eDATABASE_URL=mysql://user:pass@db:3306/manyan\-eDEBUG=False\-v$(pwd)/config:/app/config\manyan:latest

或者用.env文件:

# .env文件DATABASE_URL=mysql://user:pass@db:3306/manyanDEBUG=FalseREDIS_URL=redis://redis:6379/0# 运行docker run --env-file .env -p8000:8080 manyan:latest

第五步

多服务协作,真实应用很少单打独斗。manyan需要PostgreSQL数据库和Redis缓存:

# docker-compose.ymlversion:'3.8'services:# 主应用manyan:build:.ports:-"8000:8080"environment:-DATABASE_URL=postgresql://manyan_user:password@db:5432/manyan_db-REDIS_URL=redis://redis:6379/0depends_on:-db-redisvolumes:-./logs:/app/logs# 日志持久化restart:unless-stopped# 自动重启# 数据库db:image:postgres:13environment:POSTGRES_USER:manyan_userPOSTGRES_PASSWORD:passwordPOSTGRES_DB:manyan_dbvolumes:-postgres_data:/var/lib/postgresql/data# Redisredis:image:redis:6-alpinecommand:redis-server--appendonly yesvolumes:-redis_data:/datavolumes:postgres_data:redis_data:

启动整个栈:

docker-compose up -d

一行命令,三个服务全部启动,网络自动配置好。

第六步

本地测试好了,现在要上线。

方案A:简单直接(适合小项目)

# 1. 把代码传到服务器scp-r manyan user@server:/app/# 2. 在服务器上构建和运行sshuser@servercd/app/manyan docker-compose up -d

方案B:镜像仓库(更正规)

# 1. 推送到Docker Hubdocker tag manyan:latest yourname/manyan:1.0 docker push yourname/manyan:1.0# 2. 服务器拉取并运行docker pull yourname/manyan:1.0 docker run -d --name manyan -p8000:8080 yourname/manyan:1.0

方案C:自动化部署(GitHub Actions)

name:自动部署on:[push]jobs:deploy:runs-on:ubuntu-lateststeps:-name:部署到服务器uses:appleboy/ssh-action@v0.1.4with:host:${{secrets.SERVER_HOST}}username:${{secrets.SERVER_USER}}key:${{secrets.SSH_KEY}}script:|cd /app/manyan git pull docker-compose down docker-compose build docker-compose up -d

生产环境优化

默认配置能用,但生产环境需要更多考虑:

  1. 资源限制——防止一个容器吃光所有内存
manyan:deploy:resources:limits:cpus:'1'memory:512Mreservations:memory:256M
  1. 健康检查——让Docker知道应用是否健康
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1
  1. 日志驱动——更好的日志管理
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3...

常见坑和填坑指南

坑1:容器时区不对
解决:Dockerfile里设置时区,或者运行容器时加-e TZ=Asia/Shanghai

坑2:应用写文件,重启后没了
解决:用volumes挂载需要持久化的目录

坑3:性能比直接部署慢
解决:可能是虚拟化开销,对于性能敏感应用,考虑–network=host模式

坑4:镜像太大,传输慢
解决:用alpine基础镜像,多阶段构建,清理不必要的文件

监控和维护:上线只是开始

应用跑起来后:

# 查看状态docker-composeps# 查看日志docker-compose logs -f manyan# 进入容器调试docker-composeexecmanyan /bin/bash# 更新应用docker-compose pull manyan docker-compose up -d# 备份数据docker-composeexecdb pg_dumpall -U postgres>backup.sql

什么时候不该用Docker?

Docker不是万能的。如果你的应用:

  • 对性能极端敏感(高频交易系统)
  • 需要特殊硬件访问(GPU直通)
  • 只是简单的脚本,跑完就结束
  • 团队完全不懂容器技术

那可能直接部署更合适。

说点实在的

我第一次用Docker部署时,花了三天时间。现在,从零部署一个Python应用到上线,大概30分钟。

关键不是技术多先进,而是形成流程:

  1. 写代码 → 2. 写Dockerfile → 3. 本地测试 → 4. 推仓库 → 5. 服务器拉取运行

这套流程熟了之后,部署从玄学变成机械操作。再也不用说“我本地跑得好好的”了,因为本地和线上环境一模一样。

你的下一个Python项目,试试用Docker打包。第一次可能有点磕绊,但一旦跑通,你就回不去了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 17:39:59

高性能波形发生器的DDS算法优化策略

如何让DDS波形发生器“又快又准”?——从算法到工程的深度优化实践你有没有遇到过这样的情况:明明设计了一个32位相位累加器,频率分辨率标称能达到0.1 Hz,可实际输出的正弦波一用频谱仪看,杂散满屏飞,THD&a…

作者头像 李华
网站建设 2026/7/31 11:29:59

高速PCB布局布线实战案例(Altium Designer实现)

高速PCB设计实战:从DDR3接口到Altium Designer的深度落地你有没有遇到过这样的情况——电路板焊接完成,上电后FPGA和DDR3就是“对不上眼”,数据读写频繁出错?示波器一测,DQS信号采样窗口缩得像条缝,时序裕量…

作者头像 李华
网站建设 2026/8/3 5:59:23

新手友好型AI平台:Anything-LLM安装配置图文教程

新手友好型AI平台:Anything-LLM安装配置图文教程 在当今信息爆炸的时代,我们每天都在与大量文档打交道——合同、报告、技术手册、学习资料……但真正能被“激活”的知识却少之又少。你是否曾为查找某个条款翻遍几十页PDF?是否希望大模型不仅…

作者头像 李华
网站建设 2026/8/2 22:59:09

降低AI使用门槛:Anything-LLM对非技术人员有多友好?

降低AI使用门槛:Anything-LLM对非技术人员有多友好? 在今天,几乎每个人都听说过“大模型”和“AI助手”。但如果你不是程序员、不懂机器学习、甚至对命令行都有点发怵——你真的能用上这些前沿技术吗?还是说,它们依然…

作者头像 李华
网站建设 2026/7/30 8:45:55

19、深入了解系统监控:Procmon 实用指南

深入了解系统监控:Procmon 实用指南 1. 过滤与高级输出 在系统监控中,Procmon 提供了多种过滤选项,以帮助用户聚焦于特定的系统活动。以下这些低级别操作通常会被默认过滤: - 名称以 IRP_MJ_ 开头的操作,这些是 Windows 驱动用于文件或设备 I/O、即插即用(PnP)、电…

作者头像 李华
网站建设 2026/7/31 7:53:36

20、进程监视器(Process Monitor)使用指南

进程监视器(Process Monitor)使用指南 1. 查看堆栈跟踪符号 若要查看堆栈跟踪中的符号,捕获跟踪的系统无需安装调试工具或配置符号,但查看跟踪的系统必须同时具备这两者。此外,该系统还必须能够访问跟踪系统的符号文件和二进制文件。对于 Windows 文件,Microsoft 公共符…

作者头像 李华