Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Docker FAQ

内容:基础概念、镜像、容器、网络、存储、Compose、Registry、优化、安全、生产运维实践。

1️⃣ Docker 基础概念

1. 什么是 Docker?

Docker 是一个基于 容器技术 的应用打包、分发、部署平台,解决了:

  • 应用环境一致性问题
  • 打包与迁移困难
  • 部署流程复杂

核心优势:构建一次,到处运行。

2. 镜像(Image)是什么?

镜像是 只读模板,类似:

  • 一个文件系统快照
  • 包含程序和运行环境

镜像可分为:

  • 基础镜像(如 ubuntu、python)
  • 应用镜像(基于基础镜像构建)

3. 容器(Container)是什么?

容器是镜像的运行实例,包含:

  • 进程
  • 文件系统写层
  • 网络隔离
  • cgroups 资源限制

容器是轻量级“进程级虚拟化”

4. Docker 与 虚拟机(VM)的区别?

对比项 Docker 虚拟机
启动速度 秒级 分钟级
资源开销
隔离方式 进程级(namespace + cgroups) 完整操作系统
镜像体积
部署方式 快速便携 笨重

5. 什么是 Dockerfile?

Dockerfile 是用于 构建镜像的脚本文件,包含:

FROM
RUN
COPY
CMD
EXPOSE
ENTRYPOINT

6. 什么是 OCI?

OCI = Open Container Initiative

规范包括:

  • 镜像规范(Image Spec)
  • 运行时规范(Runtime Spec,如 runc)

Docker 已遵从 OCI。

2️⃣ 镜像

7. 镜像分层是什么?为什么需要分层?

镜像是由多层文件系统组成,每条指令(RUN/COPY)会生成一层。

好处:

  • 层可复用(提高构建速度)
  • 节省空间
  • 构建时可以利用缓存

8. COPY 和 ADD 区别是什么?

COPY – 复制文件(推荐)

ADD – 附加功能:

  • 自动解压 tar
  • 支持 URL 下载

最佳实践:永远优先使用 COPY。

9. CMD 和 ENTRYPOINT 区别?

指令 作用
CMD 默认命令,可被覆盖
ENTRYPOINT 主命令,不会被覆盖

最佳实践:

ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]

10. WORKDIR、ENV、EXPOSE 的作用?

  • WORKDIR:设置工作目录
  • ENV:设置环境变量
  • EXPOSE:声明镜像监听的端口(仅文档意义)

11. 如何减少镜像体积?(非常常见)

  • 使用 slim/alpine/distroless
  • 多阶段构建(multi-stage)
  • 合并 RUN
  • 清理缓存(apt clean / npm cache clean)
  • 使用 .dockerignore

12. 如何加快 Docker build 速度?

  • 合理使用缓存
  • 优先 COPY package.json / go.mod
  • 多阶段构建
  • 使用 BuildKit

3️⃣ 容器运行相关

13. docker run 的重要参数有哪些?

  • -d 后台运行
  • -p 端口映射
  • -v 数据卷挂载
  • –name 容器名
  • –network 指定网络
  • –restart=always 自动拉起
  • -e 环境变量

14. 容器和宿主机共享哪些资源?

  • 内核
  • 网络(通过 namespace 隔离)
  • 文件系统挂载点(mount)
  • CPU/内存限制(cgroups)

15. 如何进入容器?

docker exec -it <container> /bin/bash

16. 如何查看容器日志?

docker logs -f

17. 什么是 docker restart policy?

  • no
  • always
  • unless-stopped
  • on-failure

4️⃣ Docker 网络

18. Docker 网络模式有哪些?

| 模式 | 说明 | | bridge | 默认模式,私网 | | host | 使用宿主机网络 | | none | 无网络 | | container | 共用另一个容器的网络 |

19. 什么是端口映射?

docker run -p 8080:80 nginx
  • 左:宿主机
  • 右:容器

20. 什么是 Docker overlay 网络?

在 Swarm 或 Kubernetes 中跨主机通信的网络。

5️⃣ Docker 存储(volume)

21. 数据卷 Volume 是什么?

容器与宿主机共享的持久数据目录。

好处:

  • 多容器共享数据
  • 容器销毁后数据保留
  • 性能优于 bind mount

22. bind mount 与 volume 区别?

对比项 Volume Bind mount
性能 中等
灵活性
隔离 低(直接访问宿主机目录)
Portability

23. 如何清理所有无用镜像与 volume?

docker system prune -a
docker volume prune

6️⃣ 镜像仓库(Registry)

24. Docker Hub 与 Registry 的区别?

  • Docker Hub:公开仓库(SaaS)
  • Registry:企业私有仓库

25. 如何搭建一个私有 Registry?

docker run -d -p 5000:5000 registry:2

26. 如何给镜像打标签并推送?

docker tag myapp registry:5000/myapp
docker push registry:5000/myapp

7️⃣ Docker Compose

27. Docker Compose 是什么?

Compose 是一个 多容器编排工具,用于定义和运行多容器应用。

28. docker-compose.yml 常见字段?

services:
  app:
    image: xxx
    build: .
    ports:
    - "8080:80"
    volumes:
    - ./data:/data

29. compose up / down 区别?

docker compose up -d   # 启动
docker compose down    # 删除容器、网络

8️⃣ Docker 性能优化

30. 如何优化 Docker 启动速度?

  • 使用更小基础镜像
  • 精简镜像层
  • 避免在容器入口执行复杂脚本

31. 如何优化 Docker 镜像大小?

  • 使用 alpine/slim
  • 多阶段构建
  • dockerignore
  • 清理缓存

32. Docker IO 性能如何优化?

  • 避免频繁写入容器文件系统
  • 使用 volume
  • 避免 journal/log 在容器中堆积

9️⃣ Docker 安全

33. 如何提高 Docker 安全性?

  • 镜像不要使用 latest
  • 不要在容器内运行 root
  • 使用 seccomp、AppArmor
  • 关闭不必要的 capability
  • 不要把 secrets 写入镜像

34. PID 隔离是什么?

不同容器的进程互不可见。

35. Docker 是如何实现隔离的?

  • namespace(pid/net/ipc/uts/mount)
  • cgroups(CPU/内存限制)
  • 联合文件系统(AUFS/overlayfs)

🔟 企业实战与故障处理

36. 如何定位容器 CPU 过高?

docker stats
docker top <container>

进入容器后:

top
ps aux

37. 容器磁盘占用变大如何排查?

  • docker system df
  • 容器写入大量日志
  • volume 写入过多数据
  • overlay2 文件膨胀

38. 镜像构建失败如何排查?

  • 检查 Dockerfile 指令顺序
  • 使用 –progress=plain –no-cache 观察详细日志
  • 检查 dockerignore

39. 如何实现灰度发布?

方案:

  • 运行多个版本的容器
  • 通过 Nginx/LB 配置权重
  • Kubernetes Deployment(滚动升级)

40. Docker Swarm 和 Kubernetes 的关系?

对比项 Swarm Kubernetes
功能丰富
社区支持
学习成本
企业使用量 极高

如今企业基本都运行 Kubernetes。