百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

第十三节 Docker 环境下 Python 安装与配置全指南

off999 2025-07-10 19:56 18 浏览 0 评论

一、Docker 安装 Python 的两种核心方案

(一)方案一:直接拉取官方镜像

1. 镜像版本选择策略

Docker Hub 上的 Python 官方镜像提供丰富的版本支持,可通过以下方式筛选:

  • 按稳定性选择:python:latest 指向最新稳定版
  • 按版本号选择:如 python:3.9、python:3.8-slim
  • 按轻量化选择:python:3.7-alpine(基于 Alpine 系统,仅 27MB)

2. 拉取指定版本镜像

# 拉取 Python 3.5 版本
docker pull python:3.5

# 拉取 Python 3.8 的 Alpine 轻量版
docker pull python:3.8-alpine

# 拉取最新版本(等价于 python:latest)
docker pull python

3. 本地镜像管理

# 查看本地 Python 镜像列表
docker images python

# 输出示例
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.5                 045767ddf24a        9 days ago          684.1MB
python              3.8-alpine          a1b2c3d4e5f6        2 weeks ago         27.3MB

(二)方案二:通过 Dockerfile 自定义构建

1. 构建环境准备

# 创建项目目录结构
mkdir -p ~/python/myapp
cd ~/python

2. Dockerfile 完整示例

# 基于 Debian Jessie 构建环境
FROM buildpack-deps:jessie

# 清理旧版 Python 残留
RUN apt-get purge -y python.*

# 配置系统编码
ENV LANG C.UTF-8

# 设置 Python 版本与密钥
ENV GPG_KEY 97FC712E4C024BBEA48A61ED3A5CA953F73C700D
ENV PYTHON_VERSION 3.5.1
ENV PYTHON_PIP_VERSION 8.1.2

# 下载并编译 Python 源码
RUN set -ex \
    && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" -o python.tar.xz \
    && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" -o python.tar.xz.asc \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \
    && gpg --batch --verify python.tar.xz.asc python.tar.xz \
    && rm -r "$GNUPGHOME" python.tar.xz.asc \
    && mkdir -p /usr/src/python \
    && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \
    && rm python.tar.xz \
    \
    && cd /usr/src/python \
    && ./configure --enable-shared --enable-unicode=ucs4 \
    && make -j$(nproc) \
    && make install \
    && ldconfig \
    && pip3 install --no-cache-dir --upgrade --ignore-installed pip==$PYTHON_PIP_VERSION \
    && find /usr/local -depth \
        \( \
            -type d -a -name test -o -name tests \
            -o \
            -type f -a -name '*.pyc' -o -name '*.pyo' \
        \) -exec rm -rf '{}' + \
    && rm -rf /usr/src/python ~/.cache

# 创建常用命令软链接
RUN cd /usr/local/bin \
    && ln -s easy_install-3.5 easy_install \
    && ln -s idle3 idle \
    && ln -s pydoc3 pydoc \
    && ln -s python3 python \
    && ln -s python3-config python-config

# 设置默认启动命令
CMD ["python3"]

3. 执行镜像构建

# 在 Dockerfile 所在目录构建镜像
docker build -t python:3.5 .

# 构建成功后查看镜像
docker images python:3.5


二、Python 镜像实战应用

(一)运行 Python 程序示例

1. 准备测试文件

# 在 myapp 目录创建 hello world 程序
cd ~/python/myapp
echo -e "#!/usr/bin/python\nprint(\"Hello, World!\")" > helloworld.py
chmod +x helloworld.py

2. 运行容器并执行程序

# 挂载本地目录并指定工作目录
docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py

# 命令解析:
# -v $PWD/myapp:/usr/src/myapp :将主机当前目录的 myapp 挂载到容器的 /usr/src/myapp
# -w /usr/src/myapp :设置容器的工作目录
# python helloworld.py :执行 Python 程序

# 输出结果
Hello, World!

(二)开发环境最佳实践

1. 挂载代码目录实现热更新

# 假设项目结构为 ~/python/project
docker run -it -v ~/python/project:/app -w /app python:3.8-alpine /bin/bash

# 在容器内安装依赖
apk add --no-cache gcc musl-dev
pip install flask

2. 多容器协同开发(Flask + Redis)

# docker-compose.yml 示例
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - ./app:/app
    depends_on:
      - redis
    environment:
      - FLASK_APP=app.py
      - REDIS_HOST=redis

  redis:
    image: redis:alpine


三、进阶配置与问题解决

(一)镜像优化技巧

1. 使用多阶段构建减少镜像大小

# 构建阶段
FROM python:3.8-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 运行阶段
FROM python:3.8-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages
COPY . .
CMD ["python", "app.py"]

2. 清理构建缓存

# 清理未使用的镜像
docker image prune -a -f

# 清理构建缓存(需Docker 18.09+)
docker builder prune -f

(二)常见问题解决方案

1. pip 安装缓慢问题

# 方法一:修改Dockerfile使用国内源
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 方法二:运行时指定源
docker run -it python:3.8 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask

2. 容器内中文显示问题

# 在Dockerfile中安装中文字体
RUN apt-get update && apt-get install -y \
    ttf-wqy-microhei \
    && fc-cache -f -v \
    && rm -rf /var/lib/apt/lists/*

3. 权限不足问题

# 创建非root用户并切换
RUN useradd -m pythonuser
USER pythonuser
WORKDIR /home/pythonuser


四、生产环境部署建议

(一)Docker Swarm 集群部署

# docker-compose.yml 集群配置
version: '3.7'
services:
  python-app:
    image: python:3.8-slim
    deploy:
      mode: replicated
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 128M
      restart_policy:
        condition: on-failure
    volumes:
      - app-data:/app/data
volumes:
  app-data:

(二)Kubernetes 部署示例

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: python-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: python
  template:
    metadata:
      labels:
        app: python
    spec:
      containers:
      - name: python
        image: python:3.8-slim
        command: ["python", "app.py"]
        volumeMounts:
        - name: data
          mountPath: /app/data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: python-data

通过以上方法,无论是开发测试还是生产部署,都能在Docker环境中高效运行Python应用。在实际项目中,建议结合CI/CD流程自动构建镜像,并利用镜像仓库进行版本管理,确保开发、测试、生产环境的一致性和可追溯性。

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: