Docker 快速入门:手把手教你打包 Python 应用

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


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

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

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

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

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

① 在线一键安装

对于能联网的服务器:

bash 复制代码
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 & 启动后台服务。

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

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

BASH 复制代码
# 彻底删除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系统上执行:

BASH 复制代码
$ sudo dnf install docker

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

BASH 复制代码
$ 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 源码)

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(依赖清单)

text 复制代码
flask==3.0.0

② 编写"配方":Dockerfile

创建名为 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)

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

④ 运行容器 (Run)

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

04 | 发表与离线分发

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

bash 复制代码
docker login
docker tag whalestudy-py:v1.0 yourname/whalestudy-py:v1.0
docker push yourname/whalestudy-py:v1.0

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

bash 复制代码
# 在开发机导出
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命令,实现对某个具体容器的日志排查,或直接进入到某个容器内部直接操作:

bash 复制代码
# 查看某个容器的日志
docker logs -f [容器名]

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

05 | 笔者结语

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

相关推荐
HIT_Weston3 小时前
107、【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(三)
linux·javascript·ubuntu
艾莉丝努力练剑3 小时前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
chinesegf4 小时前
Ubuntu 安装 Python 虚拟环境:常见问题与解决指南
linux·python·ubuntu
学习3人组4 小时前
Docker 容器内文件↔本地双向复制备份
运维·docker·容器
crownyouyou4 小时前
Ubuntu输入法使用回车键后字符间距异常的问题
linux·运维·ubuntu
济6174 小时前
linux 系统移植(第十七期)---Linux 内核移植(5)-- 修改网络驱动(2)--- Ubuntu20.04
linux·运维·网络
街灯L5 小时前
【kylin-Linux】Flash兼容插件包安装
大数据·linux·运维·kylin
Howrun7776 小时前
Linux_C++网络编程四种CS模型
linux·运维·服务器
vortex56 小时前
如何快速删除 Linux 中的海量小文件:告别rm命令的缓慢困境
linux·运维·服务器