Docker 核心概念与 Python 应用部署指南

Docker 是一个轻量高效的容器化平台,广泛用于部署 Python Web 应用、API 服务等,相比传统虚拟机更省资源。本文专注于 Docker 的核心组件,包括 Docker 引擎、镜像、容器、Dockerfile、Docker Compose、Docker Desktop、Docker Hub、Docker 网络和存储卷,以 Python Flask Web 应用为例,用通俗语言和生活化比喻讲解,确保小白一看就懂。每个部分先介绍知识点,配以代码和场景举例,方便初学者掌握和复习。

1. 从虚拟机到 Docker:从“带整个厨房”到“只带烧烤架”

1.1 传统虚拟机的痛点

知识点:

虚拟机(VM):
虚拟机模拟一台完整电脑,包含操作系统(如 Ubuntu)、Python、pip 包等,占用空间大(几 GB)。
比如:部署 Python Flask 应用,需安装 Ubuntu、Python 3.10、Flask,配置复杂。

缺点:

  • 重:包含整个操作系统,占用大量磁盘和内存。
  • 慢:启动需几分钟。
  • 资源浪费:多个虚拟机重复运行相似操作系统。
  • 环境不一致:开发和生产环境差异导致“在我电脑上跑得好,部署就报错”。

场景:
传统部署 Python Web 应用,虚拟机配置繁琐,效率低。

比喻:
虚拟机像带整个厨房(冰箱、灶台、厨具)去野餐,搬运麻烦、占空间。

示例:
部署 Flask 应用用虚拟机:

  1. 安装 VMware/VirtualBox,配置 Ubuntu(几 GB)。
  2. 安装 Python、pip、Flask,复制代码,运行 python app.py
  3. 问题:3 个应用需 3 个虚拟机,占 10+ GB 磁盘,启动慢。

1.2 Docker 的优势

知识 point:

Docker 是什么?
Docker 是一个容器化平台,打包程序和依赖(不含操作系统内核),在任何支持 Docker 的环境运行。
容器只包含程序所需组件(如 Python 3.10、Flask),轻量高效。

优势:

  • 轻量:镜像只有几百 MB,远小于虚拟机。
  • 快速:容器启动只需几秒。
  • 一致性:开发、测试、生产环境一致,告别“环境问题”。
  • 高效:容器共享主机内核,节省资源。

为什么用 Docker?
Python Web 应用依赖特定环境(如 Python 3.10、pip 包),Docker 打包确保跨平台运行。适合部署多个实例,应对高流量。

比喻:
Docker 像带一个便携烧烤架去野餐,只装食材(代码)和调料(依赖),轻巧、随时开烤。

示例:
部署 Flask 应用用 Docker:

  1. 写 Dockerfile,定义 Python 环境。
  2. 构建镜像(~200 MB),运行容器。
  3. 3 个应用容器占不到 1 GB,启动快,效率高。

2. Docker 的核心组件

2.1 Docker 引擎:Docker 的“发动机”

knowledge point:

定义:Docker 引擎(Docker Engine)是 Docker 的核心,负责管理镜像、容器、网络和存储。
组成:

  • Docker Daemon(dockerd):后台进程,处理构建镜像、运行容器等任务。
  • Docker CLI(docker):命令行工具,用户输入命令(如 docker run)与 Daemon 交互。
  • REST API:支持工具(如 Docker Desktop)或脚本控制 Docker。

工作原理:
利用主机操作系统内核(如 Linux 的 cgroups 和 namespaces)隔离容器,保持轻量。支持 Linux、Windows、macOS(通过轻量虚拟化)。

为什么重要?
Docker 引擎是所有 Docker 功能的基础,驱动容器化流程。

安装:

  • Linux:sudo apt install docker.io(Ubuntu)。
  • Windows/macOS:通过 Docker Desktop 安装(包含引擎)。

比喻:
Docker 引擎像野餐的“烧烤炉”,负责加热便当(运行容器)、准备食材(构建镜像),你只需下指令。

示例:
检查 Docker 引擎:

docker --version
docker info

输出:Docker version 24.0.5, build ced0996,确认引擎运行正常。

2.2 镜像:软件的“便当盒”

knowledge point:

定义:Docker 镜像是一个只读的软件包,包含代码、运行时、依赖、配置。
特点:

  • 像安装包,只含程序所需(不含内核)。
  • 不可修改,需通过 Dockerfile 重建。
  • 可上传 Docker Hub 分享。

例子:
Flask 应用镜像包含 Python 3.10、pip 包、代码。镜像生成多个容器,互不干扰。

常用命令:

  • docker build -t my-app .:构建镜像。
  • docker images:查看本地镜像。
  • docker pull python:3.10:从 Docker Hub 下载。

比喻:
镜像像密封的“便当盒”,装好饭菜(代码)和调料(依赖),随时加热(运行容器)。

示例:
构建 Flask 应用镜像:

FROM python:3.10
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

解释:

  • FROM python:3.10:基于 Python 3.10。
  • WORKDIR /app:设置工作目录。
  • COPY requirements.txt .:复制依赖文件。
  • RUN pip install ...:安装依赖。
  • COPY . .:复制代码。
  • CMD ["python", "app.py"]:启动应用。

构建:

docker build -t my-app .

查看:docker images,看到 my-app(~200 MB)。

2.3 容器:运行的“加热便当”

knowledge point:

定义:容器是镜像的运行实例,像“轻量级电脑”执行程序。
特点:

  • 可启动、停止、删除,多个容器从同一镜像创建。
  • 共享主机内核,轻量高效。

生命周期:

  • 创建:docker run -d -p 8080:5000 my-app(映射端口)。
  • 查看:docker ps
  • 停止:docker stop
  • 删除:docker rm

端口映射:
容器端口(如 Flask 的 5000)映射到主机(如 8080)以供访问。例:-p 8080:5000

比喻:
容器像“加热后的便当”,从便当盒(镜像)拿出来开吃,多个便当互不干扰。

示例:
运行 Flask 应用容器:
代码 (app.py):

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return '欢迎访问 Python Web 应用!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

requirements.txt:

flask==2.0.1

构建:

docker build -t my-app .

运行:

docker run -d -p 8080:5000 my-app

测试:

  • 访问 http://localhost:8080,看到“欢迎访问 Python Web 应用!”。
  • docker ps 查看容器状态。

2.4 Docker Hub:镜像的“应用商店”

knowledge point:

定义:Docker Hub 是在线镜像仓库,存储和分享 Docker 镜像。
作用:

  • 提供官方镜像(如 python:3.10、mongo:latest)。
  • 用户可上传自定义镜像(如 myusername/my-app)。
  • 支持版本管理(如 python:3.10、python:3.9)。

常用命令:

  • docker pull python:3.10:下载镜像。
  • docker push myusername/my-app:上传镜像(需 docker login)。
  • docker search flask:搜索镜像。

为什么重要?
提供现成镜像,省去配置时间;便于团队分享环境。

比喻:
Docker Hub 像“应用商店”,提供各种便当盒(镜像),可下载或上传分享。

示例:
下载镜像:

docker pull python:3.10

上传镜像:

  1. 登录:docker login -u myusername
  2. 标记:docker tag my-app myusername/my-app:latest
  3. 推送:docker push myusername/my-app:latest

测试:

  • docker images 查看 python:3.10。
  • 检查 hub.docker.com,确认 myusername/my-app 上传。

2.5 Docker Desktop:本地开发的“控制面板”

knowledge point:

定义:Docker Desktop 是 Windows/macOS 上的 GUI 工具,集成 Docker 引擎,简化本地开发。
功能:

  • 图形界面管理镜像、容器、卷、网络。
  • 内置 Docker 引擎和 Compose 支持。
  • 集成开发工具(如 VS Code)。

适用场景:
本地测试 Flask 应用,无需复杂 Linux 配置。适合初学者,减少命令行操作。

安装:

  • 下载:Docker 官网。
  • Windows 需 WSL2,macOS 需轻量虚拟化。

为什么重要?
让非 Linux 用户轻松使用 Docker,降低门槛。

比喻:
Docker Desktop 像野餐的“智能控制面板”,一键启动烧烤炉(引擎)、查看便当(容器),新手也能轻松操作。

示例:
使用 Docker Desktop:

  1. 安装并启动 Docker Desktop。
  2. GUI 查看 my-app 镜像,点击“Run”启动容器,设置 8080:5000 映射。
  3. 访问 http://localhost:8080,确认运行。

命令行等效:

docker run -d -p 8080:5000 my-app

测试:用 Docker Desktop 查看容器日志,确认状态。

2.6 Docker 网络:容器间的“对讲机”

knowledge point:

定义:Docker 网络支持容器间或容器与主机通信。
网络类型:

  • bridge:默认,容器通过桥接网络通信,适合单主机。
  • host:容器用主机网络,性能高但无隔离。
  • none:容器无网络,适合隔离任务。

作用:

  • 容器通信:如 Flask 应用连接 MongoDB。
  • 端口映射:暴露容器端口给外部。

常用命令:

  • docker network ls:查看网络。
  • docker network create my-network:创建网络。
  • docker run --network my-network:加入网络。

比喻:
Docker 网络像“对讲机”,让烤肉厨师(Web 容器)和沙拉厨师(数据库容器)沟通,扩音器(端口映射)连接外部。

示例:
创建网络:

docker network create app-network

运行容器:

docker run -d --name webapp --network app-network -p 8080:5000 my-app
docker run -d --name mongo --network app-network mongo:latest

测试:
Flask 应用通过 mongodb://mongo:27017 连接 MongoDB。访问 http://localhost:8080,确认通信。

2.7 Docker 存储卷:数据的“保险箱”

knowledge point:

定义:Docker 卷持久化数据,容器删除后数据仍保留。
类型:

  • 卷:Docker 管理,存储在主机(如 /var/lib/docker/volumes)。
  • 绑定挂载:主机目录映射到容器。

作用:

  • 持久化 MongoDB 数据。
  • 多个容器共享数据。

常用命令:

  • docker volume create my-volume:创建卷。
  • docker volume ls:查看卷。
  • docker run -v my-volume:/data/db:挂载卷。

比喻:
卷像“冰箱”,便当(容器)丢了,食材(数据)还在。

示例:
创建并使用卷:

docker volume create mongo-data
docker run -d --name mongo -v mongo-data:/data/db mongo:latest

测试:

  1. 删除容器:docker stop mongo; docker rm mongo
  2. 重新运行:docker run -d --name mongo -v mongo-data:/data/db mongo:latest
  3. 数据仍在,卷确保持久化。

3. Dockerfile:环境的“菜谱”

knowledge point:

定义:Dockerfile 是文本文件,包含指令,告诉 Docker 如何构建镜像。
常见指令:

  • FROM:基础镜像(如 python:3.10)。
  • WORKDIR:设置工作目录。
  • COPY:复制文件。
  • RUN:构建时执行命令。
  • CMD:容器启动命令。

为什么重要?
确保环境一致,跨平台运行。

比喻:
Dockerfile 像菜谱,列出食材(镜像)、步骤(复制、安装)、上菜方式(启动命令)。

示例:

FROM python:3.10
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

requirements.txt:

flask==2.0.1

构建和运行:

docker build -t my-app .
docker run -d -p 8080:5000 my-app

测试:访问 http://localhost:8080。

4. Docker Compose:多容器的“指挥家”

knowledge point:

定义:Docker Compose 用 YAML 文件定义和管理多容器应用。
作用:

  • 配置镜像、端口、网络、卷。
  • 一条命令(docker-compose up)启动所有容器。

常见配置:

  • services:定义容器。
  • ports:端口映射。
  • volumes:数据持久化。
  • networks:容器通信。

常用命令:

  • docker-compose up -d:后台启动。
  • docker-compose ps:查看容器。
  • docker-compose down:停止并删除。

比喻:
Docker Compose 像野餐组织者,安排便当盒(容器)、桌子(端口)、分工(网络),一喊“开饭”全搞定。

示例:
场景:Flask 应用存数据到 MongoDB。
docker-compose.yml:

version: '3'
services:
  app:
    image: my-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:5000"
    depends_on:
      - mongo
    networks:
      - app-network
  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
    networks:
      - app-network
volumes:
  mongo-data:
networks:
  app-network:
    driver: bridge

app.py:

from flask import Flask
from pymongo import MongoClient

app = Flask(__name__)
client = MongoClient('mongodb://mongo:27017/')
db = client['webapp']

@app.route('/')
def home():
    db.data.insert_one({'message': 'Web 数据', 'date': '2025-06-29'})
    return '数据已存 MongoDB'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

requirements.txt:

flask==2.0.1
pymongo==4.3.3

运行:

docker-compose up -d

测试:

  • 访问 http://localhost:8080,看到“数据已存 MongoDB”。
  • docker-compose ps 确认容器运行。
  • 数据持久化在 mongo-data 卷。

5. 综合例子:部署 Python Web 应用

场景:
在阿里云 ECS(IP:203.0.113.1)部署 Flask 应用和 MongoDB,用 Docker Compose 测试。

步骤:
代码 (app.py, requirements.txt, Dockerfile, docker-compose.yml):如上。
配置服务器:

  • 防火墙:sudo ufw allow 80(Nginx)、sudo ufw allow 8080(测试)。
  • 安全组:阿里云添加 TCP 80 和 8080。

本地测试:

  • 运行:docker-compose up -d
  • 访问 http://localhost:8080。

云部署:

  • 上传代码到 ECS,运行 docker-compose up -d
  • 访问 http://203.0.113.1:8080,看到“数据已存 MongoDB”。
  • 数据持久化在 mongo-data 卷。

流程:

  1. 用户访问 http://203.0.113.1:8080。
  2. 安全组/防火墙允许 8080 端口,请求到 Flask 容器。
  3. Flask 容器通过 app-network 存数据到 MongoDB 容器。
  4. Docker 引擎管理容器,卷保存数据。

6. 常见疑问解答

Q1:Docker 和虚拟机区别?
虚拟机带操作系统,重、慢;Docker 只带程序和依赖,轻、快。

Q2:镜像和容器关系?
镜像像便当盒,容器是加热后的便当。

Q3:Docker Desktop 和引擎区别?
引擎是核心运行时,Desktop 是带 GUI 的工具,包含引擎,适合本地开发.

Q4:Docker Hub 怎么用?
像应用商店,docker pull 下载,docker push 分享.

Q5:端口访问不了?
检查:telnet localhost 8080
修复:sudo ufw allow 8080(防火墙),云服务商加 TCP 8080(安全组).

7. 总结

  • Docker 引擎:驱动容器化,管理镜像和容器。
  • 镜像/容器:镜像打包代码和依赖,容器运行程序。
  • Dockerfile:定义环境,像菜谱。
  • Docker Compose:管理多容器,像指挥家。
  • Docker Hub:镜像仓库,像应用商店。
  • Docker Desktop:GUI 工具,简化本地开发。
  • 网络/卷:支持容器通信和数据持久化。

你可能感兴趣的:(互联网,docker,python,容器)