Docker面试题分类整理

Docker面试题分类及详细解答

Docker面试题分类整理

一、Docker基础概念

1. 什么是Docker?它和虚拟机有什么区别?

答案:
Docker是一个开源的容器化平台,可以让你把应用程序和它需要的所有东西(代码、运行时、系统工具、系统库等)打包成一个轻量级的、可移植的容器。

与虚拟机的区别:

  • 虚拟机:每个虚拟机都包含完整的操作系统,运行在虚拟硬件上,通过Hypervisor与物理硬件交互。启动慢、占用资源多。
  • Docker容器:共享主机操作系统内核,只包含应用和依赖,没有完整的操作系统。启动快、占用资源少、更轻量级。

原理大白话:
想象你要搬家:

  • 虚拟机就像把整个房子(操作系统)都搬走,包括地基(内核)、墙壁(系统库)、家具(应用)。
  • Docker就像只打包你的家具(应用)和必要的装饰品(依赖),搬到新房子(主机)后直接用新房子已有的地基和墙壁。

2. Docker的三个核心概念是什么?

答案:

  1. 镜像(Image):只读模板,包含创建容器所需的所有文件和配置。相当于安装光盘。
  2. 容器(Container):镜像的运行实例,包含运行中的应用程序及其运行环境。相当于安装好的系统。
  3. 仓库(Registry):存放镜像的地方,分为公共仓库(如Docker Hub)和私有仓库。

原理大白话:

  • 镜像就像做蛋糕的模具
  • 容器就是用模具做出来的实际蛋糕
  • 仓库就是存放各种模具的架子

二、Docker镜像

1. Docker镜像的分层存储是什么原理?

答案:
Docker镜像由一系列只读层(layer)组成,每个层代表Dockerfile中的一条指令。当创建新容器时,Docker会在镜像层之上添加一个可写层(容器层)。

原理大白话:
想象你在画画:

  • 底层是画布(基础镜像)
  • 每画一笔就是添加一个新图层(镜像层)
  • 这些图层叠加起来就是完整的画(镜像)
  • 当你想修改时,是在最上面加一个透明图层修改(容器层),不会破坏下面的原画

2. Dockerfile中的COPY和ADD指令有什么区别?

答案:

  • COPY:仅支持将本地文件复制到容器中
  • ADD:除了复制文件外,还支持:
    • 自动解压tar文件
    • 可以从URL下载文件(但不推荐,因为无法验证下载内容)

最佳实践:除非需要解压或从URL获取,否则优先使用COPY,因为它更透明、可预测。

三、Docker容器

1. 如何查看运行中的容器日志?

答案:

docker logs [容器ID/名称]  # 查看日志
docker logs -f [容器ID/名称]  # 实时跟踪日志
docker logs --tail 100 [容器ID/名称]  # 查看最后100行日志

原理说明:
Docker会捕获容器的标准输出(stdout)和标准错误(stderr),并存储起来。docker logs命令就是查看这些被捕获的输出。

2. 如何进入正在运行的Docker容器?

答案:

docker exec -it [容器ID/名称] /bin/bash
  • -i:保持STDIN打开(允许输入)
  • -t:分配一个伪终端(提供交互式shell体验)

替代方案

docker attach [容器ID/名称]

但attach是直接连接到容器的主进程,退出会导致容器停止,不推荐。

四、Docker网络

1. Docker有哪几种网络模式?

答案:

  1. bridge(桥接模式):默认模式,容器通过docker0虚拟网桥通信
  2. host(主机模式):容器直接使用主机网络,没有隔离
  3. none(无网络):容器没有网络接口
  4. container(容器模式):共享另一个容器的网络栈
  5. 自定义网络:用户自定义的网络驱动

原理大白话:

  • bridge模式:就像小区里的住户(容器)通过小区大门(docker0)与外界通信
  • host模式:就像直接住在大街上,没有小区围墙
  • none模式:就像住在封闭的房间里,没有门窗
  • container模式:就像你和邻居共用同一个电话号码

2. 如何让两个Docker容器互相通信?

答案:

  1. 通过IP地址:不推荐,因为IP可能变化

  2. 通过容器名称:需要创建自定义网络

    docker network create mynet
    docker run --net=mynet --name=container1 ...
    docker run --net=mynet --name=container2 ...
    

    然后container1可以直接ping container2

  3. 通过–link(已废弃):不推荐使用

原理说明:
Docker内置了DNS服务,在自定义网络中可以通过容器名称解析IP。自定义网络还提供了更好的隔离性和额外的功能(如网络别名)。

五、Docker存储

1. Docker的数据持久化有哪几种方式?

答案:

  1. 数据卷(Volume):由Docker管理的主机文件系统的一部分,最佳实践

    docker volume create myvol
    docker run -v myvol:/path/in/container ...
    
  2. 绑定挂载(Bind Mount):直接挂载主机上的任意目录或文件

    docker run -v /host/path:/container/path ...
    
  3. tmpfs挂载:仅存储在内存中,不持久化

原理大白话:

  • 数据卷就像专门为Docker准备的U盘
  • 绑定挂载就像直接把主机硬盘上的文件夹共享给容器
  • tmpfs就像写在黑板上的临时笔记,关机就消失

2. 容器删除后,数据卷会怎样?

答案:

  • 默认情况下,删除容器不会自动删除其关联的数据卷

  • 使用docker rm -v删除容器时会同时删除匿名卷(没有名称的卷)

  • 命名卷(有名称的卷)永远不会自动删除,必须手动删除

    docker volume rm [卷名]
    docker volume prune  # 删除所有未使用的卷
    

六、Docker安全

1. 如何以非root用户运行Docker容器?

答案:

  1. 在Dockerfile中指定用户:

    RUN groupadd -r myuser && useradd -r -g myuser myuser
    USER myuser
    
  2. 运行容器时指定用户:

    docker run -u $(id -u):$(id -g) ...
    

安全原理:
容器中的root用户虽然被限制在容器内,但仍有潜在风险。使用非root用户可以遵循最小权限原则,减少安全风险。

2. 如何限制容器使用的资源?

答案:

docker run -it --cpus=".5" --memory="512m" --memory-swap="1g" --pids-limit=100 ...
  • --cpus:限制CPU使用量(这里是0.5个CPU核心)
  • --memory:限制内存使用量
  • --memory-swap:限制内存+交换分区总量
  • --pids-limit:限制容器内进程数量

原理说明:
Docker使用Linux的cgroups机制实现资源限制,可以防止单个容器耗尽主机资源。

七、Docker Compose

1. Docker Compose有什么用?

答案:
Docker Compose是一个定义和运行多容器Docker应用程序的工具,通过YAML文件配置应用服务,可以一键启动/停止整个应用栈。

典型使用场景:

  • 开发环境:快速启动依赖的所有服务(如Web服务器、数据库、缓存等)
  • 自动化测试:创建隔离的测试环境
  • 单主机部署:小型生产环境部署

原理大白话:
就像餐厅的套餐菜单(docker-compose.yml),不用一个个单点(单独启动容器),直接点套餐(docker-compose up)就能得到完整的一餐。

2. docker-compose.yml中的services和networks有什么区别?

答案:

  • services:定义要运行的容器(服务),每个服务对应一个容器
  • networks:定义自定义网络,services可以通过networks名称加入同一网络实现互通

示例:

version: '3'
services:
  web:
    image: nginx
    networks:
      - mynet
  db:
    image: postgres
    networks:
      - mynet

networks:
  mynet:
    driver: bridge

八、Docker生产实践

1. 如何监控Docker容器的运行状态?

答案:

  1. Docker内置命令

    docker stats  # 实时监控资源使用
    docker top [容器]  # 查看容器内进程
    
  2. 第三方工具

    • cAdvisor:Google开发的容器监控工具
    • Prometheus + Grafana:专业的监控解决方案
    • ELK Stack:日志收集和分析

原理说明:
Docker暴露了容器的运行指标(CPU、内存、网络IO等),这些工具通过Docker API或cgroups获取数据并可视化。

2. 如何实现Docker容器的高可用?

答案:

  1. 使用编排工具
    • Docker Swarm:Docker原生的集群管理工具
    • Kubernetes:更强大的容器编排系统
  2. 高可用策略
    • 多副本:一个服务运行多个容器实例
    • 健康检查:自动重启不健康的容器
    • 滚动更新:逐步更新容器,避免服务中断

原理大白话:
就像餐厅多雇几个厨师(多副本),如果有人生病(容器崩溃),其他人可以顶上,同时还有经理(编排工具)负责调度和监督。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值