介绍
Docker是一种开源的容器化平台,能够帮助开发人员和系统管理员更轻松地打包、发布和运行应用程序。相比于传统的虚拟化技术,Docker容器不需要运行整个操作系统,而是仅包含应用程序及其依赖,因此可以更快地启动和停止,也更轻量级。
总的来说,Docker为开发人员和系统管理员提供了一种更简单、更高效的方式来构建、部署和管理应用程序
为什么会出现Dokcer
Docker 是因为现代应用开发和部署的需求而出现的。传统的应用开发和部署通常需要手动配置和安装软件依赖,而且可能会与其他应用程序冲突。这会导致开发和部署过程繁琐而且缓慢。
在服务器配置一个应用的运行环境,要安装各种软件,Java/RabbitMQ/MySQL/JDBC驱动包等等。
安装和配置这些东西是非常麻烦的,在 Windows 上安装的这些环境,到了 Linux 又得重新装。换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
在使用Docker之前,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件和所有软件环境。遇到部署失败的情况已经是家常便饭了。
Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
Docker 提供了一个可移植的容器化平台,使得应用程序的开发和部署更加简单和高效。通过使用 Docker,开发人员可以将所有应用程序、库和依赖项打包到一个完整的容器中,确保它可以在任何环境中稳定运行。这使得应用程序的交付更加快速、可靠和可重复。
另外,Docker 还可以帮助企业更好地管理其开发和部署基础设施,提高资源利用率和安全性。因此,Docker 凭借其便捷性、可移植性和安全性,已成为当今最受欢迎的应用程序容器化技术之一。
一次镜像,处处运行
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
优点
更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
Docker平台架构图
Docker运行的基本流程:
- 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。
- Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储。
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Networkdriver 创建并配置 Docker容器网络环境。
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。
- 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系统的运行,包括镜像、容器、网络和存储等。
Docker Server服务端
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会在已有的镜像层(只读层)上添加一个新层(可写层)用于存储修改后的文件,这个新镜像层就是由只读层和可写层组成的。
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
1、 Graphdriver 主要用于完成容器镜像的管理,包括存储与获取。
2、 存储:docker pull 下载的镜像由 Graphdriver 存储到本地的指定目录( Graph 中 )。
3、 获取:docker run(create)用镜像来创建容器的时候由 Graphdriver 到本地 Graph中获取镜像。
Networkdriver
Networkdriver 的用途是完成 Docker 容器网络环境的配置,其中包括:
Docker 启动时为 Docker 环境创建网桥。Docker 容器创建时为其创建专属虚拟网卡设备。Docker 容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。
Execdriver
1、 Execdriver 作为 Docker 容器的执行驱动,负责创建容器运行命名空间、容器资源使用的统计与限制、容器内部进程的真正运行等。
2、 现在 Execdriver 默认使用 Native 驱动,不依赖于 LXC。
Libcontainer
1、 Libcontainer 是 Docker 架构中一个使用 Go 语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的 API。
2、 Docker 可以直接调用 Libcontainer 来操纵容器的 Namespace、Cgroups、Apparmor、网络设备以及防火墙规则等。
3、 Libcontainer 提供了一整套标准的接口来满足上层对容器管理的需求。或者说 Libcontainer 屏蔽了 Docker 上层对容器的直接管理。
Docker Container
Docker容器是通过Docker镜像创建的运行实例,包含了应用程序和其所需的依赖文件等。每个容器都是独立的,相互隔离。
1、 Docker Container( Docker 容器 )是 Docker 架构中服务交付的最终体现形式。
2、 Docker 按照用户的需求与指令,订制相应的 Docker 容器:
用户通过指定容器镜像,使得 Docker 容器可以自定义 rootfs 等文件系统。用户通过指定计算资源的配额,使得 Docker 容器使用指定的计算资源。用户通过配置网络及其安全策略,使得 Docker 容器拥有独立且安全的网络环境。用户通过指定运行的命令,使得 Docker 容器执行指定的工作。
传送门
docker官网:http://www.docker.com
Docker Hub官网: https://hub.docker.com/