知识点
1. Docker 容器与虚拟机(VM)的本质区别是什么?
- 隔离级别 :VM 通过 Hypervisor 虚拟化硬件资源(完全隔离),而容器通过 Linux 内核的 Namespace 和 Cgroup 实现进程级隔离(共享宿主机内核)。
- 资源开销 :容器轻量(MB 级)、启动快(秒级);VM 需要完整的 OS(GB 级),启动慢(分钟级)。
- 安全性 :VM 的隔离性更强,容器因共享内核可能存在安全风险(需结合 Seccomp、AppArmor 等加固)。
2. 如何优化 Docker 镜像体积?
- 多阶段构建 :分离编译环境和运行环境(如用
golang镜像编译,用alpine作为最终镜像)。 - 最小化基础镜像 :优先选择
alpine、scratch或distroless。 - 合并层 :通过
&&串联命令,减少镜像层数。 - 清理缓存 :在
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>。 - 网络诊断 :在容器内使用
curl、ping或nslookup。 - 检查元数据 :
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 :限制容器的系统调用。
- 镜像扫描 :使用
Trivy或Clair扫描镜像漏洞。 - 最小化镜像 :减少攻击面(如使用多阶段构建)。
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 更轻量)
- 如何实现容器的零停机更新? (答:滚动更新策略 + 健康检查)