Docker1️⃣引入
容器:一套互相隔离的进程集合,具有独立运行环境和资源。
1、引入
部署微服务应用时,存在依赖兼容、环境差异等问题。
1.1、依赖兼容
微服务应用组件非常多,且各个应用的依赖关系复杂,甚至会互相冲突。
-
传统方式
- 开发者打包应用程序(如 war 包),将 war 包发送给测试人员。
- 测试人员需要根据应用程序,安装相应的(应用)函数库、依赖并进行配置。
- 同理,运维人员也需要进行相同的重复操作,且容易出错。
-
Docker
- 开发者将应用程序及函数库、依赖、配置一起打包,作为一个镜像。
- 测试人员、运维人员只需启动镜像,无需安装函数库、依赖等。
- Docker 会在镜像启动时形成隔离环境,避免互相干扰。
1.2、环境差异
以上解决了多个应用的依赖兼容问题
还有一个问题:开发、测试、生产环境存在差异。
1.2.1、OS 结构
Linux 发行版 = Linux 内核 + 系统应用
-
计算机硬件:如 CPU、内存、磁盘等。
-
内核:对外提供内核指令,与计算机硬件交互。
-
系统应用:提供函数库,其中封装了内核指令。
1.2.2、兼容问题
以 MySQL 应用为例,模拟开发和测试环境不同的情景。
-
传统
- 开发者(Ubuntu 系统)打包 MySQL 镜像,发送给测试人员(CentOS 系统)。
- 测试人员启动 MySQL 镜像时,MySQL 会尝试调用 Ubuntu 函数库,但匹配不到对应的函数(报错)。
-
Docker:将系统函数库一同打包到镜像中,可迁移到任意 Linux 系统上运行。
【注意区分:应用函数库(如 Java 类库),系统函数库(操作系统相关)】
2、Docker
- Docker 是一个开源容器化技术,用于构建和容器化应用程序(对进程进行封装隔离并自动部署)
- 诞生于2013 年初,基于 GoLang 实现,dotCloud 公司出品(后改名为 Docker Inc)
- 自 17.03 版本起,分为社区版(Docker CE),企业版(Docker EE)。
- Docker 实现了镜像、容器等机制。
- ...
2.1、常见概念
2.1.1、镜像和容器
镜像(Image) | 容器(Container) | |
---|---|---|
定义 | 应用程序及其所需依赖、函数库、配置等文件打包在一起形成的文件包 | Docker 将镜像中的应用程序、函数等加载到内存中运行所形成的进程。Docker 会给容器进程做隔离,对外不可见 |
组成 | 应用程序 + 依赖 + 函数库 + 配置 (包括应用函数库、部分系统函数库) |
运行的镜像 + 隔离 |
特点 | 只读 | 沙箱机制 |
- 镜像可以迁移到任何 Linux 操作系统上运行。
- 通过一行命令完成容器启动、移除,方便快捷,性能开销极低。
- 一个镜像可以启动多次,形成多个容器进程。 (可理解为 Java 类与对象的关系)
2.1.2、仓库
-
Repository:可看作一个代码控制中心,用来保存镜像。
-
Docker Registry:开发者会将自己的镜像打包并发布到 Docker Registry,包含多个仓库。
2.2、Docker 架构
C/S 架构
-
服务端(server):Docker 守护进程(
dockerd
)负责处理 Docker 指令,管理镜像、容器等。 -
客户端(client):通过(本地)命令或(远程)RestAPI,向 Docker 服务端发送指令。
2.3、与虚拟机的区别
虚拟机 | Docker | |
---|---|---|
说明 | 在操作系统(物理机)中模拟硬件设备,运行另一个操作系统(虚拟机) | 仅封装函数库,没有模拟完整的操作系统 |
本质 | 操作系统中的操作系统 | 操作系统中的系统进程 |
性能 | 较差 | 接近原生 |
硬盘占用 | GB 级别 | MB 级别 |
启动 | 分钟级 | 秒级 |
图示 |