<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Docker_k8s%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86</id>
	<title>Docker k8s底层原理 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Docker_k8s%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Docker_k8s%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86&amp;action=history"/>
	<updated>2026-04-17T03:32:26Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=Docker_k8s%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86&amp;diff=314&amp;oldid=prev</id>
		<title>2024年10月8日 (二) 15:46 Evan</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Docker_k8s%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86&amp;diff=314&amp;oldid=prev"/>
		<updated>2024-10-08T15:46:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:devops]] &lt;br /&gt;
&lt;br /&gt;
=docker=&lt;br /&gt;
&lt;br /&gt;
Docker 底层原理基于容器技术，依赖于 Linux 操作系统的几项核心功能，如 Namespaces、Cgroups 和 UnionFS 等机制，来实现进程隔离、资源控制和高效的文件系统管理。&lt;br /&gt;
&lt;br /&gt;
1. Namespace (命名空间)&lt;br /&gt;
&lt;br /&gt;
Namespace 是 Docker 实现资源隔离的基础技术。Linux 内核通过命名空间将容器内的资源与主机隔离。每个容器都有自己的独立命名空间，从而达到进程、网络、文件系统等资源的隔离。&lt;br /&gt;
&lt;br /&gt;
    PID Namespace：隔离进程 ID，使得容器中的进程看不到其他容器或主机上的进程。&lt;br /&gt;
    Network Namespace：每个容器拥有自己独立的网络接口、路由表、IP 地址。&lt;br /&gt;
    Mount Namespace：提供文件系统的隔离，每个容器有自己独立的文件系统视图。&lt;br /&gt;
    UTS Namespace：允许容器内的进程独立修改主机名和域名。&lt;br /&gt;
    IPC Namespace：隔离进程间的通信，确保容器间的消息队列、信号量等是独立的。&lt;br /&gt;
    User Namespace：使容器内的用户和主机上的用户权限可以不同步，提供安全性。&lt;br /&gt;
&lt;br /&gt;
2. Cgroups (控制组)&lt;br /&gt;
&lt;br /&gt;
Cgroups 用于控制容器的资源使用，主要包括 CPU、内存、网络带宽、IO 等。Docker 使用 Cgroups 来限制、统计和隔离每个容器的资源使用。&lt;br /&gt;
&lt;br /&gt;
    资源限制：通过 Cgroups，Docker 可以为每个容器设定 CPU、内存等资源上限，防止某个容器过度消耗资源。&lt;br /&gt;
    资源监控：Cgroups 能实时监控容器的资源使用，帮助优化性能和进行故障诊断。&lt;br /&gt;
&lt;br /&gt;
3. UnionFS (联合文件系统)&lt;br /&gt;
&lt;br /&gt;
UnionFS 是一种分层的文件系统技术，Docker 利用它来高效地构建和管理镜像。Docker 镜像由多个只读层组成，不同的镜像层共享基础层，这减少了存储空间的占用。&lt;br /&gt;
&lt;br /&gt;
    写时复制（Copy-on-Write）：容器的可写层在启动时叠加到只读镜像层上，只有当容器需要修改数据时，才会对数据进行写时复制。&lt;br /&gt;
    镜像分层：Docker 镜像是分层的，基础镜像可以被多个容器共享，从而提高了镜像的构建和分发效率。&lt;br /&gt;
&lt;br /&gt;
4. 容器网络&lt;br /&gt;
&lt;br /&gt;
Docker 提供了多种网络模式，通过虚拟网络技术为容器提供灵活的网络配置。&lt;br /&gt;
&lt;br /&gt;
    桥接网络（Bridge Network）：Docker 默认使用桥接网络，将容器连接到虚拟桥接设备上，容器之间可以通过 IP 直接通信。&lt;br /&gt;
    Host 网络：容器与主机共享同一个网络堆栈，使用主机的 IP 地址和端口。&lt;br /&gt;
    Overlay 网络：用于跨多个主机的容器通信，特别适用于 Docker Swarm 或 Kubernetes 环境。&lt;br /&gt;
&lt;br /&gt;
5. 存储机制&lt;br /&gt;
&lt;br /&gt;
Docker 使用多种存储机制来管理容器中的数据。容器内的文件系统是临时的，容器删除后会丢失，Docker 通过持久化存储解决这个问题。&lt;br /&gt;
&lt;br /&gt;
    Volumes（卷）：Docker 推荐的持久化存储方式，可以将数据存储在主机上，并在多个容器间共享。&lt;br /&gt;
    Bind mounts：将主机文件系统中的目录挂载到容器中，容器可以直接访问主机上的文件。&lt;br /&gt;
    tmpfs mounts：数据只存储在内存中，适合临时数据。&lt;br /&gt;
&lt;br /&gt;
6. 容器运行时（Container Runtime）&lt;br /&gt;
&lt;br /&gt;
Docker 的容器运行时负责创建和管理容器，Docker 默认使用 runc 作为容器运行时。runc 是基于 Open Container Initiative (OCI) 标准的运行时工具，能够启动符合标准的容器。&lt;br /&gt;
&lt;br /&gt;
    Containerd：它是 Docker 的底层容器管理服务，负责容器的生命周期管理（创建、启动、停止等），同时与 runc 协同工作执行容器的具体操作。&lt;br /&gt;
&lt;br /&gt;
7. Docker Daemon 和 REST API&lt;br /&gt;
&lt;br /&gt;
Docker 的核心组件是 Docker Daemon，它是运行在后台的进程，负责处理容器的生命周期管理。Docker Daemon 通过 REST API 提供外部接口，开发者可以通过 API 或 Docker CLI 与 Daemon 进行交互。&lt;br /&gt;
&lt;br /&gt;
总结&lt;br /&gt;
&lt;br /&gt;
Docker 通过命名空间 (Namespaces) 实现资源的隔离，使用 Cgroups 管理资源分配与限制，通过 UnionFS 高效管理镜像层次，结合强大的网络模型和存储机制，形成了一个轻量、高效的容器化平台。Docker 的底层技术结合了 Linux 内核的众多强大功能，为现代云计算和微服务架构提供了基础支持。&lt;br /&gt;
************************&lt;br /&gt;
docker 底层原理有深入理解&lt;br /&gt;
ChatGPT 说：&lt;br /&gt;
ChatGPT&lt;br /&gt;
&lt;br /&gt;
在深入理解 Docker 的底层原理时，需要特别关注容器的隔离、资源管理和存储机制等关键技术。让我更详细地解释这些核心技术。&lt;br /&gt;
1. 容器与虚拟机的区别&lt;br /&gt;
&lt;br /&gt;
Docker 容器和传统虚拟机最大的区别在于它们的隔离方式：&lt;br /&gt;
&lt;br /&gt;
    虚拟机: 每个虚拟机都拥有完整的操作系统实例，包括虚拟化的硬件层（如 CPU、内存、磁盘等），其资源开销较大。&lt;br /&gt;
    容器: 容器共享主机的操作系统内核，并使用操作系统级别的隔离技术来实现轻量化的虚拟化。这大幅减少了容器的资源占用，使其启动和销毁更加迅速。&lt;br /&gt;
&lt;br /&gt;
2. Docker 主要使用的三大技术：Namespace、Cgroups 和 UnionFS&lt;br /&gt;
2.1 Namespace (命名空间)&lt;br /&gt;
&lt;br /&gt;
Namespace 是 Linux 内核提供的一种隔离机制，Docker 使用它来隔离容器与主机以及容器之间的资源：&lt;br /&gt;
&lt;br /&gt;
    PID Namespace：每个容器有自己独立的进程树。容器内的进程无法看到或影响其他容器中的进程。&lt;br /&gt;
    Mount Namespace：提供文件系统的隔离，确保每个容器只能访问分配给它的文件系统。&lt;br /&gt;
    Network Namespace：每个容器都有独立的网络堆栈，包括 IP 地址、路由表等，这使得容器的网络通信可以独立进行。&lt;br /&gt;
    UTS (Unix Time Sharing) Namespace：容器拥有独立的主机名和域名。&lt;br /&gt;
    IPC Namespace：隔离进程间的通信，确保不同容器的进程无法共享消息队列、信号量等。&lt;br /&gt;
    User Namespace：允许容器中的用户和宿主机的用户 ID 进行映射，使得容器中的 root 用户权限受到限制。&lt;br /&gt;
2.2 Cgroups (控制组)&lt;br /&gt;
&lt;br /&gt;
Cgroups 提供了资源管理的功能，Docker 使用它来限制和监控容器使用的 CPU、内存、网络带宽等资源：&lt;br /&gt;
&lt;br /&gt;
    资源限制：通过 Cgroups，Docker 可以为每个容器设定 CPU 核心数、内存上限等参数，确保容器不会消耗过多资源。&lt;br /&gt;
    资源优先级：Docker 允许设置容器之间的资源优先级（例如不同的 CPU 权重），从而实现资源的合理分配。&lt;br /&gt;
    资源统计：Cgroups 能够实时监控容器的资源使用情况，如 CPU 使用时间、内存使用量等，便于运维人员优化和排查问题。&lt;br /&gt;
&lt;br /&gt;
2.3 UnionFS (联合文件系统)&lt;br /&gt;
&lt;br /&gt;
Docker 镜像采用分层存储结构，使用 UnionFS 这种分层文件系统技术来管理镜像。常见的实现包括 AUFS、OverlayFS 和 Btrfs。&lt;br /&gt;
&lt;br /&gt;
    分层镜像：Docker 镜像由多个只读层组成，每一层通常代表一次文件系统的变更。例如，基础镜像可以是一个最小化的 Linux 操作系统，上面逐层叠加应用依赖和应用程序。&lt;br /&gt;
    写时复制（Copy-on-Write）：当容器对文件系统进行写操作时，文件的写入是在容器的可写层上完成的，而基础层保持不变。这样，多个容器可以共享基础层数据，节省磁盘空间并加快启动速度。&lt;br /&gt;
&lt;br /&gt;
3. Docker 网络&lt;br /&gt;
&lt;br /&gt;
Docker 提供多种网络模型，支持灵活的容器网络配置：&lt;br /&gt;
&lt;br /&gt;
    Bridge 网络：默认情况下，Docker 会创建一个 bridge（网桥）网络，所有容器都连接到这个网络上。它通过 NAT 来实现容器与外部网络的通信。&lt;br /&gt;
    Host 网络：容器与主机共享网络堆栈，这种模式下，容器直接使用宿主机的网络接口，减少了网络虚拟化的开销。&lt;br /&gt;
    Overlay 网络：用于跨多个主机的容器通信，尤其是在 Swarm 和 Kubernetes 环境下，通过 Overlay 网络可以将不同主机上的容器连接在一起。&lt;br /&gt;
&lt;br /&gt;
4. Docker 存储&lt;br /&gt;
容器的存储是临时的，默认情况下，容器关闭或删除后其文件系统中的数据会丢失。为了实现持久化存储，Docker 提供了几种机制：&lt;br /&gt;
&lt;br /&gt;
    Volumes（卷）：这是 Docker 推荐的持久化存储方式，卷可以存在于主机文件系统之外，多个容器可以共享同一个卷。&lt;br /&gt;
    Bind mounts：将主机的文件或目录直接挂载到容器中，允许容器访问主机的文件系统。这在开发环境中非常有用。&lt;br /&gt;
    tmpfs mounts：将数据存储在内存中，而不是磁盘，适合临时性的数据需求，例如缓存数据。&lt;br /&gt;
&lt;br /&gt;
5. Docker Daemon 和 REST API&lt;br /&gt;
&lt;br /&gt;
Docker Daemon 是 Docker 的核心，它是一个后台进程，负责处理 Docker 容器的管理任务。Docker Daemon 与容器运行时（如 runc）通信，并通过以下几部分协同工作：&lt;br /&gt;
&lt;br /&gt;
    Docker CLI：命令行工具，与 Docker Daemon 通信来执行容器操作。&lt;br /&gt;
    Docker API：Docker Daemon 通过 REST API 提供外部接口，开发者可以使用它编写程序来自动化容器管理。&lt;br /&gt;
&lt;br /&gt;
6. 容器运行时（Container Runtime）&lt;br /&gt;
&lt;br /&gt;
Docker 使用的默认容器运行时是 runc，它是一个轻量级的运行时，用于创建和运行容器。runc 基于 OCI（Open Container Initiative）的规范，确保容器的标准化和兼容性。此外，容器运行时抽象层（Containerd）也是 Docker 生态系统中的一个重要组件，它负责管理容器生命周期&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
总结来说，Docker 依赖于 Linux 内核的多种特性，如 Namespace 提供隔离，Cgroups 管理资源，UnionFS 实现高效存储管理，同时通过 Daemon 和 REST API 进行容器生命周期管理和自动化操作。Docker 的设计思想基于轻量级虚拟化，使得容器成为开发和部署现代应用的核心技术之一。&lt;br /&gt;
=k8s 底层原理有深入理解=&lt;br /&gt;
Kubernetes (K8s) 是用于自动化部署、扩展和管理容器化应用的分布式系统。其底层原理涉及多个核心组件，协调工作以提供高可用性、可扩展性和弹性。以下是对 Kubernetes 底层原理的深入理解：&lt;br /&gt;
&lt;br /&gt;
1. 架构概述&lt;br /&gt;
&lt;br /&gt;
Kubernetes 是一个主从架构（Master-Worker）系统，主节点（Master）负责集群的全局控制和管理，工作节点（Worker）则负责运行容器化的应用程序。Kubernetes 的核心组件包括：&lt;br /&gt;
&lt;br /&gt;
    Master 节点：负责协调整个集群，包括 API Server、Scheduler 和 Controller Manager。&lt;br /&gt;
    Worker 节点：运行应用容器，包括 Kubelet、Kube-proxy 和容器运行时。&lt;br /&gt;
&lt;br /&gt;
1.1 Master 节点组件&lt;br /&gt;
&lt;br /&gt;
    API Server：API Server 是 Kubernetes 的核心入口，提供 REST API 接口供用户和集群内部组件通信。所有的集群管理请求都会首先进入 API Server，它负责处理验证和请求路由。&lt;br /&gt;
    Etcd：Kubernetes 使用 Etcd 作为其一致性存储，存储所有的集群状态数据。它是一个分布式键值存储，保证数据的强一致性、高可用性。&lt;br /&gt;
    Scheduler：调度器负责将新创建的 Pod 分配到集群中的工作节点。调度器会根据预设的策略、资源需求、节点健康状态等条件，决定最适合运行 Pod 的节点。&lt;br /&gt;
    Controller Manager：运行各种控制器（如副本控制器、节点控制器等），负责监控集群的状态，并确保实际状态符合期望状态。例如，如果某个 Pod 意外崩溃，控制器会确保其重新调度。&lt;br /&gt;
&lt;br /&gt;
1.2 Worker 节点组件&lt;br /&gt;
&lt;br /&gt;
    Kubelet：Kubelet 是运行在每个工作节点上的代理，负责与 Master 节点的 API Server 通信，并执行分配到该节点的 Pod。Kubelet 会根据 Pod 定义启动相应的容器，并周期性监控容器的健康状况。&lt;br /&gt;
    Kube-proxy：负责在每个节点上维护网络规则，确保 Pod 和服务之间的通信。它处理节点之间的网络流量和服务的负载均衡。&lt;br /&gt;
    容器运行时：负责实际启动和管理容器。Kubernetes 支持多种容器运行时，如 Docker、containerd、CRI-O 等&lt;br /&gt;
2. 核心概念和原理&lt;br /&gt;
2.1 Pod&lt;br /&gt;
&lt;br /&gt;
Pod 是 Kubernetes 中最小的部署单位，通常包含一个或多个紧密相关的容器。这些容器共享同一个网络命名空间、存储卷和生命周期。每个 Pod 都有一个唯一的 IP 地址，用于和其他 Pod 进行通信。&lt;br /&gt;
2.2 Service (服务)&lt;br /&gt;
&lt;br /&gt;
Service 是 Kubernetes 中的抽象，用于将一组 Pod 组织为一个逻辑服务，提供统一的访问入口。即使背后的 Pod 动态变化，Service 的 IP 和端口保持不变，从而实现了负载均衡和服务发现。&lt;br /&gt;
&lt;br /&gt;
    ClusterIP：默认服务类型，提供集群内部的负载均衡。&lt;br /&gt;
    NodePort：允许通过每个节点的指定端口从外部访问服务。&lt;br /&gt;
    LoadBalancer：集成云提供商的负载均衡器，直接暴露服务到外部。&lt;br /&gt;
&lt;br /&gt;
2.3 Volume (存储)&lt;br /&gt;
&lt;br /&gt;
Pod 中的容器通常是无状态的，但 Kubernetes 提供了持久化存储支持。Kubernetes 支持多种存储后端，如本地磁盘、NFS、云存储（如 AWS EBS、GCE Persistent Disks）等。通过 Persistent Volume (PV) 和 Persistent Volume Claim (PVC)，用户可以声明和请求持久化存储。&lt;br /&gt;
2.4 Deployment (部署)&lt;br /&gt;
&lt;br /&gt;
Deployment 是一种声明式的方式来定义应用程序的期望状态。它允许自动更新应用程序，并支持滚动升级和回滚。通过 Deployment，用户可以定义多个副本的 Pod 并确保在集群中高效运行。&lt;br /&gt;
2.5 Namespace (命名空间)&lt;br /&gt;
&lt;br /&gt;
Kubernetes 使用命名空间来实现资源的逻辑隔离。不同的团队或项目可以在同一个集群中使用不同的命名空间，从而实现资源的分离。&lt;br /&gt;
3. Kubernetes 调度与资源管理&lt;br /&gt;
3.1 调度策略&lt;br /&gt;
&lt;br /&gt;
Kubernetes 的调度器负责根据资源请求（CPU、内存等）、节点资源利用率、亲和性、反亲和性规则等，将 Pod 安排到合适的节点上。调度器的目标是最大化资源利用率，并确保服务的高可用性。&lt;br /&gt;
&lt;br /&gt;
    资源请求和限制：在定义 Pod 时，用户可以指定容器的资源请求（request）和资源限制（limit）。Kubernetes 会根据这些资源要求来调度容器。&lt;br /&gt;
    亲和性/反亲和性：调度时，Kubernetes 支持 Pod 之间的亲和性和反亲和性规则。例如，可以让某些 Pod 优先调度在同一个节点上，或者确保它们分布在不同的节点上。&lt;br /&gt;
&lt;br /&gt;
3.2 资源管理&lt;br /&gt;
&lt;br /&gt;
Kubernetes 提供了多种资源管理功能，包括水平自动扩展、垂直自动扩展和自愈机制。&lt;br /&gt;
&lt;br /&gt;
    水平扩展 (Horizontal Pod Autoscaler, HPA)：根据 CPU 使用率或自定义指标，自动调整 Pod 副本数。&lt;br /&gt;
    垂直扩展 (Vertical Pod Autoscaler, VPA)：自动调整 Pod 所请求的 CPU 和内存资源。&lt;br /&gt;
    自愈机制：Kubernetes 会自动重新调度失败的 Pod，确保应用程序的高可用性。&lt;br /&gt;
&lt;br /&gt;
4. 网络模型与服务发现&lt;br /&gt;
&lt;br /&gt;
Kubernetes 使用了一个扁平的网络模型，要求集群中的每个 Pod 都能够直接与其他 Pod 通信。常见的网络插件有 Calico、Flannel、Weave 等，它们为 Kubernetes 提供了网络连接和路由功能。&lt;br /&gt;
4.1 DNS 服务&lt;br /&gt;
&lt;br /&gt;
Kubernetes 内置了 DNS 服务，用于为集群中的每个 Service 和 Pod 提供 DNS 解析。通过 DNS，Pod 可以直接使用服务的名称而不是 IP 地址进行通信，从而简化了服务发现和连接。&lt;br /&gt;
4.2 网络插件 (CNI)&lt;br /&gt;
&lt;br /&gt;
Kubernetes 使用 Container Network Interface (CNI) 来集成不同的网络插件，提供灵活的网络管理能力。每个插件可以处理网络隔离、IP 地址分配、路由、负载均衡等任务。&lt;br /&gt;
&lt;br /&gt;
5. 安全机制&lt;br /&gt;
&lt;br /&gt;
Kubernetes 通过多种机制保障集群的安全性，包括 RBAC（基于角色的访问控制）、命名空间隔离、网络策略、加密通信等。&lt;br /&gt;
&lt;br /&gt;
    RBAC (Role-Based Access Control)：通过定义角色和权限来限制用户对集群资源的访问。&lt;br /&gt;
    网络策略：允许用户定义 Pod 之间的通信规则，限制不必要的网络连接，提升安全性。&lt;br /&gt;
&lt;br /&gt;
6. 扩展与自定义&lt;br /&gt;
&lt;br /&gt;
Kubernetes 提供了一系列自定义与扩展能力，使得用户能够根据需求扩展其功能。&lt;br /&gt;
&lt;br /&gt;
    Custom Resource Definitions (CRD)：允许用户定义自己的 API 资源。&lt;br /&gt;
    Operator：一种 Kubernetes 中的自定义控制器，用于自动化管理复杂的应用程序生命周期。&lt;br /&gt;
&lt;br /&gt;
总结&lt;br /&gt;
&lt;br /&gt;
Kubernetes 的底层原理依赖分布式系统设计，核心通过 API Server 协调，etcd 存储状态，Scheduler 调度 Pod，Controller Manager 维持集群期望状态与实际状态一致。它利用命名空间和服务来实现应用的隔离与高可用性，并通过调度、扩展、资源管理等功能实现应用的自动化管理。&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>