目录
[1 容器技术概述](#1 容器技术概述)
[2 容器与虚拟机的区别](#2 容器与虚拟机的区别)
[3 Docker容器的核心组成](#3 Docker容器的核心组成)
[4 容器生命周期管理](#4 容器生命周期管理)
[5 容器核心技术详解](#5 容器核心技术详解)
[5.1 命名空间(Namespaces)](#5.1 命名空间(Namespaces))
[5.2 控制组(cgroups)](#5.2 控制组(cgroups))
[5.3 联合文件系统(UnionFS)](#5.3 联合文件系统(UnionFS))
[6 容器网络模型](#6 容器网络模型)
[7 容器数据管理](#7 容器数据管理)
[7.1 数据卷(Volume)](#7.1 数据卷(Volume))
[7.2 绑定挂载(Bind Mount)](#7.2 绑定挂载(Bind Mount))
[7.3 临时文件系统(tmpfs)](#7.3 临时文件系统(tmpfs))
[8 Docker容器操作实践](#8 Docker容器操作实践)
[8.1 容器基本操作](#8.1 容器基本操作)
[8.2 容器交互操作](#8.2 容器交互操作)
[8.3 容器资源限制](#8.3 容器资源限制)
[9 总结](#9 总结)
1 容器技术概述
容器(Container)是Docker技术的核心概念之一,它是一种轻量级、可移植的软件打包技术,将应用程序及其所有依赖项(包括库、环境变量和配置文件)打包到一个标准化的单元中。
容器与虚拟机不同,它不需要包含完整的操作系统,而是共享主机系统的内核,这使得容器更加轻量和高效。
容器技术的出现解决了软件开发中著名的"在我机器上能运行"的问题,通过提供一致的运行环境,确保了应用程序在开发、测试和生产环境中的一致性。
2 容器与虚拟机的区别

传统虚拟机架构:
- 在物理服务器上安装主机操作系统
- 在主机OS上安装Hypervisor(虚拟机监控程序)
- 每个虚拟机运行完整的Guest OS
- 应用程序运行在Guest OS中
容器架构:- 在物理服务器上安装主机操作系统
- 在主机OS上安装Docker引擎
- 容器直接共享主机OS内核
- 应用程序运行在隔离的容器环境中
关键区别:- 资源占用:虚拟机需要为每个实例分配完整的OS资源,而容器共享主机OS内核,资源占用更少
- 启动速度:虚拟机启动需要启动整个OS,而容器几乎是即时启动
- 性能:容器几乎没有性能开销,而虚拟机有Hypervisor的额外开销
- 隔离性:虚拟机提供更强的隔离性,容器通过命名空间和cgroups实现轻量级隔离
3 Docker容器的核心组成
一个Docker容器由以下几个核心部分组成:
- 镜像(Image):容器的静态模板,包含运行应用所需的所有文件和配置
- 容器运行时(Container Runtime):负责容器的创建、运行和管理
- 命名空间(Namespaces):提供隔离的视图,包括PID、网络、用户等
- 控制组(cgroups):限制和监控资源使用
- 联合文件系统(UnionFS):实现镜像的分层和容器的可写层
4 容器生命周期管理
- Docker容器的生命周期包括以下几个关键阶段:
- 创建(Created):使用docker create命令创建一个容器,此时容器文件系统已准备就绪,但尚未运行
- 运行(Running):使用docker start启动容器,容器内的主进程开始执行
- 暂停(Paused):使用docker pause暂停容器,此时容器进程被冻结,但保留在内存中
- 停止(Stopped):使用docker stop停止容器,容器内的主进程被终止,但容器配置保留
- 删除(Deleted):使用docker rm删除容器,释放所有资源
5 容器核心技术详解
5.1 命名空间(Namespaces)
命名空间是Linux内核提供的隔离机制,Docker利用以下命名空间实现容器隔离:
- PID命名空间:隔离进程ID,每个容器有自己的PID 1进程
- 网络命名空间:每个容器有独立的网络栈、接口和IP地址
- 挂载命名空间:容器有独立的文件系统挂载点
- UTS命名空间:隔离主机名和域名
- IPC命名空间:隔离进程间通信资源
- 用户命名空间:隔离用户和组ID
5.2 控制组(cgroups)
控制组是Linux内核功能,用于限制、记录和隔离进程组的资源使用:
- 资源限制:限制内存、CPU、磁盘I/O等资源使用
- 优先级控制:为不同进程组分配不同的资源使用优先级
- 资源统计:监控系统资源使用情况
- 进程控制:冻结、恢复进程组
5.3 联合文件系统(UnionFS)
联合文件系统是实现Docker镜像分层和容器可写层的基础技术:
- 分层存储:镜像由多个只读层组成,容器添加一个可写层
- 写时复制(Copy-on-Write):修改文件时,先复制到可写层再修改
- 高效存储:多个容器可以共享基础镜像层,节省存储空间
6 容器网络模型
- Docker提供了多种网络模式,满足不同场景需求:
- 桥接模式(bridge):默认模式,容器通过docker0网桥通信
- 主机模式(host):容器直接使用主机网络栈
- 无网络(none):容器没有网络接口
- 容器模式(container):共享另一个容器的网络命名空间
- 覆盖网络(overlay):用于多主机通信的Swarm模式
7 容器数据管理
容器文件系统是临时的,为了持久化数据,Docker提供了多种数据管理方式:
7.1 数据卷(Volume)

- Docker管理的持久化数据存储
- 独立于容器生命周期
- 可以通过docker volume命令管理
7.2 绑定挂载(Bind Mount)

- 将主机任意目录挂载到容器
- 主机和容器共享同一文件系统位置
- 适合开发环境共享代码
7.3 临时文件系统(tmpfs)

- 数据只存储在内存中
- 容器停止后数据丢失
- 适合敏感临时数据
8 Docker容器操作实践
8.1 容器基本操作
# 运行容器
docker run -d --name my_container nginx:latest
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop my_container
# 启动已停止的容器
docker start my_container
# 删除容器
docker rm my_container
8.2 容器交互操作
# 以交互模式运行容器
docker run -it my_container /bin/bash
# 在运行中的容器中执行命令
docker exec -it my_container /bin/bash
# 查看容器日志
docker logs my_container
# 查看容器详细信息
docker inspect my_container
8.3 容器资源限制
# 限制内存使用为512MB
docker run -d --name mem_limited --memory=512m nginx
# 限制CPU使用(相对权重)
docker run -d --name cpu_limited --cpu-shares=512 nginx
# 限制CPU核心数
docker run -d --name cpu_core --cpus=1.5 nginx
9 总结
Docker容器作为现代应用交付和部署的标准,通过轻量级的隔离机制和标准化的打包方式,彻底改变了软件开发和运维的方式。理解容器的核心概念、生命周期和技术原理,对于有效使用Docker至关重要。