Docker 基础教程
🐳 Docker 核心概念
理解 Docker 的世界,必须从 4 大核心对象 + 2 大运行机制 + 1 套生态体系 入手。
- 镜像是 只读模板,包含:
- 文件系统(rootfs)
- 软件依赖
- 配置、环境
- 入口命令
- 类似虚拟机的“快照”,但轻量得多。
✅ 它不可变(immutable)。
📌 镜像 = 分层(layers)+ 元数据(config)
容器 = 镜像(只读层) + 可写层(容器层)
- 相当于由镜像启动的“进程实例”,不是虚拟机。
- 可删、可重建、可替换。
- 尽量:无状态、可丢弃、随起随灭
✅ 一个镜像可以运行出多个容器。
常见:
- Docker Hub
- Harbor(企业级)
- GitHub Container Registry
- 阿里云 / 腾讯云
你 push、pull 的对象都是 镜像 (Image)。
简化理解:
- Dockerfile = 描述“如何制造镜像”的脚本
关键指令:
- FROM
- RUN
- COPY / ADD
- ENV
- EXPOSE
- CMD / ENTRYPOINT
- WORKDIR
🔑 镜像是由 Dockerfile 一步步构建出来的,每一步形成一层(Layer)。
Docker 镜像由多层组成:
例:
ubuntu:latest
├─ Layer A (基础)
├─ Layer B (apt-get...)
└─ Layer C (copy...)
容器创建时,再叠加一个可写层:
container FS
├─ Container Writable Layer
└─ Image Layers (readonly)
📌 优点:
- 多镜像复用基础层(极大节省空间)
- 更新镜像非常快
- 构建、拉取、分发都更高效
容器不是虚拟机,本质是 受隔离和限制的 Linux 进程。
Namespace -> 隔离
隔离以下内容:
- PID
- Network
- Mount
- User
- IPC
- UTS
-> 使容器有自己的进程树、主机名、网络栈等。
Cgroup -> 资源控制
限制容器:
- CPU
- 内存
- IO
- PID 数量
📌 理解这一点,你就知道容器为什么“轻量”。
- runC(OCI 容器 runtime)
- containerd(管理容器生命周期)
- dockerd(Docker 的 daemon)
运行 docker run:
docker CLI -> dockerd -> containerd -> runC -> 启动容器
网络驱动模式:
| 模式 | 说明 |
|---|---|
| bridge(默认) | 容器互通,但独立于宿主机 |
| host | 容器共享宿主机网络 |
| none | 无网络 |
| overlay(Swarm / k8s) | 跨宿主机容器网络 |
| macvlan | 给容器分配独立 MAC 和 IP |
简化理解:
- bridge -> 安全
- host -> 性能高
- macvlan -> 容器像物理机
容器无状态,数据存储需要“卷”。
Volume 类型:
- managed volume:由 Docker 管理(推荐)
- bind mount:映射宿主机目录
- tmpfs(内存)
作用:
- 持久化数据
- 在容器间共享数据
- 性能高于写入容器层
用于开发环境的多容器管理:
- 启动/停止多个服务
- 网络自动化
- Volume 自动化
生产不建议用 Compose(建议用 k8s)。
例如:
docker volume plugin
docker network plugin
docker cli plugin
你正在做的“docker jbuild”就是 CLI 插件。
镜像生命周期:
build -> tag -> push -> pull -> run
容器生命周期:
create -> start -> running -> stop -> remove
容器可重建,但 volume 要持久化。
| 错误理解 | 正确理解 |
|---|---|
| 容器是虚拟机 | ❌ 容器是受隔离的进程 |
| 镜像是单个文件 | ❌ 镜像是多层文件系统 |
| 使用 docker 需要学很多命令 | ❌ 只要掌握 12 条命令就够 |
| Dockerfile 越复杂越好 | ❌ 越简单越好(可复用) |
| 容器应该保存数据 | ❌ 数据必须放 Volume |
- 容器不是虚拟机,而是隔离的进程。
- 镜像不可变,有层(layer)结构。
- 生产环境需要“无状态容器 + 有状态卷 + 镜像仓库”。