惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

博客园 - AlfredZhao

理解Oracle Property Graph:以账户转账示例完成图特性最小测试 APEX 无法分配 SH 用户?一个存储过程轻松解决 SH 中文化样例数据使用手册 Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL 进程都杀了,为什么 `netstat` 还能看到端口? MAC 空间告急?Codex 的 156GB 缓存垃圾,这样清! 人工清理问题数据:先查准,再删除 TK(Trusted Knowledge)为何而生? 使用快捷键快速切换 Mac 外接显示器模式 客户环境 Nginx 配置:流式报表与超时排查要点 Security Central:数据库安全的统一控制与运营平台 Palantir 眼中的一次“订单可能延期”,如何成为实时决策的起点? 从一条订单消息到 Bronze、Silver、Gold:我的第一次 Kafka + Lakehouse 实验 UUID v4 与 v7:同样是唯一 ID,为什么数据库表现可能完全不同? 用 crontab 给 LLM 使用量装上“监控眼” DeepSeek 与 GPT API 价格调整:该关注什么? 查看 Oracle 数据库中的定时任务执行情况 Codex 专用用户登录后自动进入默认项目目录 Mac 小技巧:用方向键优雅处理超长网址 Oracle GDD 与 Raft:别把共识机制和数据主权混为一谈 在 Oracle APEX 中用 BGE_BASE 生成向量:从模型导入到历史数据更新 行业人+AI:真正有价值的四个关键要素 知识库文件解析失败:一次由 Domain Index 引发的定位记录 Unicode 码位数、UTF-8 字节数、中英文差异和 Oracle 长度别再混淆了 Skill 的使用:从路径到能力边界 切换 Embedding 模型时,千万别忽略历史向量维度 kbot 适配 GPT-5.6:一次参数兼容性排查 Git 打 Tag 上传 GitHub 遇到 SSH 超时,如何处理? SQL JOIN 写法:把多表关联条件写清楚 VS Code 一键美化 JSON:不用安装插件
Docker 快速入门:手把手教你打包 Python 应用
AlfredZhao · 2026-01-26 · via 博客园 - AlfredZhao

2026-01-26 22:51  AlfredZhao  阅读(178)  评论()    收藏  举报

在云原生时代,Docker 是每一位开发者的必备技能。它解决了“环境配置难、版本冲突多”的痛点。今天,笔者将带你实战演练:如何将一个 Python Web 应用打包,并运行在自定义的端口上。


01 | 什么是 Docker?为什么它是“集装箱”?

搬家时,散装家具容易磕碰丢件。
Docker 的做法是: 租一个标准集装箱,把你的代码、Python 解释器、第三方库全部装进去。

  • 镜像 (Image):封了条的集装箱模板,一旦打包,任何地方运行都一模一样。
  • 容器 (Container):集装箱落地开门,真正跑起来的应用实例。

02 | 环境搭建:在线与离线安装

有些系统已经预装好了docker或者podman(后面提到),可以跳过此步骤,如果你的环境两者都没有,可以这样安装:

① 在线一键安装

对于能联网的服务器:

curl -fsSL https://get.docker.com | bash -s docker
sudo systemctl enable --now docker
# 验证:看到 active (running) 说明成功
sudo systemctl status docker

② 离线安装(内网环境)

  1. 下载 Docker 静态二进制 .tgz 包。
  2. 解压并将 docker/* 目录下的所有文件拷贝到 /usr/bin/
  3. 执行 sudo dockerd & 启动后台服务。

③ 彻底删除现有容器环境(特殊情况)

该步骤不是必须,仅当现有容器环境有问题,导致冲突之类,可以尝试彻底卸载现有的容器环境(执行前必须要确定该环境的现有容器环境可删除,谨慎操作):

# 彻底删除docker(仅供参考)
sudo yum remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
 
# 彻底删除podman(仅供参考)
sudo yum remove -y podman
rm -rf ~/.local/share/containers/
rm -rf ~/.config/containers/
sudo rm -rf /etc/containers/ /var/lib/containers/

④ 为啥我的系统安装了假docker?

在 RHEL 8/9 及其衍生版(如笔者使用的 Oracle Linux)中,因为 Red Hat 默认推行 Podman。所以当只运行 dnf install docker 时,会发现系统实际上安装了一个名为 podman-docker 的软件包。

比如笔者在OEL系统上执行:

$ sudo dnf install docker

实际就是装了podman,但基本上可以 99% 兼容 Docker 命令。

$ docker ps
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

可以看到,执行docker命令,会有明确的提示“正在使用 Podman 模拟 Docker 命令行”。不过如果用途只是普通学习或运行标准容器,Podman 几乎能无缝替代 Docker。


03 | 实战打包:WhaleStudy 应用(Python 版)

假设我们要开发一个名为 WhaleStudy 的应用,并在 10090 端口提供服务。

① 准备代码与依赖

whalestudy 文件夹下创建两个文件:

文件 1:app.py(Python 源码)

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return "<h1>WhaleStudy: Python in Docker is Running on 10090!</h1>"

if __name__ == '__main__':
    # 必须监听 0.0.0.0,否则 Docker 外部无法访问
    app.run(host='0.0.0.0', port=10090)

文件 2:requirements.txt(依赖清单)

flask==3.0.0

② 编写“配方”:Dockerfile

创建名为 Dockerfile 的文件(无后缀):

# 1. 基础镜像:使用轻量版 Python 3.9
FROM python:3.9-slim

# 2. 设置工作目录
WORKDIR /app

# 3. 拷贝依赖清单并安装(使用清华源加速)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 4. 拷贝源码
COPY app.py .

# 5. 声明端口
EXPOSE 10090

# 6. 启动指令
CMD ["python", "app.py"]

③ 构建镜像 (Build)

# -t 指定名字和版本,注意末尾有一个“.”代表当前目录
docker build -t whalestudy-py:v1.0 .

④ 运行容器 (Run)

# -d 后台运行,-p 宿主机端口:容器端口
docker run -d -p 10090:10090 --name my_whale_app whalestudy-py:v1.0

04 | 发表与离线分发

① 在线发表(推送到仓库)

docker login
docker tag whalestudy-py:v1.0 yourname/whalestudy-py:v1.0
docker push yourname/whalestudy-py:v1.0

② 离线“背”走镜像(企业内部项目最常用)

# 在开发机导出
docker save -o whalestudy_py_v1.tar whalestudy-py:v1.0

# 在客户机导入
docker load -i whalestudy_py_v1.tar

# 在客户机查找导入的镜像
docker images

# 在客户机运行(实际有很多参数按需可配,这里只做最简示例)
docker run -d -p 10090:10090 --name my_whale_app whalestudy-py:v1.0

③ 确认客户机服务正常

按照上面的例子,正常网页访问10090端口,就可以正常显示测试界面:

另外,可以使用下面常用的docker命令,实现对某个具体容器的日志排查,或直接进入到某个容器内部直接操作:

# 查看某个容器的日志
docker logs -f [容器名]

# 进入到某个容器
docker exec -it [容器名] /bin/bash

05 | 笔者结语

使用 Docker 运行 Python,最核心的优势是 “环境锁死”。你再也不用担心服务器上缺少某个库或者 Python 版本不对。端口的映射也确保了你的服务在复杂网络环境中的清晰独立。