【云原生】Docker 架构及工作原理

简介: 【云原生】Docker 架构及工作原理

一、Docker 概述

Docker 是一个开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,以便快速交付软件。有了 Docker,你可以像管理应用程序一样管理你的基础设施。通过利用 Docker 快速发布、测试和部署代码的方法,您可以显著减少编写代码和在生产环境中运行它之间的延迟。


Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互。


23.png


23.png

二、Client 客户端

Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。


三、Docker 引擎

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

 

Docker 引擎是一个 客户端-服务器 应用程序,具有以下主要组件:


一个服务器,它是一种称为守护进程(dockerd 命令)的长时间运行程序。

一个 REST API,它指定程序可以用来与守护进程对话并指示它做什么的接口。

一个命令行界面(CLI)客户端(docker命令)。


24.png


CLI 使用Docker REST API通过脚本或直接CLI命令控制Docker守护进程或与之交互。

许多其他Docker应用程序使用底层API和CLI。


这个守护进程创建和管理 Docker 对象,如镜像、容器、网络和卷(images, containers, networks, and volumes)。


四、Image 镜像

什么是 Docker 镜像?简单的理解,Docker 镜像就是一个 Linux 的文件系统(Root FileSystem),这个文件系统里面包含可以运行在 Linux 内核的程序以及相应的数据。


通过镜像启动一个容器,一个镜像就是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件等。


Docker 把 App 文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:


多个 App 可以共用相同的底层镜像(初始的操作系统镜像);

App 运行时的 IO 操作和镜像文件隔离;

通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个 App 镜像可以用来运行无数个不同业务的容器。


五、Container 容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

Docker 面向对象
镜像
容器 对象


六、镜像分层

Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。


25.png


从上图可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。


镜像分层最大的一个好处就是共享资源。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。


如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。


可写的容器层

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。


26.png

26.png

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。


镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

1684251085249.png

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。


总结下来就是:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。


七、Volume 数据卷

实际上我们的容器就好像是一个简易版的操作系统,只不过系统中只安装了我们的程序运行所需要的环境,前边说到我们的容器是可以删除的,那如果删除了,容器中的程序产生的需要持久化的数据怎么办呢?容器运行的时候我们可以进容器去查看,容器一旦删除就什么都没有了。


所以数据卷就是来解决这个问题的,是用来将数据持久化到我们宿主机上,与容器间实现数据共享,简单的说就是将宿主机的目录映射到容器中的目录,应用程序在容器中的目录读写数据会同步到宿主机上,这样容器产生的数据就可以持久化了,比如我们的数据库容器,就可以把数据存储到我们宿主机上的真实磁盘中。


八、Registry 注册中心

Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像。


Docker 公司提供了公共的镜像仓库 https://hub.docker.com(Docker 称之为 Repository)提供了庞大的镜像集合供使用。


一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。


通常,一个仓库会包含同一个软件不同版本的镜像,而标签对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。


九、总结


27.png


Docker 官网写着这样一句话:Build and Ship any Application Anywhere,再结合刚才我们所理解的内容,总结下来就是:一次构建,到处运行。


此外,Docker 公司提供了公共的镜像仓库 https://hub.docker.com,GitHub connect,自动构建镜像,大大简化了应用分发、部署、升级流程。加上 Docker 可以非常方便的建立各种自定义的镜像文件,这些都是 Docker 成为最流行的容器技术的重要因素。


通过以上这些技术的组合,最后的结果就是:绝大部分应用,开发者都可以通过 docker build 创建镜像,通过 docker push 上传镜像,用户通过 docker pull 下载镜像,使用 docker run 运行容器应用。用户不再需要去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突——而且通常不会消耗更多的硬件资源,不会明显降低性能。


相关文章
|
1天前
|
存储 Cloud Native 文件存储
云原生之使用Docker部署home-page个人导航页
【5月更文挑战第4天】云原生之使用Docker部署home-page个人导航页
11 1
|
1天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
1天前
|
Cloud Native 持续交付 开发者
探索云原生架构的未来之路
【5月更文挑战第7天】 在数字化转型的浪潮中,云原生技术以其独特的敏捷性、可扩展性和弹性成为企业IT战略的关键组成部分。本文将深入剖析云原生的核心概念,探讨其在现代软件开发和运维中的应用,并预测云原生发展的潜在趋势。通过分析容器化、微服务、持续集成/持续部署(CI/CD)等关键技术的实践案例,揭示云原生如何推动企业快速响应市场变化、优化资源利用和提升服务质量。
|
1天前
|
运维 Cloud Native 持续交付
构建未来:云原生架构在企业数字化转型中的关键作用
【5月更文挑战第7天】 随着企业加速其数字化转型的步伐,云原生架构已成为推动创新及实现敏捷性的重要驱动力。本文将探讨云原生技术的基本原理,分析其在现代企业中的应用,并讨论如何借助云原生方法提升业务的弹性、可扩展性和效率。通过案例研究和最佳实践的分享,我们揭示了云原生解决方案如何助力企业在竞争激烈的市场中保持领先。
|
1天前
|
弹性计算 Cloud Native 安全
云原生架构的未来展望:如何引领企业转型与创新
【5月更文挑战第7天】随着云计算技术的不断发展,云原生架构已经成为企业数字化转型的关键驱动力。本文将深入探讨云原生架构的优势、挑战以及未来发展趋势,为企业提供一种全新的技术视角,以实现更高效、灵活和可扩展的业务运营。
|
1天前
|
Kubernetes Cloud Native 持续交付
构建未来:云原生架构在企业数字化转型中的关键角色
【5月更文挑战第7天】 随着企业加速数字化转型,云原生架构已成为推动创新和敏捷性的重要驱动力。本文将深入探讨云原生技术的基本原理,以及如何利用这些技术实现业务灵活性和响应速度的显著提升。通过分析微服务、容器化、持续集成/持续部署(CI/CD)等关键组件,我们将揭示云原生架构如何帮助企业应对快速变化的市场需求,同时确保系统的稳定性和可扩展性。
|
2天前
|
Cloud Native 安全 持续交付
构建未来:云原生架构在企业数字化转型中的关键作用
【5月更文挑战第6天】 随着企业加速其数字化进程,云原生架构已不仅仅是一种趋势,而成为推动业务敏捷性、可扩展性和创新的基石。本文深入探讨了云原生技术如何通过提供灵活的开发环境、微服务架构和持续交付机制,促进企业快速响应市场变化,并实现资源的最优化配置。通过分析多个行业案例,我们阐述了云原生架构实施的最佳实践,以及它如何帮助企业保持竞争优势,并为未来的技术演进打下坚实基础。
|
2天前
|
监控 Cloud Native 持续交付
探索云原生架构的演进与未来发展
随着云计算技术的快速发展,云原生架构已经成为了现代软件开发和部署的重要趋势之一。本文将探讨云原生架构的演进历程、关键特点以及未来发展方向,旨在为读者深入了解云原生技术提供参考。
10 1
|
2天前
|
Kubernetes Cloud Native 持续交付
探索云原生架构的未来:如何优化资源管理和服务部署
【5月更文挑战第6天】 随着云计算的快速发展,云原生技术已成为企业数字化转型的关键驱动力。此篇文章深入探讨了云原生架构的核心组件及其在资源管理和服务部署方面的优化策略。通过分析容器化、微服务及自动化管理的实践案例,本文旨在为读者提供一套系统的方法论,以利用云原生技术实现更高效、灵活且可靠的IT基础设施。
20 2
|
2天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
23 1

热门文章

最新文章