Docker 是一个轻量高效的容器化平台,广泛用于部署 Python Web 应用、API 服务等,相比传统虚拟机更省资源。本文专注于 Docker 的核心组件,包括 Docker 引擎、镜像、容器、Dockerfile、Docker Compose、Docker Desktop、Docker Hub、Docker 网络和存储卷,以 Python Flask Web 应用为例,用通俗语言和生活化比喻讲解,确保小白一看就懂。每个部分先介绍知识点,配以代码和场景举例,方便初学者掌握和复习。
知识点:
虚拟机(VM):
虚拟机模拟一台完整电脑,包含操作系统(如 Ubuntu)、Python、pip 包等,占用空间大(几 GB)。
比如:部署 Python Flask 应用,需安装 Ubuntu、Python 3.10、Flask,配置复杂。
缺点:
场景:
传统部署 Python Web 应用,虚拟机配置繁琐,效率低。
比喻:
虚拟机像带整个厨房(冰箱、灶台、厨具)去野餐,搬运麻烦、占空间。
示例:
部署 Flask 应用用虚拟机:
python app.py
。知识 point:
Docker 是什么?
Docker 是一个容器化平台,打包程序和依赖(不含操作系统内核),在任何支持 Docker 的环境运行。
容器只包含程序所需组件(如 Python 3.10、Flask),轻量高效。
优势:
为什么用 Docker?
Python Web 应用依赖特定环境(如 Python 3.10、pip 包),Docker 打包确保跨平台运行。适合部署多个实例,应对高流量。
比喻:
Docker 像带一个便携烧烤架去野餐,只装食材(代码)和调料(依赖),轻巧、随时开烤。
示例:
部署 Flask 应用用 Docker:
knowledge point:
定义:Docker 引擎(Docker Engine)是 Docker 的核心,负责管理镜像、容器、网络和存储。
组成:
docker run
)与 Daemon 交互。工作原理:
利用主机操作系统内核(如 Linux 的 cgroups 和 namespaces)隔离容器,保持轻量。支持 Linux、Windows、macOS(通过轻量虚拟化)。
为什么重要?
Docker 引擎是所有 Docker 功能的基础,驱动容器化流程。
安装:
sudo apt install docker.io
(Ubuntu)。比喻:
Docker 引擎像野餐的“烧烤炉”,负责加热便当(运行容器)、准备食材(构建镜像),你只需下指令。
示例:
检查 Docker 引擎:
docker --version
docker info
输出:Docker version 24.0.5, build ced0996
,确认引擎运行正常。
knowledge point:
定义:Docker 镜像是一个只读的软件包,包含代码、运行时、依赖、配置。
特点:
例子:
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)。
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
测试:
docker ps
查看容器状态。knowledge point:
定义:Docker Hub 是在线镜像仓库,存储和分享 Docker 镜像。
作用:
常用命令:
docker pull python:3.10
:下载镜像。docker push myusername/my-app
:上传镜像(需 docker login
)。docker search flask
:搜索镜像。为什么重要?
提供现成镜像,省去配置时间;便于团队分享环境。
比喻:
Docker Hub 像“应用商店”,提供各种便当盒(镜像),可下载或上传分享。
示例:
下载镜像:
docker pull python:3.10
上传镜像:
docker login -u myusername
。docker tag my-app myusername/my-app:latest
。docker push myusername/my-app:latest
。测试:
docker images
查看 python:3.10。knowledge point:
定义:Docker Desktop 是 Windows/macOS 上的 GUI 工具,集成 Docker 引擎,简化本地开发。
功能:
适用场景:
本地测试 Flask 应用,无需复杂 Linux 配置。适合初学者,减少命令行操作。
安装:
为什么重要?
让非 Linux 用户轻松使用 Docker,降低门槛。
比喻:
Docker Desktop 像野餐的“智能控制面板”,一键启动烧烤炉(引擎)、查看便当(容器),新手也能轻松操作。
示例:
使用 Docker Desktop:
命令行等效:
docker run -d -p 8080:5000 my-app
测试:用 Docker Desktop 查看容器日志,确认状态。
knowledge point:
定义:Docker 网络支持容器间或容器与主机通信。
网络类型:
作用:
常用命令:
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,确认通信。
knowledge point:
定义:Docker 卷持久化数据,容器删除后数据仍保留。
类型:
作用:
常用命令:
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
测试:
docker stop mongo; docker rm mongo
。docker run -d --name mongo -v mongo-data:/data/db mongo:latest
。knowledge point:
定义:Dockerfile 是文本文件,包含指令,告诉 Docker 如何构建镜像。
常见指令:
为什么重要?
确保环境一致,跨平台运行。
比喻:
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。
knowledge point:
定义:Docker Compose 用 YAML 文件定义和管理多容器应用。
作用:
docker-compose up
)启动所有容器。常见配置:
常用命令:
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
测试:
docker-compose ps
确认容器运行。场景:
在阿里云 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
(测试)。本地测试:
docker-compose up -d
。云部署:
docker-compose up -d
。流程:
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(安全组).