容器概述
容器发展简史
互联网企业生产环境的应用部署经历了三个阶段:
1. 物理机部署时代
- 特点:
- 使用纯粹的物理机部署应用。
- 一台服务器上部署多个应用进程(如 DB、缓存进程等)。
- 问题:
- 进程间资源抢占,导致资源耗尽或磁盘满等问题。
- 资源隔离不足,单个进程异常可能影响其他进程。
2. 虚拟机部署时代
- 特点:
- 通过硬件虚拟化,每台虚拟机分配固定的 CPU、内存、磁盘资源。
- 每台虚拟机通常只部署一个应用。
- 优点:
- 解决了进程间资源隔离的问题。
- 缺点:
- 软件版本和配置文件容易碎片化,导致管理复杂。
3. 容器部署时代
- 特点:
- 使用容器技术(如 Docker),通过镜像文件实现应用部署。
- 所有容器共享相同的基础镜像,确保环境一致性。
- 优点:
- 解决了虚拟机部署中的软件版本碎片化问题。
- 容器销毁后,修改的内容不会保留,确保环境一致性。
虚拟机与容器
1. 名词解释
① 虚拟机
- 定义:通过软件模拟的具有完整硬件系统功能的计算机系统。
- 特点:
- 每个虚拟机有独立的操作系统和硬件资源。
- 启动慢,占用资源多。
- 代表技术:VMWare、OpenStack。
② 容器
- 定义:将操作系统层虚拟化,是一个标准的软件单元。
- 特点:
- 随处运行:打包代码、配置和依赖,确保环境一致性。
- 高资源利用率:进程级隔离,精细控制资源使用。
- 快速扩展:启动速度快,适合弹性伸缩。
2. 容器技术与虚拟机技术对比
Docker 基础概念
1. 仓库(Repository)
- 定义:用于存储和分发 Docker 镜像的地方。
- 类型:
- 公共仓库(如 Docker Hub)。
- 私有仓库(如 Harbor)。
2. 镜像(Image)
- 定义:一个只读的模板,包含运行容器所需的文件系统和配置。
- 特点:
- 分层存储,支持增量更新。
- 通过 Dockerfile 构建。
3. 容器(Container)
- 定义:镜像的运行实例,包含一个可写层。
- 特点:
- 独立运行,与其他容器隔离。
- 生命周期短暂,销毁后数据丢失(除非使用卷)。
Docker 架构
- 客户端-服务器架构:
- Docker 客户端:提供命令行工具,与用户交互。
- Docker 守护进程(Daemon):在宿主机后台运行,管理容器和镜像。
- 通信方式:
- 通过 Socket 或 RESTful API 进行通信。
Docker 容器卷
1. 卷的设计目的
- 数据持久化:确保数据在容器删除后仍然保留。
- 独立于容器生命周期:卷的生命周期与容器无关。
2. 卷的特性
- 数据共享:多个容器可以挂载同一个卷。
- 实时更新:对卷的修改会立即生效。
- 与镜像分离:卷中的数据不会被打包到镜像中。
3. 卷的使用场景
- 数据库存储。
- 日志存储。
- 配置文件共享。
- 数据备份。
4. 卷的类型
- 命名卷(Named Volume):
- 由 Docker 管理,具有唯一名称。
- 创建命令:
docker volume create my_volume
。
- 绑定挂载(Bind Mount):
- 将主机目录挂载到容器中。
- 挂载命令:
docker run -v /host/path:/path/in/container my_image
。
5. 卷的管理命令
- 创建卷:
docker volume create my_volume
。 - 查看卷列表:
docker volume ls
。 - 查看卷详情:
docker volume inspect my_volume
。 - 删除卷:
docker volume rm my_volume
。
Dockerfile 构建
1. 基础镜像
- FROM 指令:指定基础镜像,Docker 从该镜像开始构建。
2. 指令执行
- 顺序执行:Dockerfile 中的指令从上到下依次执行。
- 创建临时容器:每条指令在临时容器中执行。
- 提交新层:如果指令改变了文件系统,Docker 会提交这些更改为新的镜像层。
3. 缓存利用
- 加速构建:Docker 会重用缓存中的层,避免重复执行指令。
4. 构建完成
- 最终镜像:所有指令执行完毕后,生成最终的镜像。
- 清理中间层:构建过程中创建的中间容器和镜像层会被清理。
Docker 特性
1. 轻量级虚拟化
- 特点:启动速度快,资源占用小。
- 优势:适合快速启停的应用场景。
2. 标准化构建与部署
- 特点:使用 Dockerfile 定义应用环境,构建过程标准化。
- 优势:简化了应用打包和部署流程。
3. 环境隔离与一致性
- 特点:每个容器运行在独立的环境中,确保环境一致性。
- 优势:解决了“在我机器上能运行”的问题。
4. 高效的镜像管理
- 特点:镜像分层存储,支持版本管理。
- 优势:节省存储空间,便于分发和回滚。
5. 横向扩展与弹性伸缩
- 特点:容器启动速度快,适合横向扩展。
- 优势:适合应对流量峰谷的应用场景。
6. 轻量级 PaaS 环境
- 特点:可以快速构建轻量级、私密的 PaaS 环境。
- 优势:简化了 PaaS 环境的搭建和管理。
容器与 Linux 启动过程
1. 典型的 Linux 启动过程
- BootFS:包含 bootloader 和内核,启动后卸载。
- RootFS:包含操作系统的核心文件,挂载为只读后切换为读写。
2. Docker 容器的启动过程
- BootFS:通常共享宿主机的内核,BootFS 不常用。
- RootFS:由多个只读镜像层组成,容器层为可写。
- 容器层:所有对文件系统的修改都发生在这里。
3. Docker 容器与典型 Linux 启动过程的区别
特性 | 典型 Linux 启动过程 | Docker 容器启动过程 |
---|---|---|
BootFS | 包含 bootloader 和内核 | 通常共享宿主机的内核 |
RootFS | 挂载为只读后切换为读写 | 由多个只读镜像层组成 |
文件系统 | 完整的文件系统 | 联合文件系统 |
内核 | 使用自己的内核 | 通常共享宿主机的内核 |
隔离性 | 无隔离 | 通过命名空间和控制组实现隔离 |