基础可以参考我之前写的博客:
docker(从入门到精通)
1. Docker 和虚拟机的区别是什么?
💡 知识点解析:
这是 Docker 面试的必考题。核心区别在于"隔离的层次":
-
虚拟机 (VM): 像盖了一栋完全独立的新房子。它有自己的地基(虚拟硬件)、墙壁和房顶(完整的 Guest OS 操作系统)。所以它很重,启动慢。
-
Docker (容器): 像在现有的房子里打了个隔断。大家共用一个地基(宿主机 Linux 内核),只把家具(应用代码和依赖库)隔离开。所以它很轻,启动是毫秒级的。
🗣️ 面试参考回答:
"Docker 容器和虚拟机最大的区别在于架构 和资源利用率:
-
架构不同: 虚拟机是硬件级虚拟化 ,每个 VM 都要运行一个完整的操作系统(Guest OS),非常笨重;而 Docker 是操作系统级虚拟化 ,容器之间共享宿主机的内核,只隔离应用进程和依赖。
-
启动速度: Docker 启动是秒级甚至毫秒级的;而虚拟机启动需要分钟级。
-
体积: Docker 镜像通常只有几十 MB;而虚拟机镜像动辄几 GB。
-
性能: Docker 因为没有额外的操作系统开销,性能几乎接近原生;虚拟机则有额外的资源损耗。"
2. Docker 中的镜像是什么?
💡 知识点解析:
-
类比: 镜像(Image)就是"光盘"或者面向对象里的"类 (Class)"。
-
特性: 它是只读的。
-
分层: 像千层饼一样。底层是 OS,上面是 JDK,再上面是 Tomcat,最上面是你的代码。每改动一次就是加一层。
🗣️ 面试参考回答:
"镜像 (Image) 是一个只读的模板,它是创建容器的基础。
从技术角度看,镜像是分层存储 的。它包含了一个完整的操作系统环境 (如 root 文件系统),以及应用运行所需的所有依赖(库文件、配置文件、代码等)。
因为镜像是分层的,所以它具有复用性强、体积小 的特点。当我们启动容器时,实际上就是在镜像的顶部加了一层可写层。"
3. 运行 Docker 容器的命令是什么?
💡 知识点解析:
核心命令是 docker run。但面试官通常想看你知道多少参数。
-
后台运行:
-d -
端口映射:
-p -
起名字:
--name -
挂载数据:
-v
🗣️ 面试参考回答:
"启动容器最核心的命令是docker run。
常用的参数组合通常是:
docker run -d -p 宿主机端口:容器端口 --name 容器名 -v 宿主机目录:容器目录 镜像名
例如启动一个 Nginx:
docker run -d -p 80:80 --name my-nginx nginx
这表示后台运行 Nginx,将宿主机的 80 端口映射到容器的 80 端口。"
4. 说出几个 Dockerfile 的常见指令
💡 知识点解析:
Dockerfile 是造镜像的"说明书"。
你需要记住构建一个 Java 或 Python 应用最常用的那几个步骤:
-
选底座 (
FROM) -
设工作目录 (
WORKDIR) -
拷代码 (
COPY) -
装依赖/打包 (
RUN) -
启动 (
CMD/ENTRYPOINT)
🗣️ 面试参考回答:
"常见的 Dockerfile 指令包括:
FROM:指定基础镜像;RUN:在构建时执行命令(如安装软件);COPY/ADD:将本地文件复制到镜像中(ADD还支持自动解压和 URL 下载);WORKDIR:设置工作目录;CMD:容器启动时默认执行的命令(可被docker run覆盖);EXPOSE:声明容器运行时监听的端口(仅为文档作用,不实际发布端口);ENV:设置环境变量。
5. COPY 和 ADD 的区别,CMD 和 ENTRYPOINT(entrypoint) 的区别
💡 知识点解析:
这是细节题,很容易混淆。
-
COPY vs ADD: COPY 是老实人,只负责复制;ADD 是高级版,能解压
tar.gz,还能下网络文件(但不推荐用它下网络文件)。 -
CMD vs ENTRYPOINT:
-
CMD: 像是"备胎"。如果你
docker run后面加了命令,CMD 就失效了。 -
ENTRYPOINT: 像是"门神"。不管你 run 后面加什么,它都会执行。你加的东西会变成它的参数。
-
🗣️ 面试参考回答:
"这两组指令的区别如下:
COPY 和 ADD:
-
COPY: 功能简单,只能将本地文件复制到镜像中。推荐优先使用 COPY。
-
ADD: 功能更强大。除了复制本地文件,它还支持自动解压 (如 tar 包)和下载远程 URL 的文件。
CMD 和 ENTRYPOINT:
-
CMD: 指定容器启动时的默认 命令。如果
docker run后面指定了其他命令,CMD 会被覆盖。 -
ENTRYPOINT: 指定容器启动时一定 会执行的命令。如果
docker run后面指定了参数,这些参数会被追加到 ENTRYPOINT 后面,作为参数传入。"
6. Docker 中的数据卷是什么,有什么作用?
💡 知识点解析:
容器是"用完即扔"的。如果你把数据库装在容器里,容器一删,数据也没了。这很可怕。
数据卷 (Volume) 就是把宿主机的一个目录"穿透"进容器里。
-
持久化: 容器删了,文件还在宿主机硬盘上。
-
共享: 两个容器可以读同一个硬盘目录。
🗣️ 面试参考回答:
"数据卷 (Volume) 是 Docker 中用于实现数据持久化 和数据共享 的机制。它本质上是宿主机文件系统中的一个目录,被直接挂载到容器中。
它的主要作用有:
-
数据持久化: 容器删除后,数据卷中的数据不会丢失(例如 MySQL 的数据文件)。
-
数据共享: 可以在宿主机和容器之间,或者多个容器之间共享数据。
-
修改方便: 可以直接在宿主机修改配置文件,容器内立即生效,不需要进入容器内部。"
7. 请简要介绍 Docker 网络的几种模式
💡 知识点解析:
容器怎么上网?怎么互相访问?
-
Bridge (默认): 每个人都有自己的独立 IP,通过虚拟网桥(docker0)连接。
-
Host: 容器"裸奔",直接用宿主机的 IP 和端口。快,但是端口容易冲突。
-
None: 没网卡,只有 loopback。适合安全性极高的任务。
-
Container: 蹭网。蹭另一个容器的网卡,IP 一样。
🗣️ 面试参考回答:
"Docker 常见的网络模式有四种:
-
Bridge 模式(默认): 桥接模式。容器拥有独立的 Network Namespace(独立的 IP、端口),通过 docker0 网桥与宿主机通信。
-
Host 模式: 容器与宿主机共享网络栈。容器没有独立的 IP,直接使用宿主机的 IP 和端口。性能最好,但容易端口冲突。
-
None 模式: 容器有独立的网络空间,但没有任何网络配置(没有网卡、IP),完全隔离。
-
Container 模式: 一个容器共享另一个已存在容器的网络栈。它们俩看起来像是一个机器上的两个进程。"
8. 如何创建一个自定义的 Docker 网络?
💡 知识点解析:
为什么要自定义?因为默认的 Bridge 网络不能通过"名字"访问,只能通过 IP。自定义网络后,由于内置了 DNS,容器之间可以直接 ping 容器名。
命令:docker network create。
🗣️ 面试参考回答:
"创建命令是:docker network create 网络名称。
为什么要自定义?
因为 Docker 默认的 bridge 网络不支持通过容器名 (Container Name) 进行通信,只能用 IP,而 IP 是变动的。
创建自定义网络后,在这个网络内的容器可以通过容器名直接互相访问(Docker 自带了 DNS 解析),这在微服务架构中非常重要。"
9. 什么是 docker-compose?
💡 知识点解析:
-
问题: 如果我有 10 个微服务,我要敲 10 次
docker run吗?太累了,而且还得记谁先启动谁后启动。 -
解决: 写一个
docker-compose.yml文件,把 10 个服务的配置(镜像、端口、环境变量)都写进去。然后敲一个命令docker-compose up,全起来了。 -
定位: 单机编排工具。
🗣️ 面试参考回答:
"Docker Compose 是一个用于定义 和运行多容器 Docker 应用程序的工具。
它通过一个YAML 文件 (docker-compose.yml)来配置应用的所有服务(包括镜像、启动顺序、网络依赖、数据卷等)。
然后只需要执行一条命令docker-compose up,就可以一次性启动并管理整个应用集群。它非常适合在开发环境或单机环境下快速部署微服务项目。"