了解最常用的开发技术之一背后的基础组件和系统的基础
Image source: Docker Logos and Photos
如果您最近来到了一个美好的容器世界,或者您已经来过一段时间,那么了解可以协同工作以提供Docker巨大好处的基础系统和元素可能不是一个坏主意。
首先是第一件事。 具有基本术语的明确知识从未伤害任何人。 镜像和容器似乎是等效的术语-它们不是同一回事吗? 我的意思是,我都使用它们将我的应用程序投放到某些服务器,PaaS或其他任何服务器上。
可以根据软件开发将容器描述为镜像实例。 该语句有一些含义:
· 可以从同一镜像中生成无限数量的容器。
· 镜像内部的资源将出现在其所有生成的容器中。 哪种资源? 任何:文件,服务,二进制文件,cron作业等。
· 删除容器后,其所有内容都将丢失。 稍后,我们将学习如何处理数据持久性。
我们了解到,容器就是某种镜像实例。 了解基本区别就足够了。 但是要提高我们的Docker技能,我们需要更深入地了解镜像概念。
镜像是一叠图层。 那是一层呢? 一层是相对于上一层的一组差异。 Dockerfile是定义如何构建镜像的文件。 该文件中的每条指令代表镜像的一层。 层被缓存以更快地构建镜像,因此良好的Dockerfile实现确实可以使构建时间和镜像大小有所不同。
Image layers as explained by docs.docker.com
这是真正的交易。 生成容器时,我们将获取镜像的图层堆栈,并在顶部(容器层)上生成一个可写层。 容器生命周期中生成的所有更改都将写入此层。 因此,删除容器时,容器层数据将丢失。
Multiple containers from the same image, docs.docker.com
您是否尝试安装Docker? 您可能已经注意到,不仅需要安装Docker,还需要安装dockerd。
那是因为Docker是一个客户端服务器应用程序。 您必须同时拥有这两个部分才能在计算机上运行Docker应用程序。 此客户端-服务器串联称为docker引擎。
docker客户端只是一个CLI工具,用于针对REST API发出请求,该REST API负责与docker守护程序或dockerd进行交互。 dockerd将处理操作系统以确保容器的正确行为。
Docker engine as explained by docs.docker.com
等等,您是否说了有关客户端服务器的内容? 这是否意味着我可以向远程Docker守护程序抛出请求? 好了,您现在可能已经意识到诸如Kubernetes,OpenShift和Docker Swarm之类的编排服务是如何工作的。
现在我们对Docker的主要元素有了清晰的了解,它们如何协同工作?
每当在Docker客户端中创建请求时,该请求都会发送到Docker守护程序,它将执行所需的操作。
让我们以运行redis容器为例。 我们通过运行docker run redis指令来实现这一点。
Docker architecture, docs.docker.com
首先,我们的计算机将向已配置的Docker主机API发出请求,该API将与Docker守护程序进行交互。
至此,守护程序知道其必须执行的操作。 它将在主机注册表上查找redis镜像。 如果不存在,则会进行一次新查找,这次将针对已配置的镜像注册表(Docker Hub,ECR,ACR,GCR等)进行搜索并提取(下载)。 然后,它将基于下载的生成一个容器。
如果由于某种原因,我们的postgres容器崩溃了,并且无法再次启动,则我们可能需要移除该容器并运行另一个容器。 但是,如前所述,容器层数据将丢失,我们不想丢失所有数据,是吗?
为持久性问题提供的两个解决方案是卷和绑定安装。 通过这两者,我们可以将正在运行的容器的文件系统持久保存到主机中。
一方面,卷将数据存储在主机中,只有dockerd可以修改此文件系统。 这是通常存储数据的首选方式。
另一方面,使用绑定安装,我们不仅可以将目录安装到容器中,还可以将具体文件安装到容器中。 另外,绑定安装允许安装任何主机目录或文件。 这意味着我们可以从主机将数据插入到容器中。 对于配置文件而言,这是巨大的。
Different data storage provided by Docker, docs.docker.com
第三种数据挂载模式tmps,在linux主机中使用,用于持久存储我们不想在容器层或主机文件系统中写入的数据(例如密钥)。 此数据保留在主机内存中。
也许您想在与世界隔绝的计算机中运行惊人的Web应用程序。 但是,这并不是Docker的主要用例,因此网络在编排Docker容器时起着重要的作用。
Docker提供了将不同类型的网络驱动程序附加到运行中的容器的可能性,从而实现了容器与另一个容器,Docker主机和/或Internet之间的连接。
Example of a bridge network provided by docs.docker.com
由于容器本身并不需要真正的网络知识,因此我们将在本主题中另辟piece径。
现在,您应该对不同的Docker资源如何协同工作有一个更清晰的认识。 您现在应该至少能够理解"容器世界"中讨论的大多数概念的表面。
我邀请您进行自己的研究,以更深入地研究这些主题,并构建和部署您的容器化应用。 这里有一些想法:
· 尝试不同的卷/网络模式。
· 测试层缓存与无缓存的构建时间。
· 尝试多步骤构建。
· 沉迷于出色的docker-compose。
(本文翻译自Víctor Suárez Fernández的文章《An Overview of Docker Architecture》,参考:https://medium.com/better-programming/an-overview-to-docker-architecture-15407c482c52)