Docker 架构 - 镜像、容器
让我们来看看 Docker 背后的原理!
在上一课中,我们了解了Docker出现之前,整个行业所面临的问题。但Docker究竟是如何解决这些问题,并向世界推出革命性产品的呢?
要回答这个问题,让我们深入探究Docker的架构,理解它如何实现这些功能。
Docker创建者的定义
根据Docker官方文档的定义:“Docker能够将应用程序打包并运行在一个称为容器的松散隔离环境中。这种隔离和安全性使得你可以在同一台主机上同时运行多个容器。容器是轻量级的,因为它不需要虚拟机所需的额外开销,而是直接运行在主机操作系统的内核之上。这意味着,在相同的硬件配置下,你可以运行比使用虚拟机更多的容器。”
你现在可能还无法完全理解这个定义,因为“容器”这个概念对你来说仍然陌生。由于“容器”强大到足以解决行业中诸多问题,因此它必然是Docker的核心所在。
那么,让我们来揭开容器背后的秘密:什么是容器?又该如何创建一个容器?
镜像
在学习容器之前,我们需要先理解Docker中的“镜像”这一概念。从上方的图示可以看出,位于Docker守护进程之上的应用及库/二进制文件层被封装在容器中。本质上,应用程序与其所需的所有库和二进制文件被一起打包。但Docker是如何实现这种打包的呢?
Docker提供了一种机制,可以在Linux内核的基础上创建自定义镜像,其中包含你的应用程序及其依赖的库。镜像是容器的蓝图,而容器正是基于该镜像创建的。
为了简化理解,我们可以从面向对象编程的角度来看:
镜像是一个类,其中定义并声明了所有需求;容器则是该镜像的一个实例。这些镜像通常存储在云端,按需拉取。
容器
容器:容器是镜像的一个实例,它借助 Linux 内核提供的隔离能力模拟出所需的运行环境。从图中可以看到,应用B被封装在一个容器中。同样地,其他两个应用也可以分别放入各自的容器中。
你可能会问:既然容器共享操作系统内核,它是如何实现环境隔离并提供所需运行环境的?这正是通过镜像来实现的。
举个例子:如果你的应用只需要系统中的Python 3.5,那么在生产环境中你只需安装Python 3.5作为依赖项即可。其他所有内容都会成为不必要的开销。因此,Docker提供了一个基于Linux内核的模板,仅包含所需的依赖项,模板本身不安装任何额外内容。这个模板就被称为镜像。
因此,当你从Docker拉取一个Python 3.5的镜像并运行其一个实例时,你就可以像在主机上一样,通过命令行界面执行各种操作。如果在这个实例中犯了错误,你可以直接删除该容器,并从原有的镜像重新创建一个新的容器。这样,原始环境以镜像的形式保持完整,而你则可以安全地在容器中尝试不同的依赖组合。
在下一课中,我们将学习Docker如何通过其客户端-服务器架构来管理这一切。