【Docker官方文档】理解Docker

网友投稿 776 2022-11-18

docker官方文档】理解Docker

【Docker官方文档】理解Docker

本文来自Docker的官方文档,详细介绍了Docker的体系结构、重要概念、内部工作机理等内容,推荐不了解Docker内部原理的同学阅读。

什么是Docker?

Docker是一个用于开发、交付和运行应用的开放平台,Docker设计用来更快的交付你的应用程序。 Docker可以将你的应用程序和基础设施层隔离,并且还可以将你的基础设施当作程序一样进行管理。Docker可以帮助你更块地打包你代码、测试以及部署,并且也可以减少从编写代码到部署运行代码的周期。Docker将一个轻量级的容器虚拟化平台和一组标准工作流程、工具进行集成,来帮助你方便地管理和部署应用。核心是,Docker提供了一种在安全隔离的容器中运行近乎所有应用的方式,这种隔离性和安全性允许你在同一主机上同时运行多个容器,而容器的这种轻量级特性,意味着你可以节省更多的硬件资源,因为你不必消耗运行hypervisor所需要的额外负载。基于容器虚拟化的工具或者平台可以为你提供如下帮助:

将应用程序(包括支撑的组件)放入Docker容器中;将这些容器打包并分发给你的团队,以便于后续的开发和测试;将这些容器部署到生产环境中,生产环境可以是本地的数据中心,也可以在云端。

我可以用Docker做些什么?

快速分发你的应用

Docker是开发过程中较为理想的助手,它允许你在包含了你的应用和服务的本地容器中进行开发,然后帮你完成集成和部署。例如,你的开发人员可以在本地编写代码然后通过Docker与其他同事共享,当他们完成了各自的开发任务后,可以将他们的代码推送到一个测试的环境中进行测试,完成测试后便可以将相应的Docker镜像部署到生产环境中。

更方便地进行部署和调整规模

Docker这种基于容器的平台具有高度的便携性,它可以无缝地运行于开发者的本地主机、数据中心其它的物理机或虚拟机、或者云端。Docker的便携性和其天然的轻量特性易于实现动态地负载管理,你可以利用Docker快速地增减应用和服务的部署规模,Docker的速度保证了这种规模的调整近乎实时。

更高密度的部署应用和运行更多的应用

由于Docker轻量并且快速,因此相对于基于Hypervisor的虚拟机的部署方式,Docker提供了一种更可行和划算的替代方案,这对于高密度部署环境尤其有用,例如在构建私有云或PaaS。当然,当你想在有限的资源里部署更多的应用时,Docker对于中小型的部署也非常有用。

Docker主要包括哪些组件?

Docker主要包括两个组件:

注:Docker在Apache 2.0开源协议下进行授权。

Docker的架构?

Docker是Client/Server的架构,Docker客户端与Docker daemon进行交互,daemon负责构建、运行和发布Docker容器。客户端可以和服务端运行在同一个系统中,也可以连接远程的daemon。 Docker的客户端的daemon通过RESTful API进行socket通信。

Docker守护进程

就像上图所示,Docker守护进程(daemon)在主机上运行,用户不能直接和守护进程打交道,但是可以通过Docker客户端与其进行交互。

Docker客户端

Docker客户端——docker二进制文件的功能之一——是Docker的初始用户界面,它接收用户的命令并反馈,并且与Docker的守护进行交互。

Docker内部机制

理解Docker的内部机制,你需要明白如下三个组件:

Docker镜像Docker注册中心Docker容器

Docker镜像

Docker镜像是一个只读的模板。例如,一个镜像可以包含安装了Apache Web服务应用的Ubuntu操作系统。镜像可以用来创建Docker容器。Docker提供了构建新镜像或升级原有镜像的较为便利的方式,或者你也可以-别人已经创建好的镜像。Docker镜像是Docker的构建组件。

Docker注册中心

Docker容器

Docker容器就像是一个文件夹,它包含了一个应用程序运行所需要的所有内容。每个容器都是基于Docker镜像构建。我们可以运行、开始、停止、迁移或者是删除Docker容器。每个容器均是一个隔离的、安全的应用平台。Docker容器是Docker的运行组件。

Docker怎样工作的

至此,我们已经知道了:

那我们看看Docker是怎么将这些元素组合在一起工作的。

Docker镜像是如何工作的

Docker镜像从这些基础镜像中按照一系列的步骤进行制作,我们称这些步骤为指令,每个指令在你的镜像中创建一个新的层,指令包括以下行为:

运行一条命令;添加一个文件或目录;创建一个环境变量;从此镜像中加载一个容器时需要运行的进程。

这些指令存储在Dockerfile中,Docker在构建镜像过程中读取这个Dockerfile,运行里面的指令并返回最终的镜像。

Docker注册中心如何工作的

容器是如何工作的

一个容器包括操作系统、用户添加的文件以及相关的元数据。我们知道,每个容器都是从镜像中构建出来的,这个镜像告诉 Docker容器用到什么资源、当容器加载时启动哪个进程以及容器启动时的其它配置。Docker镜像是只读的,当Docker从一个镜像运行一个容器时,它会在镜像的上层添加一个用于运行应用的可读写的层(利用的就是上文提到的union file system)。

运行一个容器时到底发生了什么

不管是通过Docker命令还是API调用的方式,Docker客户端都会通知Docker的守护进程运行一个容器。

$ sudo docker run -i -t ubuntu /bin/bash

我们来看一下这个命令,Docker客户端利用docker命令并结合run选项来启动一个容器,一个最小配置的Docker客户端运行一个容器需要告诉Docker守护进程以下事项:

此容器基于什么镜像来构建,此处是ubuntu——一个基础的Ubuntu镜像;需要在容器中运行的命令,此处是/bin/bash——在容器中启动一个Bash Shell。

那么我们看看运行上述命令时到底发生了什么?按照顺序,Docker依次干了如下事情:

现在你已经运行了一个容器,这样你便可以管理你的容器、与应用程序进行交互,当运行结束是停止或者删除你的容器。

底层技术问题

Docker是用Go语言实现的,用到了一些Linux内核的特性实现上述功能。

命名空间(namespaces)

Docker在为容器提供一个隔离的工作空间时,用到了命名空间的技术,当你运行一个容器时,Docker会为此容器创建一组命名空间。这样便可以提供一个隔离的层:每个容器运行在自己的命名空间中,而外部不能访问这个层。Docker用到的一些命名空间有:

pid命名空间: 用于隔离进程(PID:Process ID);net命名空间: 用于管理网络;ipc命名空间: 用于访问IPC资源(IPC:InterProcess Communication);mnt命名空间: 用于管理挂载点(MNT:Mount);uts命名空间: 用于隔离内核和版本标识(UTS:Unix Timesharing System)。

控制组(Control Groups)

Docker还用到了另外一项技术叫cgroups或者叫控制组(control groups)。实现程序运行环境的隔离的关键在于使这些程序只用到它们需要的资源,这就能够保证这些容器是主机服务环境小社会中的好市民。控制组允许 Docker在不同的容器之间共享硬件资源,需要时添加一些限制和约束,例如限制一个容器最大访问内存量。

统一文件系统(Union file systems)

统一文件系统或者说是UnionFS,是创建层的时候用到的文件系统,使文件系统非常轻量和快速。Docker使用统一文件系统为容器构建blocks,Docker可以使用几种不同的文件系统:AUFS、btrfs、vfs以及DeviceMapper。

容器格式

下一步

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:给Linux增加swap内存
下一篇:买灯泡支架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~