如果您最近进入了容器世界,或者已经使用了一段时间,那么了解一下Docker的底层系统及元素其实是不错的主意。
了解基础
镜像还是容器?
首先是第一件事。对基本术语有明确的认知会对你有帮助的。镜像和容器似乎是等效的术语-但它们不是同一回事?我的意思是,我都使用它们将我的应用程序投放到某些服务器,PaaS或其他任何服务器上。
是的,但实际上不是
根据软件开发将容器描述为镜像的实例。这句话包括了如下含义:
- 从一个镜像中可以创建出无数个实例
-镜像内部的资源将出现在其所有生成的容器中。哪种资源?任何:文件,服务,二进制文件,cron作业等。
-容器被删除后,其所有内容都将丢失。稍后,我们将学习如何处理数据持久性问题。
镜像和容器的实际差异
我们了解到,容器就是某种镜像的实例。了解基本区别就足够了。但是要提高我们的Docker技能,我们需要更深入地了解镜像概念。
镜像是一推图层。那是一层呢?一层是相对于上一层的一组差异。Dockerfile是定义如何构建映像的文件。该文件中的每条指令代表镜像的一层。层被缓存可以更快地构建镜像,因此好的Dockerfile实现确实可以使构建时间和镜像大小有所不同。

当生成容器时,我们将获取镜像的图层堆栈,并在顶部(容器层)上生成一个可写层。容器生命周期中生成的所有更改都将写入此层。因此,删除容器时,容器层数据将丢失。

Docker架构101
Docker Engine
您是否尝试安装Docker?您可能已经注意到,不仅需要安装Docker,还需要安装dockerd。
那是因为Docker是一个客户端-服务器应用程序。您必须同时拥有这两个部分才能在计算机上运行Docker程序。此客户端-服务器联合起来称为docker引擎。
docker客户端只是一个CLI工具,用于针对REST API发出请求,该REST API负责与docker守护程序或dockerd进行交互。 dockerd将和操作系统一起处理以确保容器的产生正确的结果。

等下,您刚是否说了有关客户端-服务器的东西?这是否意味着我可以向远程Docker守护程序发出请求?好了,您现在可能已经意识到诸如Kubernetes,OpenShift和Docker Swarm之类的编排服务是如何工作的。
The big picture
现在我们对Docker的主要元素有了清晰的了解,那么它们如何协同工作?
每当在Docker客户端中创建请求时,该请求会发送到Docker守护程序,它将执行所需的操作。
让我们以运行redis容器为例。我们通过运行这条命令:docker run redis

首先,我们的计算机将向已配置的Docker主机API发出请求,该API将与Docker守护程序进行交互。
至此,Docker守护程序知道其要执行的操作。它将在主机注册表上查找redis镜像。如果不存在,则会进行一次新查找,这次将针对已配置的镜像注册中心(Docker Hub,ECR,ACR,GCR等)进行查找并提取(下载)。然后,它将基于下载的镜像生成一个容器。
其他主要Docker组件
持久性问题
如果由于某种原因,我们的postgres容器崩溃了,并且无法再次启动,则我们可能需要删除该容器并运行另一个容器。但是,如前所述,容器层数据将丢失,我们是不想丢失所有数据,对吗?
为持久性问题提供的两个解决方案是卷(volumes )和绑定安装(bind mounts)。通过这两者,我们可以将正在运行的容器的文件系统持久保存到主机中。
一方面,卷将数据存储在主机中,只有dockerd可以修改此文件系统。这是通常存储数据的首选方式。
另一方面,使用绑定安装,我们不仅可以将目录安装到容器中,还可以将具体文件安装到容器中。另外,绑定安装允许安装任何主机目录或文件。这意味着我们可以从主机将数据插入到容器中。对于配置文件而言,这是很牛逼的。

第三种数据挂载模式tmps,他是使用Linux主机持久存储,我们不想在容器层或主机文件系统中写入的数据(例如密钥)。此数据保留在主机内存中。
为什么我的容器无法ping通Google?
也许您想在与世界隔绝的计算机中运行惊人的Web应用程序。但是,这并不是Docker的主要用例,因此网络在编排Docker容器时起着重要的作用。
Docker提供了将不同类型的网络驱动程序,而且可以附加到运行中的容器,从而实现了容器与另一个容器,Docker主机和/或Internet之间的连接。

由于容器本身并不真正需要深度的网络知识,因此我们将离开这个话题,会在另一个主题中去讨论。
去玩吧!
现在,您应该对不同的Docker资源如何协同工作有了一个更清晰的认识。您现在应该至少能够理解“容器世界”中讨论的大多数基础概念。
我希望您进行自己的研究,以更深入地研究这些主题,并构建和部署您的容器化应用。这里有一些想法:
-尝试不同的卷/网络模式。
-测试使用琏缓存和不带缓存,并对比他们的构建时间。
-尝试多步骤构建。
-使用docker-compose。
原文 :https://medium.com/better-programming/an-overview-to-docker-architecture-15407c482c52
网友评论