mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 04:14:38 +00:00
Add learning roadmap
This commit is contained in:
873
appendix/learning_roadmap.md
Normal file
873
appendix/learning_roadmap.md
Normal file
@@ -0,0 +1,873 @@
|
|||||||
|
## 附录八:Docker 学习路线图与知识体系
|
||||||
|
|
||||||
|
本附录为学习者提供清晰的学习路线、知识点依赖关系、认证指南和常见面试题,帮助快速成长为 Docker 和 DevOps 专家。
|
||||||
|
|
||||||
|
### 学习阶段划分
|
||||||
|
|
||||||
|
Docker 学习可分为四个递进阶段,每个阶段都有明确的学习目标和时间投入。
|
||||||
|
|
||||||
|
#### 第一阶段:基础入门(0-2 周)
|
||||||
|
|
||||||
|
**学习目标:**
|
||||||
|
- 理解容器化的基本概念
|
||||||
|
- 能够运行、管理基本的容器
|
||||||
|
- 了解镜像和仓库的基本操作
|
||||||
|
|
||||||
|
**核心内容:**
|
||||||
|
```
|
||||||
|
Docker 简介
|
||||||
|
├── 为什么需要 Docker
|
||||||
|
├── 容器 vs 虚拟机 vs 云计算
|
||||||
|
└── Docker 的三大核心概念
|
||||||
|
├── 镜像(Image)
|
||||||
|
├── 容器(Container)
|
||||||
|
└── 仓库(Repository)
|
||||||
|
|
||||||
|
基础命令
|
||||||
|
├── docker run / create / start / stop / rm
|
||||||
|
├── docker ps / logs / exec / inspect
|
||||||
|
├── docker pull / push / tag
|
||||||
|
└── docker build -t
|
||||||
|
|
||||||
|
Docker 安装配置
|
||||||
|
├── Linux 平台安装
|
||||||
|
├── macOS 和 Windows 安装
|
||||||
|
├── 镜像加速器配置
|
||||||
|
└── 权限和用户配置
|
||||||
|
```
|
||||||
|
|
||||||
|
**学习资源:**
|
||||||
|
- 官方教程:https://docs.docker.com/get-started/
|
||||||
|
- 本书第 1-3 章:入门篇基础概念
|
||||||
|
- Docker CLI 参考:https://docs.docker.com/engine/reference/commandline/
|
||||||
|
|
||||||
|
**时间投入:**
|
||||||
|
- 理论学习:3-4 小时
|
||||||
|
- 实操练习:8-10 小时
|
||||||
|
- 总计:2 周
|
||||||
|
|
||||||
|
**验证学习成果:**
|
||||||
|
```bash
|
||||||
|
# 完成以下任务说明基础入门完成
|
||||||
|
1. 运行官方 nginx 镜像,访问 http://localhost
|
||||||
|
2. 使用 docker exec 进入容器修改首页
|
||||||
|
3. 提交修改为新镜像
|
||||||
|
4. 推送镜像到 Docker Hub(需创建账户)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 第二阶段:核心开发(2-6 周)
|
||||||
|
|
||||||
|
**学习目标:**
|
||||||
|
- 掌握 Dockerfile 编写
|
||||||
|
- 能够构建自己的应用镜像
|
||||||
|
- 理解数据管理和网络配置
|
||||||
|
- 熟悉 Docker Compose 编排
|
||||||
|
|
||||||
|
**核心内容:**
|
||||||
|
```
|
||||||
|
Dockerfile 指令详解
|
||||||
|
├── FROM / RUN / COPY / ADD
|
||||||
|
├── WORKDIR / ENV / ARG
|
||||||
|
├── EXPOSE / CMD / ENTRYPOINT
|
||||||
|
├── VOLUME / USER / HEALTHCHECK
|
||||||
|
└── 最佳实践和性能优化
|
||||||
|
├── 分层缓存机制
|
||||||
|
├── 减少镜像体积
|
||||||
|
├── 多阶段构建
|
||||||
|
└── 安全最佳实践
|
||||||
|
|
||||||
|
容器数据管理
|
||||||
|
├── 数据卷(Volume)
|
||||||
|
│ ├── 命名卷
|
||||||
|
│ ├── 匿名卷
|
||||||
|
│ └── 卷挂载最佳实践
|
||||||
|
├── 绑定挂载(Bind Mount)
|
||||||
|
│ ├── 宿主机路径映射
|
||||||
|
│ └── 权限和隔离
|
||||||
|
└── tmpfs 挂载
|
||||||
|
└── 临时文件系统
|
||||||
|
|
||||||
|
容器网络
|
||||||
|
├── 网络类型
|
||||||
|
│ ├── bridge(默认)
|
||||||
|
│ ├── host
|
||||||
|
│ ├── overlay
|
||||||
|
│ └── macvlan
|
||||||
|
├── 端口映射
|
||||||
|
├── 容器互联
|
||||||
|
├── DNS 配置
|
||||||
|
└── 自定义网络
|
||||||
|
|
||||||
|
Docker Compose
|
||||||
|
├── compose.yml/docker-compose.yml 编写
|
||||||
|
├── services 定义
|
||||||
|
├── volumes 配置
|
||||||
|
├── networks 配置
|
||||||
|
├── 依赖关系
|
||||||
|
├── 环境变量
|
||||||
|
└── 命令操作
|
||||||
|
├── up / down / ps / logs
|
||||||
|
├── exec / run
|
||||||
|
└── build / push
|
||||||
|
```
|
||||||
|
|
||||||
|
**学习资源:**
|
||||||
|
- 本书第 4-11 章:进阶篇
|
||||||
|
- Docker 官方最佳实践:https://docs.docker.com/develop/dev-best-practices/
|
||||||
|
- Dockerfile 参考:https://docs.docker.com/engine/reference/builder/
|
||||||
|
|
||||||
|
**时间投入:**
|
||||||
|
- 理论学习:8-10 小时
|
||||||
|
- 实操练习:30-40 小时(多个实战项目)
|
||||||
|
- 总计:4-6 周
|
||||||
|
|
||||||
|
**项目实战:**
|
||||||
|
```
|
||||||
|
项目 1: Python Web 应用(Flask/Django)
|
||||||
|
- 编写多阶段 Dockerfile
|
||||||
|
- 使用 Compose 配置数据库
|
||||||
|
- 实现热重载开发环境
|
||||||
|
|
||||||
|
项目 2: Node.js 微服务
|
||||||
|
- 优化镜像大小
|
||||||
|
- 配置 Compose 多个服务
|
||||||
|
- 设置网络和环保境变量
|
||||||
|
|
||||||
|
项目 3: 数据库容器化
|
||||||
|
- PostgreSQL/MySQL 配置
|
||||||
|
- 数据持久化
|
||||||
|
- 备份恢复策略
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 第三阶段:生产优化(6-12 周)
|
||||||
|
|
||||||
|
**学习目标:**
|
||||||
|
- 掌握容器安全最佳实践
|
||||||
|
- 理解性能监控和优化
|
||||||
|
- 学会容器编排(Kubernetes 基础)
|
||||||
|
- 熟悉 CI/CD 集成
|
||||||
|
|
||||||
|
**核心内容:**
|
||||||
|
```
|
||||||
|
容器安全
|
||||||
|
├── 镜像安全
|
||||||
|
│ ├── 漏洞扫描(Trivy/Grype/Snyk)
|
||||||
|
│ ├── 镜像签名和验证(Cosign)
|
||||||
|
│ ├── SBOM 生成和管理
|
||||||
|
│ └── 供应链安全
|
||||||
|
├── 运行时安全
|
||||||
|
│ ├── 用户和权限
|
||||||
|
│ ├── Linux 能力机制
|
||||||
|
│ ├── AppArmor 和 SELinux
|
||||||
|
│ ├── Rootless 容器
|
||||||
|
│ └── 安全的 Docker socket 访问
|
||||||
|
└── 宿主机安全
|
||||||
|
├── API 访问控制
|
||||||
|
├── TLS 认证
|
||||||
|
└── 审计日志
|
||||||
|
|
||||||
|
性能监控和优化
|
||||||
|
├── 监控指标体系
|
||||||
|
│ ├── CPU / 内存 / 网络 / I/O
|
||||||
|
│ └── 应用级指标
|
||||||
|
├── 监控工具
|
||||||
|
│ ├── docker stats
|
||||||
|
│ ├── cAdvisor
|
||||||
|
│ ├── Prometheus
|
||||||
|
│ └── Grafana
|
||||||
|
├── 性能优化
|
||||||
|
│ ├── 镜像大小优化
|
||||||
|
│ ├── 内存和 CPU 限制
|
||||||
|
│ ├── OOM 诊断和处理
|
||||||
|
│ └── 网络性能优化
|
||||||
|
└── 日志管理
|
||||||
|
├── 日志驱动配置
|
||||||
|
├── ELK Stack
|
||||||
|
└── 日志聚合
|
||||||
|
|
||||||
|
容器编排基础
|
||||||
|
├── Kubernetes 核心概念
|
||||||
|
│ ├── Pod / Deployment / Service
|
||||||
|
│ ├── ConfigMap / Secret
|
||||||
|
│ └── 健康检查和自动恢复
|
||||||
|
├── 容器执行环境
|
||||||
|
│ ├── containerd
|
||||||
|
│ ├── CRI-O
|
||||||
|
│ └── Docker
|
||||||
|
├── 网络插件
|
||||||
|
│ ├── CNI 标准
|
||||||
|
│ ├── Calico / Flannel / Cilium
|
||||||
|
│ └── 网络策略
|
||||||
|
└── 存储和有状态应用
|
||||||
|
├── PV / PVC
|
||||||
|
├── StorageClass
|
||||||
|
└── StatefulSet
|
||||||
|
|
||||||
|
CI/CD 集成
|
||||||
|
├── GitHub Actions
|
||||||
|
│ ├── 镜像构建和推送
|
||||||
|
│ ├── 安全扫描
|
||||||
|
│ └── 自动化测试
|
||||||
|
├── GitLab CI
|
||||||
|
├── Jenkins Docker 集成
|
||||||
|
└── Drone
|
||||||
|
|
||||||
|
生态工具
|
||||||
|
├── Buildx(多架构构建)
|
||||||
|
├── Skopeo(镜像管理)
|
||||||
|
├── Podman(替代方案)
|
||||||
|
├── Buildah(镜像构建)
|
||||||
|
└── Kollabot
|
||||||
|
```
|
||||||
|
|
||||||
|
**学习资源:**
|
||||||
|
- 本书第 12-21 章:深入篇和实战篇
|
||||||
|
- Kubernetes 官方文档:https://kubernetes.io/docs/
|
||||||
|
- CNCF 学习路线:https://landscape.cncf.io/
|
||||||
|
|
||||||
|
**时间投入:**
|
||||||
|
- 理论学习:15-20 小时
|
||||||
|
- 实操练习:60-80 小时(多个生产级项目)
|
||||||
|
- 总计:6-12 周
|
||||||
|
|
||||||
|
**项目实战:**
|
||||||
|
```
|
||||||
|
项目 1: 安全镜像构建流程
|
||||||
|
- 集成 Trivy 扫描
|
||||||
|
- 镜像签名和验证
|
||||||
|
- 生成 SBOM 文档
|
||||||
|
|
||||||
|
项目 2: 完整监控栈
|
||||||
|
- 搭建 Prometheus + Grafana
|
||||||
|
- 配置告警规则
|
||||||
|
- 性能数据采集和分析
|
||||||
|
|
||||||
|
项目 3: CI/CD 流程
|
||||||
|
- GitHub Actions 或 GitLab CI 配置
|
||||||
|
- 自动化镜像构建
|
||||||
|
- 安全扫描和合规检查
|
||||||
|
- 自动化部署到 Kubernetes
|
||||||
|
|
||||||
|
项目 4: Kubernetes 集群部署
|
||||||
|
- 本地 K3s/Kind 集群
|
||||||
|
- 部署有状态应用
|
||||||
|
- 配置持久化存储
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 第四阶段:专家深造(12+ 周)
|
||||||
|
|
||||||
|
**学习目标:**
|
||||||
|
- 掌握 Kubernetes 高级特性
|
||||||
|
- 理解容器运行时底层实现
|
||||||
|
- 能够设计和优化大规模容器平台
|
||||||
|
- 贡献开源社区
|
||||||
|
|
||||||
|
**核心内容:**
|
||||||
|
```
|
||||||
|
Kubernetes 高级特性
|
||||||
|
├── 集群管理
|
||||||
|
│ ├── 节点管理和驱逐
|
||||||
|
│ ├── 集群自动扩缩容
|
||||||
|
│ └── 节点亲和性和污点容忍
|
||||||
|
├── 存储编排
|
||||||
|
│ ├── 动态存储配置
|
||||||
|
│ ├── 有状态应用管理(StatefulSet)
|
||||||
|
│ └── 备份和灾难恢复
|
||||||
|
├── 服务网格(Service Mesh)
|
||||||
|
│ ├── Istio / Linkerd / Cilium
|
||||||
|
│ ├── 流量管理
|
||||||
|
│ └── 可观测性增强
|
||||||
|
├── 安全和多租户
|
||||||
|
│ ├── RBAC(角色访问控制)
|
||||||
|
│ ├── Network Policy 深入
|
||||||
|
│ ├── Pod Security Policy
|
||||||
|
│ └── 准入控制器(Admission Controller)
|
||||||
|
└── 性能和扩展性
|
||||||
|
├── 大规模集群优化
|
||||||
|
├── 自定义 Operator
|
||||||
|
└── 集群联邦
|
||||||
|
|
||||||
|
容器运行时底层
|
||||||
|
├── Linux 内核机制
|
||||||
|
│ ├── Namespace 详解
|
||||||
|
│ ├── Cgroup v1 和 v2
|
||||||
|
│ ├── OverlayFS 和 UnionFS
|
||||||
|
│ └── SELinux 和 AppArmor
|
||||||
|
├── 容器运行时
|
||||||
|
│ ├── containerd 源码阅读
|
||||||
|
│ ├── runc 实现
|
||||||
|
│ ├── gVisor 和 Kata
|
||||||
|
│ └── Firecracker
|
||||||
|
└── OCI 标准
|
||||||
|
├── Image Spec
|
||||||
|
└── Runtime Spec
|
||||||
|
|
||||||
|
DevOps 工程化
|
||||||
|
├── 大规模集群管理
|
||||||
|
│ ├── Helm / Kustomize
|
||||||
|
│ ├── GitOps(Flux / ArgoCD)
|
||||||
|
│ └── 配置管理
|
||||||
|
├── 灾难恢复和高可用
|
||||||
|
│ ├── 多集群部署
|
||||||
|
│ ├── 故障转移
|
||||||
|
│ └── 备份策略
|
||||||
|
├── 成本优化
|
||||||
|
│ ├── 资源申请和限制
|
||||||
|
│ ├── 自动扩缩容
|
||||||
|
│ └── 成本监控
|
||||||
|
└── 团队协作
|
||||||
|
├── GitFlow 工作流
|
||||||
|
├── 代码审查
|
||||||
|
└── 文档和最佳实践传播
|
||||||
|
```
|
||||||
|
|
||||||
|
**贡献机会:**
|
||||||
|
- Kubernetes(https://github.com/kubernetes/kubernetes)
|
||||||
|
- Cilium(https://github.com/cilium/cilium)
|
||||||
|
- Prometheus(https://github.com/prometheus/prometheus)
|
||||||
|
- Docker/Moby(https://github.com/moby/moby)
|
||||||
|
|
||||||
|
### 知识点依赖关系
|
||||||
|
|
||||||
|
```
|
||||||
|
基础概念 (Week 0-2)
|
||||||
|
├── 容器 vs 虚拟机
|
||||||
|
├── Docker 三大概念
|
||||||
|
└── 基础命令
|
||||||
|
↓
|
||||||
|
Dockerfile 和镜像构建 (Week 2-4)
|
||||||
|
├── Dockerfile 指令
|
||||||
|
├── 多阶段构建
|
||||||
|
└── 镜像优化
|
||||||
|
↓ ↓ ↓
|
||||||
|
数据管理 ← 网络配置 ← Docker Compose (Week 4-6)
|
||||||
|
├── Volume ├── Bridge ├── YAML 编写
|
||||||
|
├── Bind Mount├── Overlay ├── 多容器编排
|
||||||
|
└── tmpfs └── 自定义网络└── 开发工作流
|
||||||
|
↓ ↓ ↓
|
||||||
|
└─────────────────────────┘
|
||||||
|
实战项目开发 (Week 6-10)
|
||||||
|
├── Web 应用容器化
|
||||||
|
├── 数据库容器化
|
||||||
|
├── 微服务架构
|
||||||
|
└── 本地开发环境
|
||||||
|
↓
|
||||||
|
容器安全 ← 性能优化 ← 监控和日志 (Week 10-14)
|
||||||
|
├── 镜像扫描 ├── 大小优化 ├── Prometheus
|
||||||
|
├── 漏洞管理 ├── 内存优化 ├── Grafana
|
||||||
|
├── 镜像签名 ├── CPU 优化 └── ELK Stack
|
||||||
|
└── SBOM └── 诊断工具
|
||||||
|
↓ ↓ ↓
|
||||||
|
└─────────────────────┘
|
||||||
|
安全生产环境 (Week 14-18)
|
||||||
|
├── CI/CD 流程
|
||||||
|
├── 镜像仓库
|
||||||
|
├── 日志集中
|
||||||
|
└── 告警系统
|
||||||
|
↓
|
||||||
|
Kubernetes 基础 (Week 18-24)
|
||||||
|
├── Pod / Service / Deployment
|
||||||
|
├── 资源管理
|
||||||
|
├── 存储管理
|
||||||
|
└── 网络策略
|
||||||
|
↓
|
||||||
|
Kubernetes 进阶 (Week 24-36)
|
||||||
|
├── StatefulSet / DaemonSet
|
||||||
|
├── Operator 开发
|
||||||
|
├── 集群管理
|
||||||
|
└── 服务网格
|
||||||
|
↓
|
||||||
|
企业级平台设计 (Week 36+)
|
||||||
|
├── 多集群管理
|
||||||
|
├── GitOps 工作流
|
||||||
|
├── 成本优化
|
||||||
|
└── 开源贡献
|
||||||
|
```
|
||||||
|
|
||||||
|
### 推荐学习资源
|
||||||
|
|
||||||
|
#### 官方文档
|
||||||
|
|
||||||
|
| 资源 | URL | 推荐程度 |
|
||||||
|
|------|-----|--------|
|
||||||
|
| Docker 官方文档 | https://docs.docker.com | ⭐⭐⭐⭐⭐ |
|
||||||
|
| Docker Hub | https://hub.docker.com | ⭐⭐⭐⭐⭐ |
|
||||||
|
| Kubernetes 官方 | https://kubernetes.io/docs | ⭐⭐⭐⭐⭐ |
|
||||||
|
| CNCF 景观 | https://landscape.cncf.io | ⭐⭐⭐⭐ |
|
||||||
|
|
||||||
|
#### 在线课程
|
||||||
|
|
||||||
|
- **Udemy**:Docker 和 Kubernetes 完整课程(70-100 小时)
|
||||||
|
- **Linux Academy**:Linux 和容器管理
|
||||||
|
- **A Cloud Guru**:AWS/Azure 容器服务
|
||||||
|
- **Pluralsight**:Docker 和容器生态系统
|
||||||
|
|
||||||
|
#### 书籍推荐
|
||||||
|
|
||||||
|
- 《Docker 深入浅出》- 本书的原版
|
||||||
|
- 《Kubernetes 权威指南》- 深入 Kubernetes 的必读书
|
||||||
|
- 《容器技术核心技术与应用》- 理解底层实现
|
||||||
|
- 《SRE Google 运维之道》- 生产环保最佳实践
|
||||||
|
|
||||||
|
#### 博客和社区
|
||||||
|
|
||||||
|
- Docker 官方博客:https://www.docker.com/blog/
|
||||||
|
- Kubernetes 官方博客:https://kubernetes.io/blog/
|
||||||
|
- CNCF 博客:https://www.cncf.io/blog/
|
||||||
|
- DZone:https://dzone.com/containers-cloud
|
||||||
|
|
||||||
|
### 认证指南
|
||||||
|
|
||||||
|
#### Docker 认证
|
||||||
|
|
||||||
|
**Docker Certified Associate (DCA)**
|
||||||
|
|
||||||
|
考试信息:
|
||||||
|
- 题目数:55 道
|
||||||
|
- 时间限制:90 分钟
|
||||||
|
- 及格分数:73%(约 41 道题)
|
||||||
|
- 费用:$165 USD
|
||||||
|
- 有效期:3 年
|
||||||
|
|
||||||
|
考试内容比例:
|
||||||
|
```
|
||||||
|
镜像和仓库(20%)
|
||||||
|
- 镜像构建和管理
|
||||||
|
- 镜像层和缓存
|
||||||
|
- 私有仓库配置
|
||||||
|
|
||||||
|
容器运行(15%)
|
||||||
|
- 容器生命周期
|
||||||
|
- 资源限制
|
||||||
|
- 容器隔离
|
||||||
|
|
||||||
|
网络(15%)
|
||||||
|
- 网络驱动
|
||||||
|
- 容器通信
|
||||||
|
- 端口映射
|
||||||
|
|
||||||
|
存储(10%)
|
||||||
|
- Volume 管理
|
||||||
|
- 数据持久化
|
||||||
|
- 绑定挂载
|
||||||
|
|
||||||
|
编排(20%)
|
||||||
|
- Docker Compose
|
||||||
|
- Docker Swarm 基础
|
||||||
|
|
||||||
|
安全(15%)
|
||||||
|
- 用户和权限
|
||||||
|
- 密钥管理
|
||||||
|
- 镜像安全
|
||||||
|
- 守护进程安全
|
||||||
|
|
||||||
|
和日志(5%)
|
||||||
|
- Logging drivers
|
||||||
|
- 事件处理
|
||||||
|
```
|
||||||
|
|
||||||
|
准备建议:
|
||||||
|
```bash
|
||||||
|
# 1. 学习本书第 1-11 章(基础到中级)
|
||||||
|
# 2. 完成 20+ 个实战项目
|
||||||
|
# 3. 参考官方学习指南
|
||||||
|
curl https://docker.training.kodekloud.com/dca-guide
|
||||||
|
|
||||||
|
# 4. 模拟考试
|
||||||
|
- Linux Academy DCA 练习题
|
||||||
|
- Whizlabs DCA 模拟考试
|
||||||
|
|
||||||
|
# 5. 重点掌握的命令
|
||||||
|
docker build / push / pull / tag
|
||||||
|
docker run / exec / logs / inspect / ps
|
||||||
|
docker volume / network / service
|
||||||
|
docker-compose up / down / logs / ps
|
||||||
|
docker stats / events / inspect
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Kubernetes 认证
|
||||||
|
|
||||||
|
**认证路径:**
|
||||||
|
1. **CKA - Certified Kubernetes Administrator**
|
||||||
|
- 难度:高
|
||||||
|
- 时间:3 小时(实操)
|
||||||
|
- 费用:$395
|
||||||
|
- 内容:集群安装、管理、故障排查
|
||||||
|
|
||||||
|
2. **CKAD - Certified Kubernetes Application Developer**
|
||||||
|
- 难度:中
|
||||||
|
- 时间:2 小时(实操)
|
||||||
|
- 费用:$395
|
||||||
|
- 内容:应用开发和部署
|
||||||
|
|
||||||
|
3. **CKS - Certified Kubernetes Security Specialist**
|
||||||
|
- 难度:很高
|
||||||
|
- 时间:2 小时(实操)
|
||||||
|
- 费用:$395
|
||||||
|
- 内容:安全最佳实践
|
||||||
|
|
||||||
|
### 常见面试题与答案要点
|
||||||
|
|
||||||
|
#### 基础概念面试题
|
||||||
|
|
||||||
|
**Q1: Docker 容器和虚拟机有什么区别?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
虚拟机:
|
||||||
|
- 完整的操作系统环境(GB 级)
|
||||||
|
- 启动时间:分钟级
|
||||||
|
- 隔离级别:完全硬件隔离
|
||||||
|
- 性能开销:高(5-20%)
|
||||||
|
|
||||||
|
容器:
|
||||||
|
- 共享内核,包含应用和依赖(MB 级)
|
||||||
|
- 启动时间:秒级
|
||||||
|
- 隔离级别:进程级隔离(Namespace/Cgroup)
|
||||||
|
- 性能开销:低(1-5%)
|
||||||
|
|
||||||
|
总结:容器更轻量、更快、密度更高
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q2: 什么是 Docker 镜像?它如何存储的?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
镜像本质:
|
||||||
|
- 只读的文件系统快照
|
||||||
|
- 分层存储结构
|
||||||
|
- 每一层是前一层的增量
|
||||||
|
|
||||||
|
存储方式:
|
||||||
|
- Union FS:多个只读层 + 一个可写层
|
||||||
|
- 每个 RUN/COPY/ADD 指令创建一层
|
||||||
|
- 层之间通过 diff 增量存储,节省空间
|
||||||
|
|
||||||
|
优点:
|
||||||
|
- 共享基础层减少存储
|
||||||
|
- 层级缓存加快构建
|
||||||
|
- 支持高效分发
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q3: 容器如何实现隔离?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
技术手段:
|
||||||
|
1. Namespace(资源隔离):
|
||||||
|
- PID Namespace:进程隔离
|
||||||
|
- Network Namespace:网络隔离
|
||||||
|
- Mount Namespace:文件系统隔离
|
||||||
|
- UTS Namespace:主机名隔离
|
||||||
|
- IPC Namespace:进程间通信隔离
|
||||||
|
|
||||||
|
2. Cgroup(资源限制):
|
||||||
|
- 限制 CPU 使用
|
||||||
|
- 限制内存使用
|
||||||
|
- 限制磁盘 I/O
|
||||||
|
- 限制网络带宽
|
||||||
|
|
||||||
|
3. Linux 能力机制(权限控制):
|
||||||
|
- 削减不必要的 root 权限
|
||||||
|
- 限制容器能力
|
||||||
|
|
||||||
|
4. SELinux / AppArmor(强制访问控制)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Dockerfile 面试题
|
||||||
|
|
||||||
|
**Q4: 如何优化 Docker 镜像大小?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
1. 选择合适的基础镜像:
|
||||||
|
scratch < alpine:3.17 < python:3.11-slim < python:3.11
|
||||||
|
|
||||||
|
2. 多阶段构建:
|
||||||
|
- 构建阶段只保留编译工具
|
||||||
|
- 运行阶段只包含最终二进制
|
||||||
|
- 典型场景:Go、Node.js、Java
|
||||||
|
|
||||||
|
3. 清理包管理器缓存:
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||||
|
yum clean all && rm -rf /var/cache/yum
|
||||||
|
pip install --no-cache-dir
|
||||||
|
|
||||||
|
4. 合并 RUN 指令:
|
||||||
|
减少镜像层数
|
||||||
|
|
||||||
|
5. 使用 .dockerignore:
|
||||||
|
排除不必要的构建上下文
|
||||||
|
|
||||||
|
6. 去除调试符号:
|
||||||
|
Go: -ldflags="-w -s"
|
||||||
|
C/C++: strip binary
|
||||||
|
|
||||||
|
7. 压缩资源:
|
||||||
|
gzip 静态文件,压缩图片
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q5: CMD 和 ENTRYPOINT 有什么区别?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
CMD:
|
||||||
|
- 定义容器默认命令
|
||||||
|
- 容器运行时可被覆盖:docker run image_name custom_cmd
|
||||||
|
- 可以有多个 CMD,只有最后一个生效
|
||||||
|
|
||||||
|
ENTRYPOINT:
|
||||||
|
- 定义容器的可执行程序
|
||||||
|
- 容器运行时参数追加而非覆盖
|
||||||
|
- 与 CMD 配合使用
|
||||||
|
|
||||||
|
推荐用法:
|
||||||
|
ENTRYPOINT ["python", "app.py"]
|
||||||
|
CMD ["--port", "8000"]
|
||||||
|
|
||||||
|
# 运行 docker run image --debug 会执行:
|
||||||
|
# python app.py --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 网络和存储面试题
|
||||||
|
|
||||||
|
**Q6: Docker 网络驱动的区别?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
Bridge(默认):
|
||||||
|
- 虚拟网桥,容器间通过网桥通信
|
||||||
|
- 支持端口映射
|
||||||
|
- 隔离性好,性能适中
|
||||||
|
|
||||||
|
Host:
|
||||||
|
- 使用宿主机网络栈
|
||||||
|
- 性能最优,隔离性最差
|
||||||
|
- 容器端口直接映射到宿主机
|
||||||
|
|
||||||
|
Overlay:
|
||||||
|
- 跨主机通信,基于 VXLAN
|
||||||
|
- Swarm 和 Kubernetes 标准
|
||||||
|
- 性能略低,支持分布式
|
||||||
|
|
||||||
|
macvlan:
|
||||||
|
- 容器获得 MAC 地址
|
||||||
|
- 表现为物理机,性能好
|
||||||
|
- 用于物理网络集成
|
||||||
|
|
||||||
|
None:
|
||||||
|
- 无网络,完全隔离
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q7: Volume 和 Bind Mount 有什么区别?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
Volume:
|
||||||
|
- Docker 管理,存储位置:/var/lib/docker/volumes/
|
||||||
|
- 跨平台兼容,隔离性好
|
||||||
|
- 支持驱动,可扩展
|
||||||
|
- 推荐在生产环境使用
|
||||||
|
|
||||||
|
Bind Mount:
|
||||||
|
- 宿主机管理,任意位置
|
||||||
|
- 跨平台兼容性一般
|
||||||
|
- 性能好,用于开发环境
|
||||||
|
- 权限管理复杂
|
||||||
|
|
||||||
|
tmpfs:
|
||||||
|
- 内存文件系统,不持久化
|
||||||
|
- 用于临时文件、敏感数据
|
||||||
|
- 性能最好,重启丢失
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 安全和生产面试题
|
||||||
|
|
||||||
|
**Q8: 如何提高 Docker 安全性?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
镜像安全:
|
||||||
|
- 使用官方镜像或可信镜像源
|
||||||
|
- 定期扫描漏洞(Trivy/Grype)
|
||||||
|
- 镜像签名验证(Cosign)
|
||||||
|
- 生成和管理 SBOM
|
||||||
|
|
||||||
|
容器运行:
|
||||||
|
- 以非 root 用户运行
|
||||||
|
- 使用 read-only 文件系统
|
||||||
|
- 限制 Linux 能力
|
||||||
|
- 使用 AppArmor 或 SELinux
|
||||||
|
|
||||||
|
宿主机安全:
|
||||||
|
- 启用 TLS 认证 API
|
||||||
|
- 不暴露 /var/run/docker.sock
|
||||||
|
- 使用 Rootless 容器
|
||||||
|
- 定期更新 Docker
|
||||||
|
|
||||||
|
网络安全:
|
||||||
|
- 使用自定义网络隔离
|
||||||
|
- 配置网络策略
|
||||||
|
- 限制出入站流量
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q9: 容器被 OOM 杀死,如何诊断和解决?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
诊断:
|
||||||
|
1. 检查容器是否被 OOM 杀死:
|
||||||
|
docker inspect <container> | grep OOMKilled
|
||||||
|
|
||||||
|
2. 查看宿主机日志:
|
||||||
|
dmesg | grep -i oom
|
||||||
|
journalctl -u docker | grep -i oom
|
||||||
|
|
||||||
|
3. 监控内存使用:
|
||||||
|
docker stats <container>
|
||||||
|
docker exec <container> ps aux --sort=-%mem
|
||||||
|
|
||||||
|
解决:
|
||||||
|
1. 增加内存限制:
|
||||||
|
docker update -m 2g <container>
|
||||||
|
|
||||||
|
2. 检查内存泄漏:
|
||||||
|
使用内存分析工具(heapdump、pprof)
|
||||||
|
|
||||||
|
3. 优化应用:
|
||||||
|
- 增加垃圾回收频率
|
||||||
|
- 减少缓存大小
|
||||||
|
- 使用对象池模式
|
||||||
|
|
||||||
|
4. 使用内存交换(最后手段):
|
||||||
|
docker run -m 512m --memory-swap 1g
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q10: 如何在 CI/CD 中集成 Docker?**
|
||||||
|
|
||||||
|
A(要点):
|
||||||
|
```
|
||||||
|
构建阶段:
|
||||||
|
- 触发器:Push / PR 事件
|
||||||
|
- 构建镜像:docker build
|
||||||
|
- 标记:git sha、版本号
|
||||||
|
- 扫描:Trivy 漏洞扫描
|
||||||
|
- 签名:Cosign 镜像签名
|
||||||
|
|
||||||
|
存储阶段:
|
||||||
|
- 推送到镜像仓库:docker push
|
||||||
|
- 记录 SBOM 和扫描报告
|
||||||
|
|
||||||
|
部署阶段:
|
||||||
|
- 验证镜像签名
|
||||||
|
- 获取镜像摘要
|
||||||
|
- 更新部署配置
|
||||||
|
- 触发 GitOps 工作流
|
||||||
|
|
||||||
|
监控阶段:
|
||||||
|
- 收集应用日志
|
||||||
|
- 监控性能指标
|
||||||
|
- 告警异常情况
|
||||||
|
|
||||||
|
示例工作流:
|
||||||
|
1. GitHub Actions / GitLab CI 监听 push
|
||||||
|
2. 运行单元测试
|
||||||
|
3. 构建 Docker 镜像
|
||||||
|
4. 推送到 Docker Hub / ECR
|
||||||
|
5. 触发 ArgoCD / Flux 自动部署
|
||||||
|
6. 监控部署状态
|
||||||
|
```
|
||||||
|
|
||||||
|
### 学习进度跟踪模板
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Docker 学习进度跟踪
|
||||||
|
|
||||||
|
## 第一阶段:基础入门(目标:2 周)
|
||||||
|
- [ ] 学完第 1-3 章(6 小时)
|
||||||
|
- [ ] 完成基础命令练习(10 小时)
|
||||||
|
- [ ] 运行官方镜像
|
||||||
|
- [ ] 创建和推送第一个镜像到 Docker Hub
|
||||||
|
- [ ] 完成度:___%
|
||||||
|
|
||||||
|
## 第二阶段:核心开发(目标:4-6 周)
|
||||||
|
- [ ] 学完第 4-11 章(15 小时)
|
||||||
|
- [ ] 完成 3 个 Dockerfile 最佳实践项目
|
||||||
|
- [ ] 掌握 Docker Compose(5 个项目)
|
||||||
|
- [ ] 学习数据管理和网络(8 小时)
|
||||||
|
- [ ] 完成度:___%
|
||||||
|
|
||||||
|
## 第三阶段:生产优化(目标:6-12 周)
|
||||||
|
- [ ] 学完第 12-21 章(25 小时)
|
||||||
|
- [ ] 镜像安全扫描和签名
|
||||||
|
- [ ] 搭建完整监控栈
|
||||||
|
- [ ] 配置 CI/CD 流程
|
||||||
|
- [ ] Kubernetes 基础(30 小时)
|
||||||
|
- [ ] 完成度:___%
|
||||||
|
|
||||||
|
## 第四阶段:专家深造(目标:12+ 周)
|
||||||
|
- [ ] Kubernetes 高级特性
|
||||||
|
- [ ] 服务网格学习
|
||||||
|
- [ ] 底层实现研究
|
||||||
|
- [ ] 贡献开源项目
|
||||||
|
- [ ] 完成度:___%
|
||||||
|
|
||||||
|
## 证书目标
|
||||||
|
- [ ] Docker DCA 认证
|
||||||
|
- [ ] CKA 认证
|
||||||
|
- [ ] CKAD 认证
|
||||||
|
|
||||||
|
## 实战项目清单
|
||||||
|
- [ ] Python Web 应用容器化
|
||||||
|
- [ ] Node.js 微服务
|
||||||
|
- [ ] 数据库容器化
|
||||||
|
- [ ] 完整微服务架构
|
||||||
|
- [ ] 监控和日志系统
|
||||||
|
- [ ] CI/CD 流程实现
|
||||||
|
```
|
||||||
|
|
||||||
|
### 快速参考速查表
|
||||||
|
|
||||||
|
**常用命令速查:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 镜像管理
|
||||||
|
docker build -t image:tag . # 构建镜像
|
||||||
|
docker images # 列出镜像
|
||||||
|
docker rmi image:tag # 删除镜像
|
||||||
|
docker tag source:tag target:tag # 标记镜像
|
||||||
|
docker push registry/image:tag # 推送镜像
|
||||||
|
docker pull image:tag # 拉取镜像
|
||||||
|
docker history image:tag # 查看镜像历史
|
||||||
|
docker inspect image:tag # 查看镜像详情
|
||||||
|
|
||||||
|
# 容器管理
|
||||||
|
docker run [OPTIONS] image # 运行容器
|
||||||
|
docker ps [-a] # 列出容器
|
||||||
|
docker stop/start/restart container # 容器生命周期
|
||||||
|
docker rm container # 删除容器
|
||||||
|
docker logs [-f] container # 查看日志
|
||||||
|
docker exec -it container cmd # 进入容器
|
||||||
|
docker inspect container # 查看容器详情
|
||||||
|
docker stats [container] # 查看资源使用
|
||||||
|
|
||||||
|
# 网络管理
|
||||||
|
docker network ls # 列出网络
|
||||||
|
docker network create name # 创建网络
|
||||||
|
docker network connect/disconnect # 连接/断开网络
|
||||||
|
docker network inspect name # 查看网络详情
|
||||||
|
|
||||||
|
# 卷管理
|
||||||
|
docker volume ls # 列出卷
|
||||||
|
docker volume create name # 创建卷
|
||||||
|
docker volume rm name # 删除卷
|
||||||
|
docker volume inspect name # 查看卷详情
|
||||||
|
|
||||||
|
# Docker Compose
|
||||||
|
docker-compose up [-d] # 启动服务
|
||||||
|
docker-compose down # 停止服务
|
||||||
|
docker-compose ps # 列出服务
|
||||||
|
docker-compose logs [-f] [service] # 查看日志
|
||||||
|
docker-compose exec service cmd # 在服务中执行命令
|
||||||
|
docker-compose build # 构建服务镜像
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user