想象这样一个开发场景:你的代码已经写好了,正准备部署到一台新服务器上。但一检查,发现服务器上只有陈旧的 Python 2 和 Python 3.6,而你项目依赖的是最新的 Python 3.12。这时候该怎么办?
传统方法是编译安装新版本的 Python,但这个过程往往伴随着各种依赖缺失和编译错误,非常折腾。如果你执着于此,可以参考这篇关于避坑-编译安装 Python 时遇到无法构建 SSL的文章。
更优雅、更高效的方案是使用 Docker。它允许你无需构建自定义镜像就能直接运行项目,相当于随身携带了一个指定版本的完整 Python 运行环境。接下来,我们就分享两种直接使用 Docker 运行 Python 项目的方法:单命令模式和 Docker Compose 编排模式。
使用 Docker 单命令运行
这种方法最为直接,适合快速测试或执行一次性任务。
- 打开终端,进入你的 Python 项目根目录。
- 执行以下命令,将当前目录挂载到容器中并运行你的脚本:
docker run -it --rm -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp python:3.12-alpine python your_script.py
让我们拆解一下这个命令的每个部分:
-it:保持容器的标准输入打开,并分配一个伪终端,方便交互。
--rm:容器退出后自动删除,避免产生一堆无用的停止容器。
-v "$(pwd)":/usr/src/myapp:这是挂载卷的关键参数。它将宿主机的当前目录($(pwd))映射到容器内的 /usr/src/myapp 路径。
-w /usr/src/myapp:设置容器启动后的工作目录为 /usr/src/myapp。
python:3.12-alpine:指定使用的 Docker 镜像。这里用了 Alpine 版本的 Python 3.12 镜像,体积小。你可以根据需要替换为其他官方标签,如 python:3.11, python:3.8-slim 等。
python your_script.py:容器启动后要执行的命令,即运行你的 Python 脚本。
使用 Docker Compose 运行
当你的项目需要更复杂的配置(如设置环境变量、映射多个端口)或未来可能引入其他服务(如数据库)时,使用 Docker Compose 是更规范、可维护性更高的选择。
- 在你的项目根目录下,创建一个
docker-compose.yml 文件。
- 编辑该文件,添加如下基础配置(可根据实际情况调整):
version: '3.8'
services:
python-app:
image: python:3.8
volumes:
- .:/usr/src/myapp
working_dir: /usr/src/myapp
command: python your_script.py
version: 指定 Compose 文件格式版本。
services.python-app: 定义了一个名为 python-app 的服务。
image: 指定服务使用的镜像。
volumes: 将宿主机当前目录挂载到容器内,实现代码同步。
working_dir: 设置容器内的工作目录。
command: 容器启动时执行的命令。
- 在包含
docker-compose.yml 文件的目录下,打开终端并运行:
docker-compose up -d
这个命令会根据 YAML 文件的配置启动服务。-d 参数表示在后台运行。
进阶配置示例
在实际项目中,你可能需要配置时区、使用宿主机代理、持久化依赖包等。下面是一个更贴近生产需求的 docker-compose.yml 示例:
version: '3.8'
services:
auto_reserve:
image: python:3.12-alpine
container_name: auto_reserve
restart: always
environment:
- TZ=Asia/Shanghai
- http_proxy=http://172.17.0.1:7890
- https_proxy=http://172.17.0.1:7890
- all_proxy=http://172.17.0.1:7890
volumes:
- .:/app
- ./site-packages:/usr/local/lib/python3.12/site-packages
working_dir: /app
command: /app/init.sh
对应的初始化脚本 init.sh 内容如下:
#!/bin/sh
pip install --no-cache-dir -r requirements.txt
pytest
python startup.py
这个配置实现了:设置容器时区、配置网络代理、将 pip 安装的包持久化到宿主机 ./site-packages 目录(避免每次重启重装),并通过一个启动脚本顺序执行安装依赖、运行测试和启动主程序。
Docker Compose 常用命令速查
掌握以下命令,可以高效地管理你的 Compose 项目:
| 命令 |
描述 |
docker-compose up |
构建、创建、启动并关联服务容器。 |
docker-compose down |
停止并移除由 up 创建的容器、网络等。 |
docker-compose start/stop/restart |
启动/停止/重启已存在的服务容器。 |
docker-compose build |
构建或重新构建服务镜像。 |
docker-compose logs |
查看服务容器的日志输出。 |
docker-compose exec |
在运行中的服务容器内执行命令(如 docker-compose exec python-app bash)。 |
docker-compose ps |
列出项目中所有容器的状态。 |
docker-compose run |
在临时容器中运行一次性命令(常用于执行数据库迁移等)。 |
这些方法的核心思想都是利用官方镜像的纯净环境,通过卷挂载将你的项目代码“注入”容器中执行。它完美解决了环境不一致的痛点,无需在服务器上进行复杂的运维配置,极大地简化了部署流程。
希望这份指南能帮助你更顺畅地使用 Docker。如果你想深入探讨更多云原生或开发部署的话题,欢迎到 云栈社区 与其他开发者交流。
|