当前位置: 首页 > news >正文

Java面试之Linux和docker

文章目录

  • Linux
    • 常用命令
  • docker
    • 基础概念
      • 什么是Docker?
      • Docker容器和虚拟机的区别是什么?
      • docker的好处
      • 什么是Docker镜像?
      • 如何创建Docker容器?
      • Docker Hub是什么?
    • 常用命令
      • 如何查看当前运行的Docker容器?
      • 如何停止和启动Docker容器?
      • 如何进入正在运行的Docker容器?
      • 如何删除Docker镜像和容器?
      • 如何查看Docker容器的日志?
    • 网络管理
      • Docker的默认网络模式有哪些?
      • **1. Bridge 模式(默认)**
      • **2. Host 模式**
      • **3. None 模式**
      • **4. Overlay 模式(集群模式)**
      • **5. Macvlan 模式**
    • 📊 快速选择指南
    • 🔧 实用命令备忘
      • 如何创建Docker网络?
    • 存储管理
      • 什么是Docker卷(Volume)?
      • 如何创建和使用Docker卷?
    • Docker基础与命令
      • 描述Dockerfile和其用途。
    • Docker网络
    • Docker存储
    • Docker Compose
    • Docker Swarm
    • 安全和维护
    • 高级话题
  • 线上日志是什么?

Linux

常用命令

(1)cd: 切换目录
(2)pwd:显示当前工作目录的绝对路径
(3)ls: 查看当前目录下的内容(ls只列出文件名/目录名)
(4)ll:查看当前目录下的所有详细信息(ll列出详细信息)
(5)touch:创建文件
(6)mkdir:创建目录
(7)cat:用于显示文件内容
(8)more:以分页的形式查看文件的内容
(9)less:分页查看文件命令(可以快速定位到最后一页)
①显示大文件

  • cat适合小文件或查看文件内容的情况,但对于大文件可能性能较差,因为它一次性加载整个文件。
  • more相对于cat来说,它支持逐页显示,但在处理大文件时,性能可能会受到影响。
  • less也支持分页,但less对于大文件有更好的性能,因为它只加载当前屏幕所需的数据,避免了一次性加载整个文件。

②滚动和搜索

  • cat只能通过终端滚动来查看文件内容,不支持交互式滚动和搜索。
  • more支持逐页滚动,但搜索功能相对简单,只能使用基本的正向搜索。
  • less支持更灵活的滚动,可以使用箭头键进行精确滚动,并且提供了强大的搜索功能,支持正向和反向搜索,以及搜索高亮显示。

③退出方式

  • cat没有交互式操作,退出方式只能通过终端控制。
  • more只能通过按q键退出。
  • less支持多种退出方式,如:q、:q!、:wq等,提供更多的灵活性。

(10)tail:查看文件最后几行
如:tail -10 // 查看最后10行
(11)cp:复制文件或目录
(12)mv:移动文件/改文件名
①语法:mv [选项] 源文件 目标文件
②移动文件:

mv/path/to/source/file/path/to/destination/file

③重命名文件:

mv/path/to/source/file/path/to/destination/new_file_name

(13)rm:删除文件或文件夹
(14)find:查找指定文件或目录
(15)vi/vim:编辑
(16)tar:解压、压缩
(17)ifconfig:用于查看和更改网络接口的地址和参数
(18)ping ip地址:用于检测与目标的连通性

docker

基础概念

什么是Docker?

答:Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,从而在任何Docker运行的环境中实现一致的运行。

Docker容器和虚拟机的区别是什么?

(1)虚拟机是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需的应用进程
(2)docker容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核也没有硬件虚拟。因此容器要比传统虚拟机更为轻便
(3)Docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

docker的好处

(1)解决了交付和环境一致性的痛点。
传统的“在我机器上能跑”问题,本质是环境异构。Docker 将应用和依赖打包成镜像,实现一次构建、到处运行,从开发到生产环境完全一致,这直接推动了持续集成和交付的普及。
(2)轻量级的虚拟化带来性能和成本优势。
容器本质上是宿主机上的一个普通进程,仅靠 Namespace 和 Cgroups 做隔离与限制,不需要启动完整的操作系统。这带来了:
①秒级甚至毫秒级的启动速度,非常适合弹性伸缩和流量洪峰场景。
②极高的资源利用率,一台物理机可以运行成百上千个容器。
③便捷的迁移能力,只要宿主机有 Docker 引擎,应用就能运行。
(Cgroups 是 Linux 内核提供的一种资源限制和隔离机制,全称是 Control Groups(控制组)。
简单说,它的核心任务就是回答一个问题:一个进程(或一组进程)能用多少系统资源?
如果 Namespace 解决的是“能看到什么”的隔离问题,那 Cgroups 解决的就是“能用多少”的限制问题)

(3)从技术层面支撑了微服务和高效运维。
分层存储和镜像技术,让应用的复用、扩展和回滚变得简单。配合 Dockerfile 可以用代码定义构建过程,用 Docker Compose 编排多服务,再结合隔离机制,既保证了环境干净、安全,也让维护管理非常高效。

什么是Docker镜像?

答:Docker镜像是一个轻量级、只读的模板,用于创建Docker容器。它包含运行容器所需的代码、库、环境变量和配置文件。

如何创建Docker容器?

答:可以使用docker run命令来从镜像创建容器。例如,docker run -d -p 80:80 nginx会基于nginx镜像启动一个新的容器,并将容器的80端口映射到宿主机的80端口。

Docker Hub是什么?

答:Docker Hub是一个公共的容器镜像仓库,可以用来存放、分享和管理Docker镜像。用户可以从Docker Hub下载公共镜像或上传自己的私有镜像。

常用命令

如何查看当前运行的Docker容器?

答:使用docker ps命令可以查看当前运行的容器。加上-a参数可以看到所有容器,包括未运行的。

如何停止和启动Docker容器?

答:使用docker stop <容器ID或名称>可以停止容器。使用docker start <容器ID或名称>可以启动容器。

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

答:可以使用docker exec -it <容器ID或名称> /bin/bash命令进入容器。这里-it表示交互式终端。

如何删除Docker镜像和容器?

答:使用docker rmi <镜像ID>删除镜像,使用docker rm <容器ID>删除容器。如果容器正在运行,首先需要停止容器。

如何查看Docker容器的日志?

答:使用docker logs <容器ID或名称>可以查看容器的日志输出。

网络管理

Docker的默认网络模式有哪些?

Docker 默认提供五种核心网络驱动模式,每种模式都有其特定的使用场景和网络特性。以下是详细的解析和对比:
当你安装 Docker 后,执行docker network ls可以看到三个默认创建的网络,它们分别对应了三种模式:

NETWORK ID NAME DRIVER SCOPE xxxxxxx bridge bridgelocalxxxxxxxhosthostlocalxxxxxxx none nulllocal# 此外还有两个重要模式:overlay 和 macvlan(默认不自动创建)

1. Bridge 模式(默认)

这是容器默认使用的网络模式。当你运行docker run而不指定网络时,容器就会连接到bridge网络。

  • 工作原理:Docker 在宿主机上创建一个名为docker0的虚拟网桥,并为每个容器分配一个veth pair(虚拟以太网对),一端在容器内(通常显示为eth0),另一端连接到docker0网桥。容器通过这个网桥进行通信,并可以通过宿主机的 IP 进行 NAT(网络地址转换)来访问外网。

  • 关键特性

    • 容器间通信同一个桥接网络内的容器可以通过容器名或 IP 直接通信(Docker 内置了 DNS 服务发现)。
    • 外部访问:容器默认拥有私有 IP(如172.17.0.2),如需从宿主机外部访问容器内服务,必须使用-p参数进行端口映射(如-p 8080:80)。
    • 网络隔离:不同的桥接网络(用户自定义的bridge)之间是隔离的。
  • 适用场景:单机环境下运行需要相互通信的多个容器(如 Web 应用 + 数据库),是最常用、最通用的模式。

  • 示例

    # 运行一个 Nginx 容器,使用默认的 bridge 网络dockerrun-d--nameweb-p80:80 nginx# 此时,外部可以通过 `宿主IP:80` 访问 Nginx,但容器位于独立的网段。

2. Host 模式

在这种模式下,容器共享宿主机的网络命名空间,直接使用宿主机的 IP 和端口。

  • 工作原理:容器不会获得独立的网络栈,也没有自己的 IP。它在网络层面看起来就像是宿主机上的一个普通进程。

  • 关键特性

    • 性能最佳:因为没有 NAT 和网桥开销,网络性能最高。
    • 无隔离容器直接绑定宿主机端口,容易造成端口冲突。
    • 无需端口映射:容器内监听 80 端口,宿主机 80 端口即被占用。
  • 适用场景:对网络性能有极致要求,且宿主机端口管理可控的单容器应用(例如网络性能测试工具、需要直接暴露大量端口的应用)。

  • 示例

    dockerrun-d--nameweb--networkhostnginx# Nginx 将直接使用宿主机的网络,在宿主机上 `netstat -tlnp` 可以看到进程。

3. None 模式

此模式下,容器拥有自己的独立网络命名空间,但 Docker 不会为其配置任何网络(没有网卡、IP、路由)

  • 工作原理:容器内部只有回环接口lo,完全与外部网络断开。

  • 关键特性

    • 绝对隔离:高度安全,但无法进行任何网络通信。
    • 自定义网络:用户需要手动进入容器为其配置网络,或使用第三方工具。
  • 适用场景

    1. 需要极致安全、完全不需网络功能的容器。
    2. 需要用户完全自定义复杂网络栈的特定场景。
  • 示例

    dockerrun-it--rm--networknone alpinesh# 进入容器后执行 `ip addr`,只能看到 `lo` 接口。

4. Overlay 模式(集群模式)

这是 Docker 为多主机(集群)容器通信设计的网络模式,是实现Swarm 或 Kubernetes 集群网络的基础。

  • 工作原理:它在多个 Docker 宿主机之上创建一个覆盖网络,通过 VXLAN 等隧道技术,使得不同主机上的容器可以像在同一个局域网内一样直接通信。创建和管理 Overlay 网络通常需要配合 Docker Swarm 或 Kubernetes 等编排工具。

  • 关键特性

    • 跨主机通信:解决不同物理机/虚拟机上的容器互联问题。
    • 服务发现:与 Docker Swarm 服务集成,提供内置的 DNS 轮询负载均衡。
    • 安全加密:可对网络流量进行自动加密。
  • 适用场景:Docker Swarm 集群、Kubernetes 集群中需要跨节点通信的服务。

  • 示例(需先初始化 Swarm):

    # 初始化 Swarm 集群dockerswarm init# 创建一个 Overlay 网络dockernetwork create-doverlay my-overlay-net# 在集群中创建服务并使用该网络dockerservicecreate--nameweb--networkmy-overlay-net nginx

5. Macvlan 模式

此模式允许你为容器分配一个物理网络的真实 MAC 地址,使其在网络上看起来就像一台独立的物理设备。

  • 工作原理:它通过在宿主机的物理网卡上创建子接口,并直接绑定到容器,使容器能直接连接到物理网络。

  • 关键特性

    • 直接暴露:容器 IP 直接位于物理网络 VLAN 中,无需 NAT 和端口映射。
    • 性能高:接近物理机的网络性能。
    • 需要网络支持:要求物理网络设备(如交换机、路由器)支持并配置相应的 VLAN 和 MAC 地址表。
  • 适用场景:需要容器获得与物理机同等网络地位的传统网络应用迁移、监控网络流量、或需要固定 IP 且能被外部网络直接寻址的场景(如将容器部署为网络设备)。

  • 示例

    # 假设宿主机物理网卡是 eth0,物理网络网段是 192.168.1.0/24dockernetwork create-dmacvlan\--subnet=192.168.1.0/24\--gateway=192.168.1.1\-oparent=eth0\my-macvlan-netdockerrun-d--namelegacy-app--networkmy-macvlan-net--ip=192.168.1.100 my-legacy-image# 容器 `legacy-app` 在网络中会像一台 IP 为 192.168.1.100 的独立主机。

📊 快速选择指南

网络模式关键词容器隔离性外部访问方式跨主机通信典型场景
Bridge默认、网桥、NAT网络隔离需端口映射 (-p)不支持单机多容器应用(Web + DB)
Host共享、高性能、无NAT无网络隔离直接访问宿主机IP(依赖宿主机)网络性能基准测试
None断网、自定义、安全完全隔离无法直接访问不支持安全沙箱、离线批处理
Overlay集群、跨主机、VXLAN网络隔离服务发现或Ingress原生支持Docker Swarm / K8s 集群服务
Macvlan物理网络、独立MAC、VLAN网络隔离像物理机一样直接访问(依赖物理网络)传统应用容器化、网络设备

🔧 实用命令备忘

# 列出所有网络dockernetworkls# 查看网络详细信息(包括连接的容器、子网等)dockernetwork inspect bridge# 创建自定义的桥接网络(推荐,优于默认bridge,支持DNS发现)dockernetwork create--driverbridge my_app_net# 运行容器时指定网络dockerrun-d--namemysql--networkmy_app_net mysql:8# 将正在运行的容器连接到网络dockernetwork connect my_app_net existing_container# 断开连接dockernetwork disconnect my_app_net existing_container# 清理未使用的网络dockernetwork prune

核心建议

  1. 单机开发/测试:优先使用自定义的bridge网络,它比默认bridge功能更完善(如容器名解析)。
  2. 生产集群:使用overlay网络配合 Swarm/K8s,或使用云服务商提供的 CNI 插件。
  3. 特殊需求:仅在明确需要时使用hostnonemacvlan模式。

如何创建Docker网络?

答:使用docker network create命令可以创建Docker网络。例如,docker network create --driver bridge my_bridge_network创建了一个bridge类型的网络。
Docker容器间通信是如何工作的?
答:容器可以通过Docker网络进行通信。在同一网络中的容器可以使用容器名称互相解析,实现容器间通信。

存储管理

什么是Docker卷(Volume)?

答:Docker卷是一种持久化存储数据的机制。它独立于容器的生命周期存在,可以用来存储容器的数据。

如何创建和使用Docker卷?

答:可以使用docker volume create命令创建卷。使用卷的一个常见场景是在docker run命令中通过-v选项将卷挂载到容器内部。

Docker基础与命令

描述Dockerfile和其用途。

答:Dockerfile是一个文本文件,包含了构建Docker镜像所需的一系列指令和命令。
Docker镜像和容器之间有什么区别?
答:Docker镜像是静态的定义,类似于类;而容器是镜像的实例,类似于对象。
怎样使用Dockerfile创建镜像?
答:使用docker build命令,如docker build -t myimage:latest .。
如何列出本地的Docker镜像?
答:使用docker images命令。
怎样检查Docker容器的资源使用情况?
答:使用docker stats命令。

Docker网络

Docker中如何实现容器间的网络隔离?
答:通过创建不同的Docker网络并将容器连接到这些网络,可以实现网络隔离。
解释Docker的网络模式中的bridge和host。
答:bridge是默认的网络模式,为容器提供了一个私有的内部网络。host模式使容器共享宿主机的网络栈。
Docker的–link选项是用来做什么的?
答:–link用于链接两个容器,使它们可以相互通信(已被弃用,推荐使用自定义网络)。

Docker存储

解释Docker的持久化存储。
答:Docker通过卷(Volumes)和绑定挂载(Bind Mounts)实现数据持久化。
什么是Docker卷的主要用途?
答:用于数据持久化和数据共享。
Docker卷和绑定挂载有什么区别?
答:卷由Docker管理,存储在Docker主机的指定区域;绑定挂载可以存储在主机系统的任意位置。

Docker Compose

什么是Docker Compose?
答:Docker Compose是一个工具,用于定义和运行多容器Docker应用程序。
如何启动使用Docker Compose定义的服务?
答:使用docker-compose up命令。
在Docker Compose文件中,links参数的作用是什么?
答:用于定义容器间的依赖和通信规则(在Docker网络普及后,这个选项的重要性下降)。
怎样在Docker Compose中设置环境变量?
答:可以在docker-compose.yml文件中使用environment键设置环境变量。

Docker Swarm

Docker Swarm是什么?
答:Docker Swarm是Docker的原生集群管理工具,用于在多个主机上部署和管理Docker容器。
如何创建一个Docker Swarm集群?
答:使用docker swarm init在主节点上初始化集群。
Docker Swarm中的服务(Service)和任务(Task)是什么?
答:服务定义了应用的状态,例如运行的副本数。任务是服务的一个实例,通常是一个容器。
如何扩展Docker Swarm中的服务?
答:使用docker service scale命令来增减服务的副本数量。
Docker Swarm和Kubernetes的主要区别是什么?
答:Kubernetes提供了更多的功能和灵活性,适用于更复杂的应用场景。Docker Swarm更简单,易于设置和管理。

安全和维护

如何保证Docker容器的安全性?
答:保持Docker和宿主机系统的更新,使用非root用户运行容器,限制容器的资源使用,使用Docker安全扫描等。
怎样更新Docker容器?
答:通常,需要停止旧容器,更新镜像,然后使用新镜像启动新容器。
Docker中的健康检查是如何工作的?
答:可以在Dockerfile中定义HEALTHCHECK指令或在docker-compose.yml中定义healthcheck来检查容器的健康状态。
Docker中的资源限制是如何实现的?
答:使用docker run命令的–memory(内存)、–cpus(CPU)等选项来限制资源。
如何清理未使用的Docker资源?
答:使用docker system prune命令可以清理悬挂的镜像、容器、网络和构建缓存。

高级话题

什么是Docker的多阶段构建?
答:多阶段构建是一种Dockerfile优化技术,允许在单个Dockerfile中使用多个构建阶段,减少最终镜像的大小。
解释Docker的存储驱动。
答:存储驱动负责管理容器的文件系统,Docker支持多种存储驱动,如overlay2、aufs、btrfs等。
Docker中的COPY和ADD命令有什么区别?
答:COPY仅用于复制本地文件,而ADD还可以解压缩文件和从URL下载文件。
Docker是如何实现容器隔离的?
答:Docker使用Linux的命名空间和控制组(cgroups)来实现容器的隔离。
解释Docker容器的重启策略。
答:Docker容器的重启策略决定了在退出时容器是否和如何重启。常用策略包括no、always、on-failure和unless-stopped。

线上日志是什么?

(1)ELK 与 EFK的介绍和对比
ELK 和 EFK 分别是两种开源日志管理和分析平台的缩写,它们均基于 Elasticsearch、Kibana 这两个核心组件,但在日志收集阶段采用了不同的工具。
(2)ELK 是指 Elasticsearch, Logstash, Kibana 三个开源项目的组合:
①Elasticsearch: 一个分布式、实时的搜索和分析引擎,用于存储和检索日志数据。它提供了全文搜索、聚合分析等功能,且支持横向扩展以处理大规模数据。
②Logstash: 一个强大的数据收集、转换和传输工具,负责接收日志数据,对其进行解析、过滤、丰富等处理,然后将处理后的数据发送到 Elasticsearch 中存储。Logstash 支持多种输入源(如文件、网络接口、数据库等)、丰富的过滤插件以及多种输出目标(包括 Elasticsearch)。
③Kibana: 一个可视化平台,用于对存储在 Elasticsearch 中的数据进行交互式探索、分析和可视化呈现。Kibana 提供了直观的仪表板、图表、地图等多种视图,使得用户可以轻松查询、分析日志数据,并创建自定义监控界面。
(3)EFK 是指 Elasticsearch, Filebeat or Fluentd, Kibana 的组合:
①Elasticsearch 和 Kibana 在 EFK 中的作用与 ELK 中相同,分别作为日志数据的存储和分析展示平台。
②Filebeat 或 Fluentd 替代了 ELK 中的 Logstash,作为轻量级的日志收集器:
a.Filebeat: 由 Elastic 公司开发,专为日志收集而设计,具有资源占用低、易于部署的特点。Filebeat 直接从服务器上的日志文件读取数据,对日志进行初步的归集和简单处理(如多行合并、添加元数据),然后将其转发到 Elasticsearch 或其他中间件(如 Logstash、Kafka)。
b.Fluentd: 一个统一的日志收集层,由 Fluentd 社区维护。Fluentd 可以从多种来源(如文件、标准输出、数据库等)收集日志,并通过插件机制提供丰富的数据解析、过滤和转换功能。处理后的日志数据被发送到指定的后端存储(如 Elasticsearch)或消息队列(如 Kafka)。
(4)ELK 与 EFK 的主要区别:
①日志收集阶段:ELK 使用 Logstash 作为集中式的日志处理器,它功能强大但相对资源消耗较高,适合复杂的数据清洗、转换场景。而 EFK 更倾向于采用 Filebeat 或 Fluentd,两者都是轻量级的日志收集代理,资源占用少,更适合大规模部署,尤其是在容器环境中。
②架构灵活性:EFK 提供了 Filebeat 和 Fluentd 两种选择,可以根据项目需求、现有环境和技术栈偏好来决定使用哪一个。Filebeat 更简洁易用,与 Elastic 生态深度集成;Fluentd 功能更全面,插件生态系统丰富,支持更多的数据源和输出目标。
③性能和资源优化:由于 Filebeat 和 Fluentd 相对于 Logstash 资源消耗更低,EFK 方案在大规模部署时可能带来更好的性能和更低的运维成本。尤其是对于容器化环境中的微服务架构,每个容器内部署一个轻量级的日志收集器更为高效。
(5)综上所述,ELK 和 EFK 主要的区别在于日志收集阶段所使用的工具,前者使用 Logstash,后者使用 Filebeat 或 Fluentd。选择 ELK 还是 EFK,通常取决于具体应用场景的需求、资源预算、现有技术栈以及对日志处理复杂度的要求。随着技术的发展,业界越来越多地倾向于采用 EFK 方案,特别是在容器云环境中,以适应现代分布式系统对日志管理的轻量化、高性能要求。同时,也有其他日志管理解决方案如 Grafana Loki 等可供考虑。

http://www.jsqmd.com/news/1242140/

相关文章:

  • TikTok广告投放多少钱?2026年最新投放成本与防关联指南
  • Instagram新功能倾向创作者,普通用户与创作者需求如何平衡?
  • [SPI]SPI接口简介
  • SARS-CoV-2病毒:从分子结构到全球大流行的全面解析
  • 嵌入式系统ROM代码执行与片上调试全解析:从启动到调试的底层实践
  • Cortex-M4系统控制与异常处理寄存器深度解析:从原理到实战
  • 绿幕发灰、边缘闪烁、头发丝丢失?Runway抠像失败的7个隐性参数陷阱,今天必须改!
  • 官宣,麒麟信安服务器操作系统V3.4-5正式发布
  • SATA控制器架构深度解析:从AHCI原理到嵌入式开发实践
  • PS5 NOR Modifier:终极方案解析,如何修复损坏的PS5 NOR闪存文件
  • 【AI副业口碑裂变公式】:3个被低估的传播杠杆,90%从业者从未用过
  • 大气湍流下的少模光纤耦合
  • HarmonyOS 6.1 实战:GridRow/GridCol 响应式栅格布局详解
  • 2026留学生找工作平台评测:靠谱平台推荐与选型攻略 - 极欧测评
  • torch.distributed的通信原语选择:all_reduce、all_gather与reduce_scatter
  • Orin 上开机自启跑检测docker容器(含完整脚本)
  • TMS320C6424 DSP外设实战:PWM、VLYNQ、GPIO与JTAG深度配置指南
  • 代码不是 AI 编程的最终资产,AI Coding 真正该存的是 Checkpoint
  • 深入解析C2000 SCI模块:中断、DMA与低功耗模式实战指南
  • 鸿蒙Flutter push与pop操作:页面跳转与返回基本操作
  • 浅谈 MySQL 主从复制,优点?原理?
  • HarmonyOS应用开发实战:萌宠日记 - 活动横幅卡片设计
  • html之flex伸缩盒子;grid布局
  • WinForm集成PDF功能的技术方案与优化实践
  • 闲置贵金属无锡出手,选择合扬鉴定专业有资质 - 好物测评局
  • OptiFDTD应用:光栅耦合器
  • 深入解析DM6441异构多核SoC:ARM与DSP协同设计与内存映射实战
  • 深入解析以太网MAC DMA配置:平衡吞吐量、延迟与CPU负载
  • 「干货盘点」IntelliJ IDEA离线开发使用要点(二)
  • HarmonyOS 6.1 实战:Scroll + Stack 联动实现商品页吸顶 Header