引言
在云原生和微服务架构盛行的今天,Docker 已成为后端开发的必备技能。本文从 面试高频考点 出发,系统梳理 Docker 镜像构建、容器运行的核心知识点,助你轻松应对 Docker 相关的技术面试!
一、Docker 镜像构建核心(面试必问)
1. Dockerfile 核心命令与参数
-
FROM
:基础镜像(必须为第一条指令),支持多阶段构建(AS
命名阶段)。 -
COPY
vsADD
:COPY
:仅复制本地文件。ADD
:支持自动解压和从 URL 下载文件(慎用,易导致镜像臃肿)。
-
RUN
:执行命令并生成新镜像层,可通过--mount
挂载缓存目录加速构建。 -
CMD
vsENTRYPOINT
:CMD
:容器启动的默认命令(可被docker run
覆盖)。ENTRYPOINT
:入口命令(CMD
作为参数追加)。
-
ARG
与ENV
:ARG
:构建时临时变量(通过--build-arg
覆盖)。ENV
:运行时环境变量。
2. 镜像构建优化技巧
-
多阶段构建:分离编译环境与运行时环境,减小镜像体积。
dockerfile# 阶段1:构建应用 FROM maven AS builder COPY . . RUN mvn package # 阶段2:运行应用 FROM openjdk:11-jre COPY --from=builder /app/target/*.jar /app.jar
-
缓存利用 :优先复制
pom.xml
/package.json
,再执行依赖安装。 -
最小化镜像:使用 Alpine 等轻量基础镜像,删除无用文件。
3. 高频面试问题
-
Q1:如何减少 Docker 镜像体积?
- 使用多阶段构建;选择 Alpine 镜像;合并
RUN
命令并清理缓存。
- 使用多阶段构建;选择 Alpine 镜像;合并
-
Q2:Dockerfile 中
CMD
和ENTRYPOINT
的区别?ENTRYPOINT
定义入口命令,CMD
提供默认参数,两者结合可实现灵活的命令扩展。
二、容器运行与管理(实战考点)
1. 核心命令与参数
-
docker run
关键参数:bash-d # 后台运行 -p 8080:80 # 端口映射 -v /data:/app # 数据卷挂载 --name web # 容器命名 -e KEY=value # 环境变量注入 --restart=always # 自动重启
-
资源限制:
bash--memory=512m # 内存限制 --cpus=2 # CPU 核数限制
2. 容器调试技巧
-
查看日志:
bashdocker logs -f <容器名> # 实时跟踪日志
-
进入容器终端:
bashdocker exec -it <容器名> bash
-
文件复制:
bashdocker cp /host/file <容器名>:/container/path # 宿主机→容器 docker cp <容器名>:/container/file /host/path # 容器→宿主机
3. 高频面试问题
-
Q1:如何解决容器启动后立即退出的问题?
- 检查容器日志(
docker logs
);确保主进程未退出(如使用CMD ["nginx", "-g", "daemon off;"]
)。
- 检查容器日志(
-
Q2:如何实现容器数据持久化?
- 使用数据卷(
-v
挂载)或绑定宿主机目录。
- 使用数据卷(
三、进阶考点(面试加分项)
1. 安全最佳实践
-
非 root 用户运行:
dokerfileRUN groupadd -r app && useradd -r -g app app USER app:app
-
镜像扫描 :使用
docker scan
或第三方工具(如 Trivy)检测漏洞。
2. 多平台构建与 CI/CD 集成
-
跨平台构建:
bashdocker buildx build --platform linux/amd64,linux/arm64 -t my-app:multi-arch .
-
CI/CD 示例:在 GitLab CI 中自动构建并推送镜像:
yamlbuild_image: stage: build script: - docker build -t my-app:$CI_COMMIT_SHA . - docker push my-app:$CI_COMMIT_SHA
3. 高频面试问题
-
Q1:解释 Docker 的联合文件系统(UnionFS)?
- 镜像由多个只读层叠加,容器层为可写层,实现高效存储和复用。
-
Q2:Docker 网络模式有哪些?
bridge
(默认)、host
(共享宿主机网络)、none
(无网络)、自定义网络。
四、总结
掌握 Docker 的核心原理和实战技巧,不仅能应对面试,更是提升开发效率的关键。建议结合以下步骤巩固:
- 动手实践:从编写 Dockerfile 到部署完整应用。
- 深入原理:学习容器隔离机制(Namespace、Cgroups)。
- 关注生态:了解 Kubernetes、Docker Compose 等扩展工具。