nginx和docker面试题

nginx面试题

1. Nginx 是什么?有什么特点?

nginx就是一个轻量级的http web服务器【直接对外提供静态资源(HTML/CSS/JS/ 图片)服务】、反向代理服务器【隐藏后端服务器】,可以做负载均衡【反向代理服务器所以可以请求分发】,支持高并发,因为异步非阻塞呗


2. Nginx 为什么高并发、高性能?

同步阻塞:就像一个服务员(进程 / 线程)服务一桌客人,必须等这桌点单、上菜、结账全部完成,才能去服务下一桌,效率极低;

异步非阻塞:Nginx 就像一个「大堂经理」(master 进程)+ 几个「全能服务员」(worker 进程),服务员接了客人的需求(比如请求一个文件),不用站在原地等厨房(磁盘 / 后端服务)出餐,而是先去服务其他客人,等厨房喊 "好了"(事件就绪),再回来处理这个需求。

答案:

  • 采用多进程 + 异步非阻塞事件驱动模型(epoll/kqueue)
  • 一个 master 进程管理多个 worker 进程
  • 每个 worker 单线程处理大量请求,不阻塞
  • 内存占用极低,连接复用好
  • 处理请求不创建新进程 / 线程,开销极小

3. 什么是反向代理?Nginx 如何实现?

反向代理的由来:

部署的时候,后端是打成jar包,请求太多的时候,一台服务器搞不定了,就需要让jar包放到两台甚至多台服务器上,但随之就会出现很多问题,每台服务器的ip是不同的用户咋可能记得这么多ip,为了能让用户的请求平均达到每一台服务器上,所以需要有一个反向代理的功能,就是不再去请求部署项目的主机,而是只固定请求一台主机(nginx),请求是打到nginx上,nginx能实现反向代理负载均衡,相当于一个请求转发器,把对应的请求发到不同的主机上(类似平均分配)

反向代理:用户直接给代理服务器发请求,它压根不知道后端服务器的ip

正向代理:用户知道后端服务器的ip,但不直接给他发请求,还是给代理服务器发,让代理服务器给后端服务器发

其实二者的核心区别只有一个:代理的对象不同

正向代理:代理客户端,客户端主动配置代理服务器,通过代理访问目标服务器,目标服务器无法得知真实客户端的 IP,隐藏了客户端,例如vpn,这里可以讲一下vpn的流程

  1. 客户端与VPN代理服务器建立链接 2.请求转发 3.目标服务器回传数据 4.客户端获取信息

反向代理:代理服务器端 ,客户端直接访问代理服务器,由代理服务器转发请求至后端真实服务器,客户端无法得知真实服务器的 IP,隐藏了服务器集群,Nginx 的核心应用就是反向代理。
简单总结:代理哪端,就隐藏哪端


4. Nginx 负载均衡有哪些策略?

答案:

  • 轮询:多个服务器,按照顺序去访问,这样的话,每个服务器都能获得相同的请求次数。
  • 随机:根据随机算法获取目标服务器地址,进行请求。
  • 一致性hash:根据客户端的ip进行哈希算法,得到指定的服务器
  • 最小连接数:将请求转发给连接数最少的目标服务器。

1、轮询(默认):如果目标服务器性能相同,一般使用轮询。 默认不修改即可

2、权重:如果目标服务器性能不同,一般使用权重。

复制代码
 upstream tomcat-nginx{ 
     # 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器 
     server 127.0.0.1:8080 weight=1; 
     server 127.0.0.1:8081 weight=2; 
     server 127.0.0.1:8082 weight=3; }

3、ip哈希 同一个客户端访问同一个目标服务器。 根据客户端的ip进行哈希算法,得到指定的服务器。 作用:会话保持。

复制代码
upstream tomcat-nginx{  
# 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器 
  ip_hash; server 127.0.0.1:8080 weight=1; 
  server 127.0.0.1:8081 weight=2; 
  server 127.0.0.1:8082 weight=3; } 

不推荐使用ip哈希,因为性能较低。使用token进行会话跟踪。

4、最少连接数:将请求转发给连接数最少的目标服务器。

复制代码
upstream tomcat-nginx{ 
  # 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器 
  least_conn; 
  server 127.0.0.1:8080 weight=1; 
  server 127.0.0.1:8081 weight=2; 
  server 127.0.0.1:8082 weight=3; } 

4、响应时间最少(第三方):统计目标服务器的处理请求的平均时长,谁的时间短给谁。

复制代码
 upstream tomcat-nginx{  
  # 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器 
  fair; 
  server 127.0.0.1:8080 weight=1; 
  server 127.0.0.1:8081 weight=2; 
  server 127.0.0.1:8082 weight=3;}

5. Nginx 常用优化配置

答案:

  • 调整 worker_processes:设为 CPU 核心数
  • worker_connections:增大最大连接数
  • 开启 keepalive 长连接
  • 开启 gzip 压缩
  • 设置 expires 缓存静态资源
  • 隐藏 Nginx 版本号
  • 限制请求速率、并发连接防攻击

6. Nginx 常用命令

答案:

  • 启动:nginx
  • 停止:nginx -s stop
  • 优雅停止:nginx -s quit
  • 重新加载配置:nginx -s reload
  • 测试配置:nginx -t
  • 查看版本:nginx -v

7. Nginx 和 Apache 区别

答案:

  • Nginx:异步非阻塞,高并发强,轻量,适合静态、反向代理
  • Apache:同步多进程,稳定,模块丰富,适合动态请求
  • 高并发场景:Nginx 远优于 Apache

8. Nginx 集群问题是什么?如何解决?

答案:

惊群:多个 worker 同时争抢同一个连接,造成资源浪费。

Nginx 解决方案:

  • 采用互斥锁(accept_mutex)
  • 同一时间只有一个 worker 去 accept 连接

Docker面试题

1. Docker 是什么?

答案:

Docker 是一个开源的应用容器引擎

可以将打包的应用及其所需要的依赖 形成一个轻量级、可移植的镜像 ,可以迁移到任意Linux操作系统,实现一次封装,到处运行


2. 容器 vs 虚拟机(必问)

答案:

  • 传统虚拟机是 虚拟化硬件(cpu,内存,硬盘),在虚拟硬件上安装完整的操作系统,然后再系统上安装软件,每个虚拟机都有独立内核

  • 容器是 虚拟化操作系统(软件呗),容器没有自己的内核,共享宿主机的内核 (容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了)

  • 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

3. Docker 三大核心概念

答案:

  1. 镜像(Image):只读模板,用来创建容器。
  2. 容器(Container):镜像的运行实例。
  3. 仓库(Repository):存放镜像的地方(Docker Hub、私有仓库)。

4. Docker 为什么快?

答案:

  • 容器共享宿主机内核,不需要启动完整 OS
  • 容器是进程级启动,秒级启动
  • 联合文件系统(UnionFS),分层存储,复用层

5. Docker 常用命令(必背)

答案:

plaintext

复制代码
# 搜索/拉取/查看/删除镜像
docker search
docker pull
docker images
docker rmi

# 容器操作
docker run        # 创建并启动
docker ps         # 查看运行中容器
docker ps -a      # 所有容器
docker start/stop/restart 容器ID
docker rm         # 删除容器
docker exec -it 容器ID /bin/bash  # 进入容器
docker logs 容器ID # 查看日志

6. docker run 常用参数

答案:

  • -d:后台运行
  • -p:端口映射 宿主机:容器
  • -P:随机端口
  • --name:指定容器名
  • -v:挂载目录
  • --restart=always:开机自启
  • -e:设置环境变量

7. Docker 数据卷(Volume)是什么?

答案:

数据卷是宿主机目录 / 文件,直接挂载到容器内部。

那说白了就是 持久化容器数据+容器与宿主机/容器 共享数据(都可以访问数据卷呗)

作用:

  • 数据卷将容器数据存储在宿主机上,容器删除、重建时,数据依然保留。(容器数据持久化)
  • 容器与宿主机共享数据
  • 多个容器共享数据:多个容器可以挂载同一个数据卷,实现数据共享(比如多个 Web 容器共享同一个静态资源目录)。

8. Docker 网络模式(看一眼)

答案:

四种常用网络模式:

  1. bridge:默认,独立网络,端口映射

当你运行一个容器而不指定 -network参数时,就是用的bridge

工作原理:docker在宿主机上默认创建一个名为docker0的虚拟网桥(网关),docker会给每个容器分配一个独立的IP(比如172.17.0.2,那虚拟网桥的ip就是172.17.0.1呗)

  • 容器间要通信,需要通过docker0这个虚拟网桥转发

  • 外部访问,必须使用-p 8080:8080做端口映射,把容器的端口映射到宿主机上(宿主机 IP + 映射端口

    2.host:与宿主机共享网络

  • 容器直接使用宿主机的IP地址,不在有自己独立的IP

  • 外部访问,不需要做端口映射。(容器监听的端口,比如8080,直接暴露在宿主机上,直接用宿主的ip呗 宿主机ip+容器端口)

3.none:无网络

4.container:与另一个容器共享网络

https://developer.aliyun.com/article/1688008 这个很重要


9. Dockerfile 是什么?

答案:

Dockerfile 是构建镜像的脚本文件,包含一条条指令。

通过 docker build 自动构建镜像。


10. Dockerfile 常用指令

答案:

plaintext

复制代码
FROM         # 基础镜像
MAINTAINER   # 作者
RUN          # 构建时执行命令
CMD          # 容器启动默认命令
ENTRYPOINT   # 固定启动命令
EXPOSE       # 暴露端口
ENV          # 环境变量
ADD/COPY     # 拷贝文件
VOLUME       # 数据卷
WORKDIR      # 工作目录

11. CMD vs ENTRYPOINT

答案:

  • CMD:可被命令行参数覆盖

  • ENTRYPOINT

    :不会被覆盖,一定会执行

    常配合使用:

    ENTRYPOINT + CMD

12.如何优化 Docker 镜像体积?

  1. 选择体积小的基础镜像;

  2. 合并 RUN 命令;

  3. 删除无用缓存;

  4. 使用 .dockerignore

  5. 使用多阶段构建。

13.镜像和容器的区别

镜像是静态的模板,用于创建容器。只能读

容器是镜像的运行实例,可读可写

工作目录

复制代码
------

## 11. CMD vs ENTRYPOINT

**答案:**

- **CMD**:可被命令行参数覆盖

- ENTRYPOINT

  :不会被覆盖,一定会执行

  

  常配合使用:

  ENTRYPOINT + CMD


## 12.如何优化 Docker 镜像体积?

1. 选择体积小的基础镜像;

2. 合并 RUN 命令;

3. 删除无用缓存;

4. 使用 `.dockerignore`;

5. 使用多阶段构建。

   

## 13.镜像和容器的区别

镜像是静态的模板,用于创建容器。只能读
容器是镜像的运行实例,可读可写  
多个容器可以共享同一个镜像。
相关推荐
木子欢儿1 小时前
从零到精通 Neovim:Ubuntu 下的终极开发利器指南
linux·运维·服务器·ubuntu
枕布响丸辣2 小时前
Nginx 核心功能全解析:正向代理 / 反向代理 / 缓存 / Rewrite 实战
运维·nginx·缓存
不做超级小白3 小时前
执行docker命令时自动启动Docker Desktop?一个小工具让开发体验更丝滑
windows·docker
222you3 小时前
Ubuntu当中的Docker安装和镜像管理
ubuntu·spring cloud·docker
coderwei1233 小时前
Ubantu服务器构建openclaw并接入飞书
运维·服务器
开开心心就好4 小时前
跨平台高速下载工具,支持浏览器功能强大
运维·服务器·windows·pdf·旅游·媒体·1024程序员节
心易行者4 小时前
别再说“在我的机器上能跑”了!Docker 入门指南,专治各种环境不服
运维·人工智能·docker·容器
zhim004 小时前
【保姆级教程】使用 Docker 部署 PostgreSQL + pgvector(含踩坑指南)
linux·docker
ZKNOW甄知科技5 小时前
深度对标ServiceNow:燕千云如何破解企业全球化运维难题?
大数据·运维·人工智能·科技·ai·自动化·运维开发