容器是什么?
容器(Container) 是一种轻量化的 应用隔离技术 ,本质是通过 Linux 内核的 命名空间(Namespaces) 和 控制组(cgroups) 实现的进程级虚拟化。
容器将应用程序及其依赖(库、配置文件、环境变量等)打包在一个独立环境中运行,具有以下特点:
特性 | 说明 |
---|---|
轻量化 | 共享宿主机内核,无需虚拟化硬件,资源占用极低(秒级启动) |
隔离性 | 通过 Namespaces 隔离进程、网络、文件系统等资源 |
资源限制 | 通过 cgroups 限制 CPU、内存、磁盘 I/O 等资源使用 |
一致性 | 镜像(Image)保证开发、测试、生产环境一致 |
可移植性 | 容器镜像可在任意支持容器运行时的平台(Linux/Windows)执行 |
容器 vs 虚拟机(VM)
容器 | 虚拟机 | |
---|---|---|
虚拟化层级 | 进程级(共享宿主机内核) | 硬件级(通过 Hypervisor 虚拟化) |
启动速度 | 秒级 | 分钟级 |
资源占用 | 低(仅应用所需资源) | 高(需分配完整操作系统资源) |
隔离性 | 进程级隔离(较弱) | 完全隔离(更强) |
容器和 Pod 的关系
1. Pod 是什么?
Pod 是 Kubernetes 中的最小调度单元,由 一个或多个容器 组成,这些容器:
- 共享网络命名空间 :Pod 内所有容器使用相同的 IP 和端口范围,可通过
localhost
直接通信。 - 共享存储卷(Volume) :容器可访问同一组持久化存储(如共享配置文件、日志目录)。
- 生命周期一致:Pod 启动时,内部容器同时创建;Pod 终止时,容器同时销毁。
2. 为什么需要 Pod?
- 协作场景:若多个容器需紧密协作(如主应用 + 日志收集器、主服务 + Sidecar 代理),通过 Pod 统一管理更方便。
- 资源复用:共享网络和存储,避免重复配置。
- Kubernetes 调度基础:Kubernetes 直接管理 Pod 而非单个容器。
3. 容器与 Pod 的关系
-
层级关系:Pod 是容器的逻辑组合,一个 Pod 包含一个或多个容器。
-
共享与隔离:
- 共享:网络、存储卷、部分内核命名空间。
- 隔离:每个容器有独立的文件系统、进程空间(除非显式共享)。
示例场景
plaintext
复制
yaml
Pod: "web-server"
├── Container 1: Nginx(主服务,监听 80 端口)
└── Container 2: Filebeat(日志收集器,读取 Nginx 的日志文件)
- 两个容器共享 Pod 的 IP 和网络,Nginx 可通过
localhost:8080
访问同一 Pod 中的另一个服务。 - 它们通过共享存储卷(Volume)访问同一日志目录。
Podman 中的 Pod 管理
Podman 支持直接创建和管理 Pod(无需 Kubernetes),命令示例:
bash
复制
perl
# 创建一个 Pod(分配共享网络和存储)
podman pod create --name my-pod
# 向 Pod 中添加容器
podman run -d --pod my-pod nginx
podman run -d --pod my-pod filebeat
# 查看 Pod 状态
podman pod ls
总结
概念 | 容器 | Pod |
---|---|---|
定位 | 单个应用进程的隔离环境 | 一组容器的逻辑组合 |
共享资源 | 无(默认独立) | 网络、存储卷、部分命名空间 |
使用场景 | 运行单一服务 | 管理协作密切的多容器服务组 |
管理工具 | Docker、Podman、containerd 等 | Kubernetes、Podman |
核心关系:
- Pod 是容器的"逻辑外壳",用于管理协作型容器组。
- 容器是 Pod 的组成部分,负责实际运行业务逻辑。