文章目录
- [01 容器技术概述](#01 容器技术概述)
-
- 一、容器技术发展
-
- [1. 应用上云的痛点](#1. 应用上云的痛点)
- [2. 传统 PaaS(Cloud Foundry)](#2. 传统 PaaS(Cloud Foundry))
- [3. Docker 的核心创新](#3. Docker 的核心创新)
- [4. 容器是什么](#4. 容器是什么)
- [二、容器 vs 虚拟机](#二、容器 vs 虚拟机)
- 三、容器编排与基金会
- [四、Docker 架构](#四、Docker 架构)
- 五、容器基础操作
-
- [1. 运行第一个容器](#1. 运行第一个容器)
- [2. docker run 常用选项](#2. docker run 常用选项)
- [3. 查看命令](#3. 查看命令)
- [4. 容器生命周期管理命令](#4. 容器生命周期管理命令)
- [5. stop / kill / pause 区别](#5. stop / kill / pause 区别)
- [6. 进入容器的两种方式](#6. 进入容器的两种方式)
- 六、其他常考点
- 七、速记口诀
01 容器技术概述
常考主线:容器解决什么问题 → 容器 vs 虚拟机 → OCI/Docker 架构 → 容器生命周期命令。
一、容器技术发展
1. 应用上云的痛点
| 上云方式 | 问题 |
|---|---|
| 重新部署(脚本/手工) | 本地与云端环境不一致;历史数据难处理 |
| 系统镜像迁移(P2V/V2V) | 镜像体积大、重;虚拟化有额外资源开销 |
2. 传统 PaaS(Cloud Foundry)
- 作用:解决大规模应用"上云",提供应用托管 + 打包分发机制。
- 已经用 Namespace + Cgroup 给每个应用做隔离沙盒(和 Docker 容器实现类似)。
- 痛点:打包困难------本地与云端环境不一致,要为每种语言/框架/版本分别打包适配,"一键部署很痛快,打包过程很痛苦"。
3. Docker 的核心创新
- Docker 镜像:把应用 + 完整运行依赖(整个操作系统的文件目录 rootfs)一起打包,格式统一。
- 效果:本地与云端环境高度一致,一次打包,到处运行(Build, Ship and Run),无需再修改配置。
- 2013 年 dotCloud 公司开源 Docker;Go 语言编写;遵循 Apache 2.0;分 CE 社区版 / EE 企业版。
4. 容器是什么
- 定义:容器是镜像(image)运行时的实例。
- 通俗理解:软件界的"集装箱"------隔离、封装、标准化运输,不关心里面装什么。
二、容器 vs 虚拟机
| 对比项 | 容器 Container | 虚拟机 VM |
|---|---|---|
| 启动速度 | 秒级甚至毫秒级 | 数秒~数十秒 |
| 系统内核 | 共享宿主机内核 | 各自独立内核(不共享) |
| 实现技术 | Linux 内核 Namespace/Cgroup | Hypervisor 虚拟化 |
| 隔离级别 | 进程级隔离 | 系统资源级隔离 |
| 资源消耗 | 本质只是宿主机上的一个普通进程,几乎无额外开销 | Hypervisor 层带来额外开销 |
| 资源调用 | 进程直接由宿主机 OS 管理 | 需经 Hypervisor 拦截处理 |
| 单机数量 | 1000+ 容器 | 一般不超过 100 台 VM |
| 镜像 | 分层镜像 | 非分层镜像 |
| 典型应用 | DevOps、微服务 | 硬件资源划分 |
记忆点:容器优势 = 快(启动)、少(开销)、多(密度);代价是隔离性不如虚拟机。
三、容器编排与基金会
- 编排引擎:Docker Swarm(原生 API)、Mesos(两层调度,管上万节点)、Kubernetes(Google 2014 发布,事实标准)。
- CNCF(Cloud Native Computing Foundation,2015 成立,隶属 Linux 基金会):明星项目 Kubernetes、Prometheus、Fluentd、CNI、gRPC。
- OCI (Open Container Initiative,2015):制定容器格式 + 运行时 runtime 的开放行业标准;Docker 把 Libcontainer 捐出改名为 runC 交给 OCI。
- runC:符合 OCI 规范的底层 runtime 工具,由 Libcontainer 演变而来;其他还有 LXC、rkt。
- 意义:把 runtime 和镜像格式从 Docker 项目中剥离出来。
四、Docker 架构
Docker Engine 是 Client/Server 程序,三部分:
| 组件 | 作用 |
|---|---|
| Docker Client(CLI) | 用户输入 docker 命令,通过 REST API 发请求 |
| Docker Daemon(守护进程) | 长期运行的服务器进程,接收并响应客户端 API 请求的就是它;负责创建管理镜像、容器、网络、卷 |
| REST API | Client 与 Daemon 之间的通信接口 |
其他对象:
- Image 镜像:运行环境的静态模板。
- Container 容器:镜像运行起来的隔离运行实例。
- Registry 仓库:存放镜像,可搭私有仓库。
常考:Docker 中响应用户 API 的组件 = Docker Daemon。
注意:Docker 不直接与内核交互,而是通过更底层的 runC/Libcontainer 与内核交互。
五、容器基础操作
1. 运行第一个容器
bash
docker run -d -p 8080:80 httpd
# -d 后台运行;-p 宿主机端口:容器端口 做端口映射
本地没有镜像会自动先 pull,再创建并启动容器,输出容器 full-id(64 位)。
2. docker run 常用选项
| 选项 | 作用 |
|---|---|
-d |
后台运行容器 |
-p 主机端口:容器端口 |
端口映射 |
-it |
交互式终端(-i 保持输入,-t 分配终端) |
-h |
指定容器 hostname |
--name |
指定容器名称 |
3. 查看命令
bash
docker images # 查看本地镜像
docker ps # 查看运行中的容器
docker ps -a # 查看所有状态容器(含已停止)
- CONTAINER ID 默认显示 full-id 的前 12 位(short-id)。
- NAMES:不指定
--name时 Docker 随机分配。
4. 容器生命周期管理命令
| 命令 | 作用 |
|---|---|
| docker create | 创建容器(不启动) |
| docker start | 启动容器 |
| docker run | 创建 + 启动(= create + start) |
| docker pause / unpause | 暂停 / 恢复容器(挂起进程,不释放) |
| docker restart | 重启容器 |
| docker stop | 优雅停止,发 SIGTERM 信号(超时再 SIGKILL) |
| docker kill | 强制杀死,发 SIGKILL 信号 |
| docker rm | 删除已终止的容器 |
容器四种状态:created、running(Up)、paused、exited。
5. stop / kill / pause 区别
| 命令 | 信号/动作 | 结果状态 |
|---|---|---|
| docker stop | 先发 SIGTERM,给时间优雅退出 | exited(可再 start) |
| docker kill | 直接发 SIGKILL,立即强杀 | exited |
| docker pause | 利用 cgroup freezer 挂起进程,进程还在 | paused(unpause 恢复) |
6. 进入容器的两种方式
| 方式 | 是否开新进程 | 特点 |
|---|---|---|
docker attach 容器 |
不启动新进程,直接接到容器主进程终端 | 多窗口 attach 会同步显示;主进程退出容器就停 |
docker exec -it 容器 bash |
打开新终端/新进程 | 调试首选,退出不影响容器运行 |
六、其他常考点
- exited 状态的容器:不再占 CPU/内存,但仍占用宿主机文件系统资源(可写层还在)。
- 一次性删除所有终止状态容器:
docker container prune(也可docker rm $(docker ps -aq))。 - 查看 docker 服务/引擎状态:
systemctl status docker、docker info。
七、速记口诀
- 镜像 = 模板(静态),容器 = 实例(运行)。
- 容器共享内核、进程级隔离;VM 独立内核、资源级隔离。
- OCI 定标准,runC 是实现;CNCF 管云原生,K8s 是编排核心。
- 响应 API 找 Daemon;run = create + start。
- stop 发 SIGTERM 温柔,kill 发 SIGKILL 强杀,pause 是冻结。
- attach 不开新进程,exec 开新进程(调试用 exec)。