Skip to content

知识点

1. Docker 容器与虚拟机(VM)的本质区别是什么?

  • 隔离级别 :VM 通过 Hypervisor 虚拟化硬件资源(完全隔离),而容器通过 Linux 内核的 Namespace 和 Cgroup 实现进程级隔离(共享宿主机内核)。
  • 资源开销 :容器轻量(MB 级)、启动快(秒级);VM 需要完整的 OS(GB 级),启动慢(分钟级)。
  • 安全性 :VM 的隔离性更强,容器因共享内核可能存在安全风险(需结合 Seccomp、AppArmor 等加固)。

2. 如何优化 Docker 镜像体积?

  • 多阶段构建 :分离编译环境和运行环境(如用 golang 镜像编译,用 alpine 作为最终镜像)。
  • 最小化基础镜像 :优先选择 alpinescratchdistroless
  • 合并层 :通过 && 串联命令,减少镜像层数。
  • 清理缓存 :在 RUN 命令中删除不必要的缓存文件(如 apt-get clean)。
  • 使用 .dockerignore :避免将无关文件(如日志、临时文件)复制到镜像。

示例多阶段构建

dockerfile

# 阶段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"]

3. Docker 网络模式有哪些?如何实现跨主机容器通信?

  • 默认网络模式
  • bridge:默认模式,通过 docker0 网桥通信。
  • host:容器直接使用宿主机网络栈。
  • none:无网络。
  • container:<name>:共享其他容器的网络命名空间。
  • 跨主机通信方案
  • Overlay 网络 :使用 Docker Swarm 或 Kubernetes 的 overlay 驱动(基于 VXLAN)。
  • Macvlan/IPvlan :为容器分配宿主机物理接口的 MAC/IP(需网络设备支持)。
  • 第三方工具 :Calico、Flannel、Weave 等。

4. 如何限制容器的 CPU 和内存使用?

通过 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 实现资源限制。


5. Docker 数据持久化的方式有哪些?

  • Bind Mount :直接将宿主机目录挂载到容器(-v /host/path:/container/path)。
  • Volume :由 Docker 管理的存储卷(-v volume_name:/container/path),更易备份和迁移。
  • tmpfs Mount :仅存储在内存中(--tmpfs /container/path)。

生产建议 :优先使用 Volume,避免容器删除后数据丢失。


6. 如何调试运行中的容器?

  • 进入容器docker exec -it <container_id> /bin/bash
  • 查看日志docker logs -f <container_id>
  • 检查进程docker top <container_id>
  • 网络诊断 :在容器内使用 curlpingnslookup
  • 检查元数据docker inspect <container_id>

7. Docker 安全性最佳实践有哪些?

  • 非 Root 用户运行容器 :在 Dockerfile 中添加 USER <username>
  • 只读文件系统docker run --read-only
  • 限制能力(Capabilities)--cap-drop ALL --cap-add NET_BIND_SERVICE
  • 使用 Seccomp/AppArmor :限制容器的系统调用。
  • 镜像扫描 :使用 TrivyClair 扫描镜像漏洞。
  • 最小化镜像 :减少攻击面(如使用多阶段构建)。

8. 如何实现容器的高可用和负载均衡?

  • Docker Swarm :内建服务发现、负载均衡和滚动更新。
  • Kubernetes :通过 Service 和 Ingress 实现负载均衡,结合 Deployment 保证副本数。
  • 第三方工具 :HAProxy 或 Nginx 作为反向代理。

9. 解释 Docker 的联合文件系统(UnionFS)及其作用

  • 原理 :UnionFS 将多个文件系统(镜像层)叠加为单一视图,层之间为只读,容器层可写。
  • 作用
  • 镜像分层复用,节省存储空间。
  • 加快镜像构建和分发速度(仅传输差异层)。

10. 什么是 Docker BuildKit?它有哪些优势?

  • BuildKit :Docker 的下一代镜像构建工具(需启用 DOCKER_BUILDKIT=1)。
  • 优势
  • 并行构建不同层,提升构建速度。
  • 缓存机制优化(仅重建受影响的层)。
  • 支持 SSH 代理、密钥安全传递等高级功能。

进阶:

  • 如何监控 Docker 容器性能? (答:docker stats、Prometheus + cAdvisor、Grafana)
  • 解释 Kubernetes 与 Docker Swarm 的异同 (答:K8s 功能更强大但复杂,Swarm 更轻量)
  • 如何实现容器的零停机更新? (答:滚动更新策略 + 健康检查)