新手用 Docker 搭建 Python 开发环境:从零跑通第一个数据分析脚本
刚开始学 Python 的朋友,几乎都会遇到同一个问题:明明照着教程敲代码,别人能跑,自己的电脑却报错。十有八九不是代码的问题,而是环境的问题。这篇文章就带你用 Docker 把 Python 开发环境“装进盒子”,一次配置,到处运行。
为什么新手要用 Docker
Python 的环境问题主要来自三个地方:版本、依赖和系统差异。
同一台电脑可能装着 Python 3.9、3.11、3.12,pip 装包时稍不留神就装错了地方;项目 A 要 numpy 1.26,项目 B 要 numpy 2.0,两个版本互相打架;教程在 Linux 下录制,你的 Windows 却没有编译工具。
Docker 的思路很简单:把 Python 解释器、依赖库和代码一起打包进镜像,运行起来就是一个隔离的容器。环境坏了,删掉容器重建一个,不到一分钟;换了电脑,把镜像带过去,行为一模一样。
第一步:安装并验证 Docker
去 Docker 官网下载 Docker Desktop,安装完成后在终端验证:
docker --version
docker run hello-world
看到 “Hello from Docker!” 就说明安装成功。这个 hello-world 镜像很小,专门用来测试 Docker 能不能正常拉取镜像并启动容器。
第二步:写你的第一个 Dockerfile
在项目文件夹新建 Dockerfile:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]
每行只做一件事:FROM 指定基础镜像,python:3.12-slim 轻量够用;WORKDIR 设定容器内工作目录;先单独复制 requirements.txt 再安装依赖,改代码时就不用重装依赖,构建会快很多;最后 CMD 是容器启动时默认执行的命令。
requirements.txt 里先只写一行:
pandas
main.py 也保持简单:
import pandas as pd
data = {"城市": ["北京", "上海", "深圳"], "销量": [120, 150, 180]}
df = pd.DataFrame(data)
print(df)
print("平均销量:", df["销量"].mean())
第三步:构建镜像并运行
在项目目录下执行:
docker build -t my-first-python .
docker run --rm my-first-python
build 按 Dockerfile 一步步生成镜像,-t 是给镜像起名字;run 启动容器执行 main.py,--rm 让容器退出后自动删除,保持环境干净。看到表格和平均销量打印出来,第一个容器化 Python 程序就跑通了。
开发时怎么保持高效
每次改代码都重新构建镜像太慢了。正确做法是把本地代码目录挂载进容器:
docker run --rm -v ${PWD}:/app -w /app python:3.12-slim python main.py
-v 把当前目录挂到容器里的 /app,本地改代码,容器内立即生效;-w 指定工作目录。这样既享受隔离环境,又保留了本地编辑的流畅体验。
新手最容易踩的四个坑
**1. 安装依赖太慢。**国内访问 PyPI 经常超时,pip install 时加上国内镜像源,例如 -i https://pypi.tuna.tsinghua.edu.cn/simple。
**2. 镜像越做越大。**选用 slim 这类小基础镜像,装包时给 pip 加上 --no-cache-dir,不要把缓存打进镜像。
**3. 容器一启动就退出。**容器没有持续运行的任务时会自动退出,这不是 bug。需要交互调试时,用 docker run -it 进入容器内部排查。
**4. 报错信息看不懂。**把完整报错复制给 AI 编程助手,让它帮你定位原因,再对照 Dockerfile 逐行检查。AI 适合解释报错、修补配置,但关键命令一定要自己理解后再执行,不要盲目复制。
今天就能动手的小练习
跑通上面的例子后,再做三件事:把 main.py 换成你自己的脚本,比如读取一个 CSV 文件做简单统计;用 docker images 看看本地有哪些镜像,给镜像换个名字和版本号;用 docker ps -a 查看历史容器,删掉不再需要的容器和镜像。
环境问题一旦被 Docker“收进盒子”,学 Python 的注意力就能回到编程本身。先把这套最小流程跑通,再去学 Docker Compose、多阶段构建这些进阶用法,会顺畅得多。
- 点赞
- 收藏
- 关注作者
评论(0)