Docker如此受欢迎的一个原因是它提供了“一次开发,随处运行”的承诺.Docker提供了一种将应用程序及其运行时依赖性打包到单个容器中的简单方法。它还提供了一个运行时抽象,使容器能够跨不同版本的Linux内核运行。
使用Docker,开发人员可以在他或她的工作站上创建容器化应用程序,然后轻松地将容器部署到任何支持Docker的服务器。无论是在云端还是在本地,都无需为服务器环境重新测试或重新调整容器。此外,Docker还提供软件共享和分发机制,允许开发人员和运营团队轻松共享和重用容器内容。这种分发机制与跨机器的可移植性相结合,有助于说明Docker在运营团队和开发人员中的受欢迎程度。
【组件】图像层不变,容器层变。
Docker既是开发工具又是运行时环境。要了解Docker,我们必须首先了解Docker容器映像的概念。容器始终以图像开头,并被视为该图像的实例化。图像是容器在运行时应该是什么的静态规范,包括容器内的应用程序代码和运行时配置设置。Docker镜像包含只读层,这意味着一旦创建了图像,它就永远不会被修改。
图1显示了容器图像的示例。此图像描绘了具有Apache安装的Ubuntu映像。该图像由三个基本Ubuntu图层和一个更新图层组成,顶部有一个Apache图层和一个自定义文件图层。
图1:Docker图像层。
运行Docker容器是图像的实例化。从相同图像派生的容器在其应用程序代码和运行时依赖性方面彼此相同。但与只读的图像不同,运行容器包括在只读内容之上的可写层(容器层)。运行时更改(包括对数据和文件的任何写入和更新)都保存在容器层中。因此,共享相同底层图像的多个并发运行容器可具有实质上不同的容器层。
删除正在运行的容器时,可写容器层也将被删除,并且不会保留。保持更改的唯一方法是docker commit
在删除容器之前执行显式命令。执行a时docker commit
,正在运行的容器内容(包括可写层)将写入新的容器映像并存储到磁盘中。这成为与实例化容器的图像不同的新图像。
使用此显式docker commit
命令,可以创建一组连续的离散Docker镜像,每个镜像都构建在上一个图像之上。此外,Docker使用写时复制策略来最小化共享相同基本组件的容器和映像的存储空间。这有助于优化存储空间并最小化容器启动时间。
图2描绘了图像和正在运行的容器之间的区别。请注意,每个正在运行的容器可以具有不同的可写层。
图2:Docker镜像和运行Docker容器。
除了图像概念之外,Docker还有一些与传统Linux容器不同的特定组件。(守护进程、CLI命令等)
更具体地说,在Dockerfile中,首先指定构建过程开始的基本映像。然后指定一系列命令,之后可以构建新的容器映像。
您可以针对特定的Docker守护程序或注册表执行Docker命令。例如,如果执行该docker -ps
命令,Docker将返回在守护程序上运行的容器列表。
【内容分发】私有注册表到公共注册表
除了运行时环境和容器格式之外,Docker还提供了一种软件分发机制,通常称为注册表,可以方便容器内容的发现和分发。
注册表的概念对Docker的成功至关重要,因为它提供了一组用于打包,发送,存储,发现和重用容器内容的实用程序。Docker公司运行一个名为Docker Hub的公共免费注册表。
图3描绘了一个工作流,其中用户构造图像并将其上载到注册表。其他用户可以从注册表中提取映像以生成生产容器,并将它们部署到Docker主机,无论它们在哪里。
【不变性】保留原来的,从而进行版本更新、管理。
Docker容器最有趣的特性之一是它们的不变性和容器的无状态性。
正如我们在上一节中所描述的,Docker镜像一旦创建,就不会改变。从映像派生的运行容器具有可写层,可以临时存储运行时更改。如果在删除之前提交容器docker commit
,则可写层中的更改将保存到与前一个图像不同的新图像中。
为什么不变性好?不可变的图像和容器导致不可变的基础架构,不可变的基础架构具有传统系统无法实现的许多有趣的好处。这些好处包括以下内容:
【docker的区别】
Docker的图像格式,广泛的容器管理API以及创新的软件分发机制使其成为开发和运营团队的热门平台。Docker为组织带来了这些显着的好处。
Docker已经在改变组织构建系统和提供服务的方式。它开始重塑我们对软件设计和软件交付经济学的思考方式。在这些变更真正扎根之前,组织需要更好地了解如何管理Docker环境的安全性和策略。但这是另一篇文章的主题。
原文:https://www.cnblogs.com/immiao0319/p/10347739.html