1. 容器概述

什么是容器

容器(Container)是一种轻量级的虚拟化技术,他是一种轻量级、可移植、自包含的软件打包技术,用于将应用程序及其依赖环境打包成一个独立的、可移植的单元。容器通过共享宿主机的操作系统内核,实现了资源隔离和进程隔离,但比传统虚拟机更高效(无需模拟完整操作系统)。

一个容器(Container)通常是一个轻量级、可执行的独立软件包,它包含了运行某个应用程序所需的所有内容,包括:根文件系、网络、名字空间、运行时环境、系统工具、运行时库和配置等。

使用容器技术,开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

容器的概念和轮船的集装箱的设计和理念高度相似。

轮船运输

容器的特点如下:

  1. 标准化
    • 无论内部封装的是什么,外部体现都是一致的,有统一的接口。
  2. 隔离性:
    • 每个容器内部封闭且独立,容器之间互不干扰。
  3. 便携性:
    • 封装后的容器在不同的运行环境中无需重新配置。一次创建,处处运行。
  4. 效率
    • 容器共享主机操作系统内核,无需为每个应用启动完整的虚拟机,资源占用极低。
  5. 分层与复用
    • 镜像通过分层存储实现复用(如基础 Ubuntu 层 + 应用层),减少重复占用空间。

主流容器技术如下:

容器技术
所属公司
是否收费
效率特点
Docker
Docker Inc.
社区版免费,企业版收费
轻量级,启动快(秒级),资源占用低,镜像分层复用
Podman
Red Hat
开源免费
兼容 Docker CLI,无需守护进程,Rootless 模式更安全
LXC/LXD
Canonical (Ubuntu)
开源免费
接近虚拟机的隔离性,启动速度较慢(分钟级)
Kata Containers
OpenStack 基金会
开源免费
通过轻量级 VM 实现强隔离,性能损耗较高(约 10-20%)
gVisor
Google
开源免费
用户态内核拦截,安全性高,性能损耗显著(约 40-50%)
Firecracker
AWS
开源免费
微虚机(MicroVM)技术,启动快(毫秒级),内存开销极低
CRI-O
Red Hat
开源免费
专为 Kubernetes 优化,极简设计,性能与 containerd 相当
Windows Containers
Microsoft
免费(需 Windows 授权)
基于 Hyper-V 隔离,Windows 生态专用,资源占用较高

容器的原理

一个容器就是一个进程(可以由此进程创建多个子进程)的运行时环境,这些进程共享宿主机的操作系统内核,由操作系统统一调度管理。以后我们把容器内最先启动的进程叫 容器主进程

容器主进程 通常是容器管理进程的子进程,容器主进程 继承了父进程(容器管理进程)的权限,并且子进程的权限一定会小于父进程的权限。

容器管理进程通过操作系统内核对命名空间(Namespaces)、 控制组(Cgroups)、 联合文件系统(UnionFS)、网络等进行隔离,让容器主进程在自己独立的环境中运行,从而达到虚拟化的效果。

容器与虚拟机的架构设计

容器和虚拟机之间的主要区别在于虚拟化层的位置和操作系统资源的使用方式。 如下图所示:

虚拟机结构

容器结构

可见,虚拟机通过 Hypervisor 层有了自己的客户端操作系统 (Guest OS), 而容器是没有操作系统的,他是通过容器引擎(Docker Engine) 来共用主机操作系统(Host OS)。

容器与虚拟机参数对比

参数
容器(Docker)
对比
虚拟机
创建
启动应用
>
启动Guest OS+启动应用
部署
容器镜像
=
虚拟机镜像
密度
单节点 100~1000个
>
单节点 10~100个
更新管理
对增量内容进行分发,存储,节点启动
>
向虚拟机推送安装,升级应用软件补丁包
启动时间
秒级启动
>
分钟级启动
轻量级
镜像大小通常以M为单位
>
虚拟机以G为单位
性能
共享宿主机内核,系统级虚拟化,占用资源少,性能基本接近物理机
>
虚拟机需要 Hypervisor 层支持,具有完整的GuestOS,虚拟化开销大。
安全性
Docker具有宿主机 root 权限,有一定安全隐患
<
硬件隔离,相对安全
高可用性
通过业务本身的高可用性来保证
<
工具丰富:快照,克隆,HA,动态迁移,异地容灾,异地双活
使用要求
共享宿主机内核,不用考虑CPU是否支 持虚拟化技术
>
基于硬件的完全虚拟化,需要硬件 CPU 虚拟化技术支持

容器的优点

  1. 轻量高效:共享宿主机内核,无需虚拟化完整操作系统,资源占用少,启动速度快(秒级)
  2. 环境一致性:镜像打包应用及其依赖,确保开发、测试、生产环境一致,避免环境影响。
  3. 快速部署与扩展:支持自动化部署(CI/CD),结合编排工具(如:Kubernetes)可快速横向扩展。
  4. 资源隔离与限制:通过 Cgroups 限制 CPU、内存等资源,避免单个容器耗尽系统资源。
  5. 微服务友好:将业务拆分为独立容器,实现低耦合的微服务架构,便于开发和扩展。

容器的缺点

  1. 安全性较弱:共享内核,若内核漏洞被利用,可能导致容器逃逸(攻击宿主机)。
  2. 环境依赖:基于操作系统内核,Windows 下的镜像无法在 Linux 下运行。
  3. 存储与数据持久化复杂:默认容器内数据易丢失,需额外配置卷(Volume)或外部存储。
  4. 网络配置复杂:多容器通信需管理网络插件、端口映射等,跨主机网络更复杂。
  5. 不适合所有场景:对图形界面、高性能计算(HPC)或强隔离需求的应用支持较差。

本教程将以 Docker 为例对容器进行讲解。