0
点赞
收藏
分享

微信扫一扫

基于simulink从视频序列创建马赛克(附源码)

半秋L 2023-07-13 阅读 50
docker

介绍

Docker是一种开源的容器化平台,能够帮助开发人员和系统管理员更轻松地打包、发布和运行应用程序。相比于传统的虚拟化技术,Docker容器不需要运行整个操作系统,而是仅包含应用程序及其依赖,因此可以更快地启动和停止,也更轻量级。

总的来说,Docker为开发人员和系统管理员提供了一种更简单、更高效的方式来构建、部署和管理应用程序

为什么会出现Dokcer

Docker 是因为现代应用开发和部署的需求而出现的。传统的应用开发和部署通常需要手动配置和安装软件依赖,而且可能会与其他应用程序冲突。这会导致开发和部署过程繁琐而且缓慢。

在服务器配置一个应用的运行环境,要安装各种软件,Java/RabbitMQ/MySQL/JDBC驱动包等等。

安装和配置这些东西是非常麻烦的,在 Windows 上安装的这些环境,到了 Linux 又得重新装。换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。

在使用Docker之前,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件和所有软件环境。遇到部署失败的情况已经是家常便饭了。

Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

image-20230707215426379

Docker 提供了一个可移植的容器化平台,使得应用程序的开发和部署更加简单和高效。通过使用 Docker,开发人员可以将所有应用程序、库和依赖项打包到一个完整的容器中,确保它可以在任何环境中稳定运行。这使得应用程序的交付更加快速、可靠和可重复。

另外,Docker 还可以帮助企业更好地管理其开发和部署基础设施,提高资源利用率和安全性。因此,Docker 凭借其便捷性、可移植性和安全性,已成为当今最受欢迎的应用程序容器化技术之一。

一次镜像,处处运行

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

image-20230707215515733

Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

优点

更快速的应用交付和部署

传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

更便捷的升级和扩缩容

随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

更简单的系统运维

应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

更高效的计算资源利用

Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

Docker平台架构图

image-20230707215608516

Docker运行的基本流程:

  1. 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
  2. Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
  3. Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
  4. Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储。
  5. 当需要为 Docker 创建网络环境时,通过网络管理驱动 Networkdriver 创建并配置 Docker容器网络环境。
  6. 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。
  7. Libcontainer 是一项独立的容器管理包,Networkdriver 以及 Execdriver 都是通过 Libcontainer 来实现具体对容器进行的操作。

架构图解

Docker Client客户端

1、 Docker Client 是 和 Docker Daemon 建立通信的客户端。通过Docker客户端,用户可以执行各种Docker命令,如构建、运行和停止容器等。

2、 Docker Client 可以通过以下三种方式和 Docker Daemon 建立通信:tcp://host:port、unix://pathtosocket 和 fd://socketfd

3、 Docker Client 发送容器管理请求后,由 Docker Daemon 接受并处理请求,当 Docker Client 接收到返回的请求相应并简单处理后,Docker Client 一次完整的生命周期就结束了。(一次完整的请求:发送请求→处理请求→返回结果),与传统的 C/S 架构请求流程并无不同。

Docker Daemon守护进程

Docker守护进程是Docker的核心组件,它负责管理整个Docker系统的运行,包括镜像、容器、网络和存储等。

image-20230707215755106

Docker Server服务端

image-20230707215811368

1、 Docker Server 相当于 C/S 架构的服务端。功能为接受并调度分发 Docker Client 发送的请求。接受请求后,Docker Server 通过路由与分发调度,找到相应的 Handler 来执行请求。

2、 在 Docker 的启动过程中,通过包 gorilla/mux 创建了一个 mux.Router 来提供请求的路由功能。在 Golang 中 gorilla/mux 是一个强大的 URL 路由器以及调度分发器。该 mux.Router 中添加了众多的路由项,每一个路由项由 HTTP 请求方法(PUT、POST、GET 或DELETE)、URL、Handler 三部分组成。

3、 创建完 mux.Router 之后,Docker 将 Server 的监听地址以及 mux.Router 作为参数来创建一个 httpSrv=http.Server{},最终执行 httpSrv.Serve() 为请求服务。

4、 在 Docker Server 的服务过程中,Docker Server 在 listener 上接受 Docker Client 的访问请求,并创建一个全新的 goroutine 来服务该请求。在 goroutine 中,首先读取请求内容并做解析工作,接着找到相应的路由项并调用相应的 Handler 来处理该请求,最后 Handler 处理完请求之后回复该请求。

Docker Engine

1、 Docker Engine 是 Docker 架构中的运行引擎,同时也 Docker 运行的核心模块。它扮演 Docker Container 存储仓库的角色,并且通过执行 Job 的方式来操纵管理这些容器。

2、 在 Docker Engine 数据结构的设计与实现过程中,有一个 Handler 对象。该 Handler 对象存储的都是关于众多特定 Job 的 Handler 处理访问。举例说明: Docker Engine 的Handler 对象中有一项为:{“create”: daemon.ContainerCreate,},则说明当名为”create” 的 Job 在运行时,执行的是 daemon.ContainerCreate 的 Handler。

Job

1 、一个 Job 可以认为是 Docker 架构中 Docker Engine 内部最基本的工作执行单元。Docker 可以做的每一项工作,都可以抽象为一个 Job。例如:在容器内部运行一个进程,这是一个 Job;创建一个新的容器,这是一个 Job。Docker Server 的运行过程也是一个 Job,名为 ServeApi。

2、 Job 的设计者,把 Job 设计得与 Unix 进程相仿。比如说:Job 有一个名称、有参数、有环境变量、有标准的输入输出、有错误处理,有返回状态等。

Docker Registry

1、 Docker Registry 是一个存储容器镜像的仓库(注册中心),可理解为云端镜像仓库。它允许用户创建和管理Docker镜像仓库,以提供Docker镜像的共享和分发。Docker Hub是最常用的Docker仓库,也可以通过搭建自己的私有仓库来管理Docker镜像。按 Repository 来分类,docker pull 按照 [repository]:[tag] 来精确定义一个具体的 Image。

2、 在 Docker 的运行过程中,Docker Daemon 会与 Docker Registry 通信,并实现搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的 Job 名称分别为:“search”、”pull” 与 “push”。

3、 Docker Registry 可分为公有仓库( Docker Hub)和私有仓库。

Docker image

Docker镜像是一个只读的模板,可以用来创建容器。镜像可以从Docker Hub或者自己构建,其中包含了应用程序和其依赖的所有文件和配置信息。

Graph

Graph是指Docker镜像及其所有层的存储方式。Graph由一组只读层和一个可写层组成,每个只读层表示一个已有的镜像或父镜像。这些只读层都是只读文件系统,并且只能通过复制构建新的镜像。可写层则是新建或修改文件的地方,用于创建新的镜像。

当创建一个新镜像时,Docker会在已有的镜像层(只读层)上添加一个新层(可写层)用于存储修改后的文件,这个新镜像层就是由只读层和可写层组成的。

image-20230707220337211

Repository

1、 已下载镜像的保管者(包括下载的镜像和通过 Dockerfile 构建的镜像)。

搜索公众号顶级架构师回复关键字“架构整洁”,获取一份惊喜礼包。

2、 一个 Repository 表示某类镜像的仓库(例如:Ubuntu),同一个 Repository 内的镜像用 Tag 来区分(表示同一类镜像的不同标签或版本)。一个 Registry 包含多个Repository,一个 Repository 包含同类型的多个 Image。

3 、镜像的存储类型有 Aufs、Devicemapper、Btrfs、Vfs等。其中 CentOS 系统 7.x 以下版本使用 Devicemapper 的存储类型。

4、 同时在 Graph 的本地目录中存储有关于每一个的容器镜像具体信息,包含有:该容器镜像的元数据、容器镜像的大小信息、以及该容器镜像所代表的具体 rootfs。

GraphDB

1、 已下载容器镜像之间关系的记录者。

2、 GraphDB 是一个构建在 SQLite 之上的小型数据库,实现了节点的命名以及节点之间关联关系的记录。

Driver

Driver 是 Docker 架构中的驱动模块。通过 Driver 驱动,Docker 可以实现对 Docker 容器执行环境的定制。即 Graph 负责镜像的存储,Driver 负责容器的执行。

Network

Docker网络(Docker Network):Docker网络是用于容器间通信的网络。Docker可以创建自己的网络,也可以连接到已有网络

Docker Network是位于Driver组件中的。Docker Network是一个用于管理Docker容器网络的驱动程序,它允许用户创建自定义的网络,并将容器连接到这些网络中。同时,Docker也提供了多种内置的网络驱动程序(如Bridge、Overlay、MACVLAN等),以方便用户根据不同场景进行网络配置和管理。因此,Docker Network是Driver组件中非常重要的一部分。

Graphdriver

image-20230707221012744

1、 Graphdriver 主要用于完成容器镜像的管理,包括存储与获取。

2、 存储:docker pull 下载的镜像由 Graphdriver 存储到本地的指定目录( Graph 中 )。

3、 获取:docker run(create)用镜像来创建容器的时候由 Graphdriver 到本地 Graph中获取镜像。

Networkdriver

image-20230707221053691

Networkdriver 的用途是完成 Docker 容器网络环境的配置,其中包括:

Docker 启动时为 Docker 环境创建网桥。Docker 容器创建时为其创建专属虚拟网卡设备。Docker 容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。

Execdriver

image-20230707221109258

1、 Execdriver 作为 Docker 容器的执行驱动,负责创建容器运行命名空间、容器资源使用的统计与限制、容器内部进程的真正运行等。

2、 现在 Execdriver 默认使用 Native 驱动,不依赖于 LXC。

Libcontainer

image-20230707221129851

1、 Libcontainer 是 Docker 架构中一个使用 Go 语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的 API。

2、 Docker 可以直接调用 Libcontainer 来操纵容器的 Namespace、Cgroups、Apparmor、网络设备以及防火墙规则等。

3、 Libcontainer 提供了一整套标准的接口来满足上层对容器管理的需求。或者说 Libcontainer 屏蔽了 Docker 上层对容器的直接管理。

Docker Container

Docker容器是通过Docker镜像创建的运行实例,包含了应用程序和其所需的依赖文件等。每个容器都是独立的,相互隔离。

image-20230707221205099

1、 Docker Container( Docker 容器 )是 Docker 架构中服务交付的最终体现形式。

2、 Docker 按照用户的需求与指令,订制相应的 Docker 容器:

用户通过指定容器镜像,使得 Docker 容器可以自定义 rootfs 等文件系统。用户通过指定计算资源的配额,使得 Docker 容器使用指定的计算资源。用户通过配置网络及其安全策略,使得 Docker 容器拥有独立且安全的网络环境。用户通过指定运行的命令,使得 Docker 容器执行指定的工作。

传送门

docker官网:http://www.docker.com

Docker Hub官网: https://hub.docker.com/

举报

相关推荐

0 条评论