Docker面试全攻略(一):镜像打包、容器运行与高频问题解析

引言

在云原生和微服务架构盛行的今天,Docker 已成为后端开发的必备技能。本文从 面试高频考点 出发,系统梳理 Docker 镜像构建、容器运行的核心知识点,助你轻松应对 Docker 相关的技术面试!


一、Docker 镜像构建核心(面试必问)

1. Dockerfile 核心命令与参数

  • FROM :基础镜像(必须为第一条指令),支持多阶段构建(AS 命名阶段)。

  • COPY vs ADD

    • COPY:仅复制本地文件。
    • ADD:支持自动解压和从 URL 下载文件(慎用,易导致镜像臃肿)。
  • RUN :执行命令并生成新镜像层,可通过 --mount 挂载缓存目录加速构建。

  • CMD vs ENTRYPOINT

    • CMD:容器启动的默认命令(可被 docker run 覆盖)。
    • ENTRYPOINT:入口命令(CMD 作为参数追加)。
  • ARGENV

    • 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 命令并清理缓存。
  • Q2:Dockerfile 中 CMDENTRYPOINT 的区别?

    • 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. 容器调试技巧

  • 查看日志

    bash 复制代码
    docker logs -f <容器名>  # 实时跟踪日志
  • 进入容器终端

    bash 复制代码
    docker exec -it <容器名> bash
  • 文件复制

    bash 复制代码
    docker cp /host/file <容器名>:/container/path  # 宿主机→容器
    docker cp <容器名>:/container/file /host/path  # 容器→宿主机

3. 高频面试问题

  • Q1:如何解决容器启动后立即退出的问题?

    • 检查容器日志(docker logs);确保主进程未退出(如使用 CMD ["nginx", "-g", "daemon off;"])。
  • Q2:如何实现容器数据持久化?

    • 使用数据卷(-v 挂载)或绑定宿主机目录。

三、进阶考点(面试加分项)

1. 安全最佳实践

  • 非 root 用户运行

    dokerfile 复制代码
    RUN groupadd -r app && useradd -r -g app app
    USER app:app
  • 镜像扫描 :使用 docker scan 或第三方工具(如 Trivy)检测漏洞。

2. 多平台构建与 CI/CD 集成

  • 跨平台构建

    bash 复制代码
    docker buildx build --platform linux/amd64,linux/arm64 -t my-app:multi-arch .
  • CI/CD 示例:在 GitLab CI 中自动构建并推送镜像:

    yaml 复制代码
    build_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 的核心原理和实战技巧,不仅能应对面试,更是提升开发效率的关键。建议结合以下步骤巩固:

  1. 动手实践:从编写 Dockerfile 到部署完整应用。
  2. 深入原理:学习容器隔离机制(Namespace、Cgroups)。
  3. 关注生态:了解 Kubernetes、Docker Compose 等扩展工具。
相关推荐
uhakadotcom5 分钟前
Apache Airflow DAG Factory 简介
后端·面试·github
Dignity_呱6 分钟前
决定我的offer:问了我3个websocket的问题
前端·websocket·面试
邹卓为11 分钟前
docker 安装 jenkins
java·docker·jenkins
我是唐青枫14 分钟前
Rust cargo 命令行工具使用教程
开发语言·后端·rust
uhakadotcom15 分钟前
使用 AI 控制浏览器:Browser Use 简介
后端·面试·github
世界哪有真情22 分钟前
一分钟学会windows上使用Docker
前端·后端
哪吒编程22 分钟前
突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据
后端·python
弧襪34 分钟前
Docker Swarm 集群
docker·容器·eureka
bobz96537 分钟前
linux 内核链路层 contrack 和 网络层 contrack 的机制解释与区别?
后端
掘金安东尼41 分钟前
🧭 前端周刊第409期(2025年4月7日-13日)
前端·javascript·面试