1.Docker介绍
1 Docker 简介
Docker 官网: https://www.docker.com/
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个轻量级的、可移植的容器中。

环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题
Docker 的出现使得 Docker 得以打破过去「程序即应用」的观念。透过镜像 (images) 将除作业系统核心外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
2 Docker 整体结构介绍
2.1 Docker 引擎介绍(Docker Engine)
Docker 引擎是一个包含以下组件的客户端 - 服务端(C/S)应用程序,后端是一个松耦合架构,众多模块各司其职
- 服务端
一个长时间运行的守护进程(Docker Daemon) - REST API
一套用于与 Docker Daemon 通信并指示其执行操作的接口 - 客户端
命令行接口 CLI(Command Line Interface)

- CLI 利用 Docker 命令通过 REST API 直接操控 Docker Daemon 执行操作
- Docker Daemon 负责创建并管理 Docker 的对象(镜像、容器、网络、数据卷)
2.2 Dcoekr 结构概览图

2.3 Docker 组件

Docker CLI (命令行接口)
定义:Docker CLI 是用户与 Docker 交互的主要工具。它提供了一组命令,允许用户管理 Docker 镜像、容器、网络和存储等资源。
作用:用户通过 Docker CLI 发送命令,这些命令会被发送到 Docker 守护进程(Docker Daemon)进行处理。
示例命令:docker run, docker build, docker pull, docker push 等。
Docker Daemon (Docker 守护进程)
定义:Docker Host 是运行 Docker 守护进程(dockerd)的机器。守护进程 Docker Daemon 负责管理 Docker 对象,如容器、镜像、网络和卷等。
作用:Docker Daemon 接收来自 Docker CLI 的命令,并执行相应的操作。它还负责与 Docker Registry(仓库)进行通信,以拉取或推送镜像。
关系:Docker Daemon 是 Docker CLI 和 Docker 容器之间的桥梁。
容器 (Container)
定义:容器是 Docker 中的运行实例,它是基于镜像创建的。容器包含了应用程序及其所有依赖项,并且与宿主机及其他容器隔离。
作用:容器提供了一个轻量级的、可移植的运行环境,使得应用程序可以在任何支持 Docker 的环境中运行。
关系:容器是基于镜像创建的,并且由 Docker Daemon 管理。容器可以被启动、停止、删除和迁移。
镜像 (Image)
定义:镜像是用于创建容器的只读模板。它包含了运行应用程序所需的所有文件、库、配置和依赖项。
作用:镜像是容器的构建块,它定义了容器的行为和环境。镜像可以通过 Dockerfile 构建,也可以从 Docker 仓库中拉取。
关系:镜像是容器的蓝图,容器是镜像的运行实例。镜像可以被推送到 Docker 仓库,也可以从仓库中拉取。
仓库 (Registry)
定义:仓库是存储和分发 Docker 镜像的地方。Docker Hub 是最常用的公共仓库,但也可以使用私有仓库。
作用:仓库允许用户共享和分发镜像,使得团队成员可以轻松获取和使用相同的镜像。
关系:Docker Daemon 可以从仓库中拉取镜像,也可以将本地构建的镜像推送到仓库。Docker CLI 提供了 docker pull 和 docker push 命令来与仓库交互。
关系总结
- Docker CLI 是用户与 Docker 交互的接口,用户通过它发送命令。
- Docker Host 是运行 Docker 守护进程的机器,负责处理 Docker CLI 的命令并管理容器和镜像。
- 容器 是基于镜像创建的运行实例,由 Docker Host 管理。
- 镜像 是容器的只读模板,定义了容器的行为和环境。
- 仓库 是存储和分发镜像的地方,Docker Host 可以从仓库中拉取镜像,也可以将本地镜像推送到仓库。
通过这些组件的协作,Docker 提供了一个完整的容器化解决方案,使得应用程序的构建、分发和运行变得更加简单和高效。
3 Docker 底层技术介绍
3.1 容器技术介绍
容器是一种快速的打包技术
在做一个项目时,往往需要在本机单独搭建一个开发环境,而开发完成后我们要放到服务器上运行或者分享给其他人使用时,又需要在服务器或其他人的电脑上再配置一遍环境,又费时又费力,如果移植的机器操作系统不同那操作更加麻烦,那么是不是可以直接将程序和运行环境一起打包发布呢?
虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在 Windows10 系统里面运行 Linux 系统 CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。

缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。
容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
容器是在操作系统层面上实现虚拟化, 直接复用本地主机的操作系统, 而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比, 容器优势体现为启动速度快, 占用体积小。

虚拟机 VS 容器
由于容器是进程级别的,相比虚拟机有很多优势。
-
启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。 -
资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。 -
体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。 总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
Docker 和传统虚拟化方式的不同之处:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

为什么 Docker 会比 VM 虚拟机快
-
docker 有着比虚拟机更少的抽象层
由于 docker 不需要 Hypervisor(虚拟机) 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 docker 将会在效率上有明显优势。 -
docker 利用的是宿主机的内核,而不需要加载操作系统 OS 内核
当新建一个容器时,docker 不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程。当新建一个虚拟机时,虚拟机软件需要加载 OS,返回新建过程是分钟级别的。而 docker 由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个 docker 容器只需要几秒钟。


Docker 优势
一致的环境
开发与生产环境一致性:Docker 确保应用程序在开发、测试和生产环境中运行一致。无论在哪个环境中,应用程序的行为都是相同的,因为所有的依赖项和配置都打包在容器中。
避免“在我的机器上可以运行”的问题:由于环境一致性,开发者可以避免因环境差异导致的运行问题。
隔离性
资源隔离:每个 Docker 容器都是独立的,它们之间相互隔离,不会相互干扰。这意味着你可以运行多个容器,每个容器都可以有自己的依赖项和配置,而不会影响其他容器。
安全性:由于隔离性,容器内的应用程序不会直接访问宿主机的资源,从而提高了安全性。
可移植性
跨平台运行:Docker 容器可以在任何支持 Docker 的平台上运行,无论是 Linux、Windows 还是 macOS。这使得应用程序可以在不同的环境中轻松部署。
云平台支持:大多数云服务提供商都支持 Docker,使得应用程序可以轻松地在不同的云环境中迁移和扩展。
快速部署和扩展
快速启动:Docker 容器启动速度非常快,通常只需几秒钟。这使得开发者在开发和测试过程中可以快速启动和停止容器。
水平扩展:Docker 容器可以轻松地进行水平扩展,通过启动多个容器实例来处理更多的请求。
版本控制和依赖管理
版本控制:Docker 镜像可以进行版本控制,开发者可以轻松地回滚到之前的版本,或者在不同的版本之间切换。
依赖管理:Docker 镜像包含了应用程序的所有依赖项,确保在不同的环境中运行时不会缺少任何依赖。
资源效率
轻量级:Docker 容器比虚拟机更轻量级,因为它们共享宿主机的操作系统内核,而不是每个容器都运行一个完整的操作系统。
资源利用率高:由于轻量级和高效的资源管理,Docker 容器可以更高效地利用系统资源。
社区和生态系统
丰富的镜像库:Docker Hub 提供了大量的公共镜像,开发者可以直接使用这些镜像来快速构建应用程序。
强大的生态系统:Docker 有庞大的社区支持和丰富的工具链,如 Kubernetes、Docker Compose 等,可以帮助开发者更高效地管理和部署容器化应用。
简化开发流程
简化开发环境配置:开发者可以使用 Docker 来定义开发环境,确保所有团队成员使用相同的环境进行开发。
简化测试流程:测试人员可以使用 Docker 容器来运行测试,确保测试环境与生产环境一致。
应用程序部署方式
传统部署、虚拟化部署和容器部署是三种不同的应用程序部署方式,它们在资源利用、隔离性、可移植性和管理复杂性等方面有着显著的区别。以下是它们的详细比较:
传统部署 (Traditional Deployment)
特点:
- 直接在物理服务器上运行:应用程序直接安装在物理服务器上,使用服务器的操作系统及其资源。
- 资源共享有限:多个应用程序通常不能在同一台物理服务器上运行,因为它们可能会相互干扰。
- 环境依赖性强:应用程序对操作系统和服务器环境的依赖性强,环境差异可能导致应用程序无法正常运行。
- 扩展性差:扩展应用程序通常需要增加物理服务器,成本高且管理复杂。
优点:
- 简单直接:部署过程相对简单,不需要额外的虚拟化或容器化技术。
- 性能高:直接在物理硬件上运行,性能通常较高。
缺点:
- 资源利用率低:物理服务器的资源利用率通常较低,因为多个应用程序不能共享同一台服务器。
- 环境一致性差:开发、测试和生产环境可能存在差异,导致“在我的机器上可以运行”的问题。
- 扩展性差:扩展应用程序需要增加物理服务器,成本高且管理复杂。
虚拟化部署 (Virtualization Deployment)
特点:
- 在虚拟机上运行:应用程序运行在虚拟机(VM)中,每个虚拟机都有自己的操作系统(Guest OS)。
- 资源隔离:每个虚拟机相互隔离,不会相互干扰,提高了安全性。
- 资源共享:多个虚拟机可以运行在同一台物理服务器上,提高了资源利用率。
- 可移植性:虚拟机可以在不同的物理服务器之间迁移,提高了可移植性。
优点:
- 资源利用率高:多个虚拟机可以共享同一台物理服务器的资源,提高了资源利用率。
- 隔离性好:每个虚拟机相互隔离,提高了安全性。
- 可移植性好:虚拟机可以在不同的物理服务器之间迁移,提高了可移植性。
缺点:
- 性能开销:虚拟机需要运行完整的操作系统,性能开销较大。
- 启动时间长:虚拟机启动时间较长,通常需要几分钟。
- 管理复杂:虚拟机的管理和维护相对复杂,需要专门的虚拟化管理工具。
容器部署 (Container Deployment)
特点:
- 在容器中运行:应用程序运行在容器中,容器共享宿主机的操作系统内核。
- 轻量级:容器比虚拟机更轻量级,因为它们不需要运行完整的操作系统。
- 资源隔离:容器之间相互隔离,不会相互干扰,提高了安全性。
- 快速启动:容器启动速度非常快,通常只需几秒钟。
- 可移植性:容器可以在任何支持 Docker 的环境中运行,提高了可移植性。
优点:
- 轻量级:容器比虚拟机更轻量级,资源利用率高。
- 快速启动:容器启动速度非常快,通常只需几秒钟。
- 可移植性好:容器可以在任何支持 Docker 的环境中运行,提高了可移植性。
- 环境一致性好:开发、测试和生产环境一致,避免了“在我的机器上可以运行”的问题。
缺点:
- 隔离性相对较弱:虽然容器之间相互隔离,但隔离性不如虚拟机强。
- 依赖宿主机内核:容器依赖宿主机的操作系统内核,因此在不同操作系统上运行可能会有兼容性问题。
总结
| 特性 | 传统部署 | 虚拟化部署 | 容器部署 |
|---|---|---|---|
| 资源利用率 | 低 | 高 | 高 |
| 隔离性 | 差 | 好 | 较好 |
| 可移植性 | 差 | 好 | 好 |
| 启动时间 | 快 | 慢 | 快 |
| 性能开销 | 低 | 高 | 低 |
| 环境一致性 | 差 | 较好 | 好 |
| 扩展性 | 差 | 好 | 好 |
| 管理复杂性 | 低 | 高 | 中 |
通过以上比较可以看出,
容器部署在资源利用率、启动时间、可移植性和环境一致性等方面具有显著优势,但在隔离性和对宿主机内核的依赖性方面存在一定的局限性。
虚拟化部署则在隔离性和资源利用率方面表现较好,但性能开销和管理复杂性较高。
传统部署则相对简单直接,但在资源利用率和环境一致性方面存在明显不足。
Docker 运行的基本流程为
- 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
- Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver 将下载镜像以 Graph 的形式存储。
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境,
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成。
- Libcontainer 是一项独立的容器管理包,Network driverl 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作。


浙公网安备 33010602011771号