Docker面试题分类整理
文章目录
一、Docker基础概念
1. 什么是Docker?它和虚拟机有什么区别?
答案:
Docker是一个开源的容器化平台,可以让你把应用程序和它需要的所有东西(代码、运行时、系统工具、系统库等)打包成一个轻量级的、可移植的容器。
与虚拟机的区别:
- 虚拟机:每个虚拟机都包含完整的操作系统,运行在虚拟硬件上,通过Hypervisor与物理硬件交互。启动慢、占用资源多。
- Docker容器:共享主机操作系统内核,只包含应用和依赖,没有完整的操作系统。启动快、占用资源少、更轻量级。
原理大白话:
想象你要搬家:
- 虚拟机就像把整个房子(操作系统)都搬走,包括地基(内核)、墙壁(系统库)、家具(应用)。
- Docker就像只打包你的家具(应用)和必要的装饰品(依赖),搬到新房子(主机)后直接用新房子已有的地基和墙壁。
2. Docker的三个核心概念是什么?
答案:
- 镜像(Image):只读模板,包含创建容器所需的所有文件和配置。相当于安装光盘。
- 容器(Container):镜像的运行实例,包含运行中的应用程序及其运行环境。相当于安装好的系统。
- 仓库(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有哪几种网络模式?
答案:
- bridge(桥接模式):默认模式,容器通过docker0虚拟网桥通信
- host(主机模式):容器直接使用主机网络,没有隔离
- none(无网络):容器没有网络接口
- container(容器模式):共享另一个容器的网络栈
- 自定义网络:用户自定义的网络驱动
原理大白话:
- bridge模式:就像小区里的住户(容器)通过小区大门(docker0)与外界通信
- host模式:就像直接住在大街上,没有小区围墙
- none模式:就像住在封闭的房间里,没有门窗
- container模式:就像你和邻居共用同一个电话号码
2. 如何让两个Docker容器互相通信?
答案:
-
通过IP地址:不推荐,因为IP可能变化
-
通过容器名称:需要创建自定义网络
docker network create mynet docker run --net=mynet --name=container1 ... docker run --net=mynet --name=container2 ...然后container1可以直接ping container2
-
通过–link(已废弃):不推荐使用
原理说明:
Docker内置了DNS服务,在自定义网络中可以通过容器名称解析IP。自定义网络还提供了更好的隔离性和额外的功能(如网络别名)。
五、Docker存储
1. Docker的数据持久化有哪几种方式?
答案:
-
数据卷(Volume):由Docker管理的主机文件系统的一部分,最佳实践
docker volume create myvol docker run -v myvol:/path/in/container ... -
绑定挂载(Bind Mount):直接挂载主机上的任意目录或文件
docker run -v /host/path:/container/path ... -
tmpfs挂载:仅存储在内存中,不持久化
原理大白话:
- 数据卷就像专门为Docker准备的U盘
- 绑定挂载就像直接把主机硬盘上的文件夹共享给容器
- tmpfs就像写在黑板上的临时笔记,关机就消失
2. 容器删除后,数据卷会怎样?
答案:
-
默认情况下,删除容器不会自动删除其关联的数据卷
-
使用
docker rm -v删除容器时会同时删除匿名卷(没有名称的卷) -
命名卷(有名称的卷)永远不会自动删除,必须手动删除
docker volume rm [卷名] docker volume prune # 删除所有未使用的卷
六、Docker安全
1. 如何以非root用户运行Docker容器?
答案:
-
在Dockerfile中指定用户:
RUN groupadd -r myuser && useradd -r -g myuser myuser USER myuser -
运行容器时指定用户:
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容器的运行状态?
答案:
-
Docker内置命令:
docker stats # 实时监控资源使用 docker top [容器] # 查看容器内进程 -
第三方工具:
- cAdvisor:Google开发的容器监控工具
- Prometheus + Grafana:专业的监控解决方案
- ELK Stack:日志收集和分析
原理说明:
Docker暴露了容器的运行指标(CPU、内存、网络IO等),这些工具通过Docker API或cgroups获取数据并可视化。
2. 如何实现Docker容器的高可用?
答案:
- 使用编排工具:
- Docker Swarm:Docker原生的集群管理工具
- Kubernetes:更强大的容器编排系统
- 高可用策略:
- 多副本:一个服务运行多个容器实例
- 健康检查:自动重启不健康的容器
- 滚动更新:逐步更新容器,避免服务中断
原理大白话:
就像餐厅多雇几个厨师(多副本),如果有人生病(容器崩溃),其他人可以顶上,同时还有经理(编排工具)负责调度和监督。
Docker面试题分类及详细解答

592

被折叠的 条评论
为什么被折叠?



