news 2026/9/7 11:00:24

使用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/9/2 8:30:02

自动化知识整理时代来临:Anything-LLM实战演示

自动化知识整理时代来临:Anything-LLM实战演示 在企业知识库越积越多,但员工却越来越难找到答案的今天,一个新问题摆在我们面前:如何让AI真正“读懂”公司内部的成千上万份文档,并准确回答“我有多少年假?”…

作者头像 李华
网站建设 2026/9/2 23:02:42

12.22 注册小程序

Mp (mini progime) 小程序:项目上线需要年审,年审30元 一.注册小程序的步骤注册 注册注意事项: 一个邮箱只能注册一个小程序 小程序注册成功后,需要进入邮箱进行激活。 登录步骤: 登录微信公众平台,h…

作者头像 李华
网站建设 2026/9/3 1:01:26

脚本工具 批量md转html

md转html,便于打包进APP就算以后安卓不兼容,APP不能用,自己做个离线网页也能用一辈子一#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Termux 批量 md → 手机竖屏 html """import os import pathlib i…

作者头像 李华
网站建设 2026/9/3 21:51:34

37、安全实用工具指南

安全实用工具指南 1. Sysmon 错误报告 Sysmon 在检测到可能影响其运行的意外内部状况时,会在 Sysmon 事件日志中记录错误报告事件。如果你看到此类事件,请通过指定论坛报告。错误报告事件包含以下数据: - UtcTime :错误记录的通用协调时间(UTC),格式为 yyyy-MM-dd H…

作者头像 李华
网站建设 2026/9/2 21:27:08

儿童青少年近视,原来得这样防控

近年来,儿童青少年近视率居高不下,已成为影响国民健康的重要公共卫生问题。教育部数据显示,我国中小学生近视率已超50%,且呈现低龄化、重度化趋势。近视不仅影响孩子的日常学习和生活质量,更可能对未来职业选择、身心健…

作者头像 李华