知识点
Docker 容器与虚拟机(VM)的区别
隔离级别
- VM 通过 Hypervisor 虚拟化硬件资源(完全隔离)
- 容器通过 Linux 内核的 Namespace 和 Cgroup 实现进程级隔离(共享宿主机内核)
资源开销
- 容器轻量(MB 级)、启动快(秒级)
- VM 需要完整的 OS(GB 级),启动慢(分钟级)
安全性
- VM 的隔离性更强
- 容器因共享内核可能存在安全风险(需结合 Seccomp、AppArmor 等加固)
Docker 镜像体积优化
1. 多阶段构建
- 分离编译环境和运行环境
- 示例:用
golang镜像编译,用alpine作为最终镜像
2. 最小化基础镜像
- 优先选择
alpine、scratch或distroless
3. 合并层
- 通过
&&串联命令,减少镜像层数
4. 清理缓存
- 在
RUN命令中删除不必要的缓存文件(如apt-get clean)
5. 使用 .dockerignore
- 避免将无关文件(如日志、临时文件)复制到镜像
多阶段构建示例:
# 阶段1:编译
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
# 阶段2:运行
FROM alpine:latest
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Docker 网络模式
默认网络模式
bridge:默认模式,通过docker0网桥通信host:容器直接使用宿主机网络栈none:无网络container:<name>:共享其他容器的网络命名空间
跨主机通信方案
- Overlay 网络:使用 Docker Swarm 或 Kubernetes 的 overlay 驱动(基于 VXLAN)
- Macvlan/IPvlan:为容器分配宿主机物理接口的 MAC/IP(需网络设备支持)
- 第三方工具:Calico、Flannel、Weave 等
容器资源限制
通过 docker run 的 --cpus 和 --memory 参数限制资源:
docker run -it --cpus=2 --memory=512m --memory-swap=1g nginx
参数说明
--cpus:限制 CPU 核心数(支持小数,如1.5)--memory:限制内存(单位:m/g)--memory-swap:总内存 + Swap 大小(需 >=--memory)
原理
底层通过 Cgroups 实现资源限制
Docker 数据持久化
Bind Mount
- 直接将宿主机目录挂载到容器
- 命令:
-v /host/path:/container/path
Volume
- 由 Docker 管理的存储卷
- 命令:
-v volume_name:/container/path - 更易备份和迁移
tmpfs Mount
- 仅存储在内存中
- 命令:
--tmpfs /container/path
生产建议
优先使用 Volume,避免容器删除后数据丢失
容器调试
进入容器
docker exec -it <container_id> /bin/bash
查看日志
docker logs -f <container_id>
检查进程
docker top <container_id>
网络诊断
- 在容器内使用
curl、ping或nslookup
检查元数据
docker inspect <container_id>
Docker 安全性最佳实践
1. 非 Root 用户运行容器
- 在 Dockerfile 中添加
USER <username>
2. 只读文件系统
docker run --read-only
3. 限制能力(Capabilities)
--cap-drop ALL --cap-add NET_BIND_SERVICE
4. 使用 Seccomp/AppArmor
- 限制容器的系统调用
5. 镜像扫描
- 使用
Trivy或Clair扫描镜像漏洞
6. 最小化镜像
- 减少攻击面(如使用多阶段构建)
容器高可用和负载均衡
Docker Swarm
- 内建服务发现、负载均衡和滚动更新
Kubernetes
- 通过 Service 和 Ingress 实现负载均衡
- 结合 Deployment 保证副本数
第三方工具
- HAProxy 或 Nginx 作为反向代理
Docker 联合文件系统(UnionFS)
原理
- UnionFS 将多个文件系统(镜像层)叠加为单一视图
- 层之间为只读,容器层可写
作用
- 镜像分层复用,节省存储空间
- 加快镜像构建和分发速度(仅传输差异层)
Docker BuildKit
简介
- Docker 的下一代镜像构建工具(需启用
DOCKER_BUILDKIT=1)
优势
- 并行构建不同层,提升构建速度
- 缓存机制优化(仅重建受影响的层)
- 支持 SSH 代理、密钥安全传递等高级功能
容器性能监控
1. Docker 内置命令
docker stats
2. 监控工具组合
- Prometheus + cAdvisor + Grafana
3. 监控指标
- CPU 使用率
- 内存使用率
- 网络流量
- 磁盘 I/O