Skip to content

知识点

Docker 容器与虚拟机(VM)的区别

隔离级别

  • VM 通过 Hypervisor 虚拟化硬件资源(完全隔离)
  • 容器通过 Linux 内核的 Namespace 和 Cgroup 实现进程级隔离(共享宿主机内核)

资源开销

  • 容器轻量(MB 级)、启动快(秒级)
  • VM 需要完整的 OS(GB 级),启动慢(分钟级)

安全性

  • VM 的隔离性更强
  • 容器因共享内核可能存在安全风险(需结合 Seccomp、AppArmor 等加固)

Docker 镜像体积优化

1. 多阶段构建

  • 分离编译环境和运行环境
  • 示例:用 golang 镜像编译,用 alpine 作为最终镜像

2. 最小化基础镜像

  • 优先选择 alpinescratchdistroless

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>

网络诊断

  • 在容器内使用 curlpingnslookup

检查元数据

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. 镜像扫描

  • 使用 TrivyClair 扫描镜像漏洞

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