一、什么是 Docker?它是如何工作的?
📌 背景问题:传统环境的痛点
在微服务、云原生尚未普及前,开发部署往往面临这些挑战:
程序在开发环境可以运行,在测试或生产环境却频繁出错(环境差异)
构建、部署步骤复杂,文档难以维护
虚拟机资源消耗高,部署缓慢,运行冗余服务
这时,Docker 的出现带来了根本性的转变。
🧠 Docker 的定义
Docker 是一个开源的容器化平台,它可以将应用及其所有依赖打包到一个轻量级、可移植的容器中,从而确保在任何地方都能一致地运行。
简单说,Docker = 快速部署应用的“打包机” + “运行平台”
⚙️ Docker 的底层原理
Docker 是基于 Linux 的两大核心技术:
Namespace(命名空间): 进程隔离,让容器拥有“自己的世界”(PID、文件系统、网络等都彼此独立)
Cgroups(控制组): 资源控制,限制容器的 CPU、内存、IO 等资源占用
除此之外,还有:
UnionFS(联合文件系统): 支持多层镜像组合,镜像可以继承并叠加,提高复用与构建效率
Containerd: 容器运行时,Docker 实际通过它来管理容器生命周期
🔍 容器 ≠ 虚拟机
与虚拟机不同,容器不需要单独的 Guest OS,而是共享宿主机内核,因此具有以下优势:
维度 | 虚拟机 | 容器 |
---|---|---|
启动速度 | 慢(分钟) | 快(秒级) |
系统开销 | 高(完整OS) | 低(进程级隔离) |
可移植性 | 中 | 高 |
资源复用 | 差 | 优秀 |
安全隔离 | 强 | 中等(可加强) |
二、Docker 架构与核心组件详解
Docker 架构包括以下几个关键组成:
Docker CLI: 命令行工具,用于与 Docker 守护进程通信
Docker Daemon(dockerd): 负责容器构建、运行、管理的后台服务
Registry: 镜像分发平台(如 Docker Hub)
Container Runtime: 实际运行容器的引擎(通常是 containerd)
三、核心对象详解
1. 镜像(Image)
镜像是多层文件系统的叠加
每一层对应 Dockerfile 的一条指令 (RUN, COPY, ADD)
镜像不可变,可复用,可缓存
docker pull nginx
docker images
2. 容器(Container)
镜像的运行实例,具有隔离的进程空间
使用 cgroups 和 namespaces 技术隔离资源
可读写层是运行时生成的,容器删除则数据消失
docker run -d -p 80:80 nginx
3. Dockerfile(构建脚本)
关键指令说明:
指令 | 含义 |
---|---|
FROM | 指定基础镜像 |
RUN | 执行构建命令 |
COPY / ADD | 文件复制 |
EXPOSE | 暴露端口 |
CMD / ENTRYPOINT | 指定启动命令 |
4.数据卷(Volumes)
容器中的持久化数据
避免数据随着容器销毁而丢失
docker volume create mydata
docker run -v mydata:/data myapp
5. 网络(Networks)
三种模式:
bridge:默认,容器互通,主机隔离
host:容器共享宿主机网络(性能高)
none:完全隔离
docker network create --driver bridge mynet
docker run --network=mynet ...
四、实战:部署一个 Flask + Redis 微服务架构
项目结构
project/
├── web/
│ ├── app.py
│ └── requirements.txt
├── Dockerfile
├── docker-compose.yml
web/app.py
from flask import Flask
import redis
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
@app.route('/')
def hello():
visits = cache.incr('counter')
return f'访问次数: {visits}'
if __name__ == '__main__':
app.run(host='0.0.0.0')
requirements.txt
flask
redis
Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY web/ .
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: redis:6-alpine
启动服务
docker-compose up --build
五、总结
Docker 不仅是一个开发工具,更是现代云原生的基石。掌握 Docker 能极大提升你在微服务架构、CI/CD 流水线、DevOps 流程中的工作效率。