三分钟了解下Docker技术

288 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

docker

docker的作用?

从2010云计算开始火起来,什么Iass、Pass、SasS出现了许多年,尤其是pass方面更需要一个这样的平台解决应用打包 、发布部署问题,需要解决开发本地环境,与线上环境的一致性。实际上一套pass平台无论是开发还是运维都需要发很大的精力去理解去学习。而大概从2013年docker的出现颠覆了这些做法, Docker 镜像解决的,恰恰就是打包这个根本性的问题。Docker 项目给 PaaS 带来的改变,其实是提供了一种非常便利的打包机制。这种机制直接打包了应用运行所需要的整个包,从而保证了本地环境和云端环境的高度一致,避免了用户通过“试错”来匹配两种不同运行环境之间差异的痛苦过程。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

容器的本质是什么?

容器的本质是进程,实际上并没有这么个docker容器,只是docker项目,在系统中帮用户创建了一个特殊的进程,而创建这个进程时,docker帮这个进程加上了各种namespace参数,容器就只能“看”到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。另外一个主要就是采用Linux Cgroups 对这个容器进程进行资源限制,用来他的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

容器为什么是单进程模型?

容器启动之后,里面pid=1的进程就是应用本身,并不是操作系统初始化进程systemd 所以一个隔离了容器并不具备systemd 一样管理多线程、多进程等复杂场景的能力,所以如果容器如果是多进程,没有这些管理能力,多进程条件下产生的孤儿进程、僵尸进程等都不会进行回收处理,这样会导致系统资源的永久性占用,同时如果是多进程,在容器外部也并不清楚里面进程真实情况。

容器 与 vm

从上图中VM,要由 Hypervisor 来负责创建虚拟机,这个虚拟机是真实存在的,并且它里面必须运行一个完整的 Guest OS 才能执行用户的应用进程。这就不可避免地带来了额外的资源消耗和占用。这个os里面运行了太多与应用无关的进程,而且一个os本身占用太多的计算存储资源,在一台物理机虚拟出虚拟机来运行应用无疑比容器这种系统上特殊进程性能和资源消耗大很多。

docker相比VM之类的最明显的特点就是启动快,资源占用小。 “敏捷”和“高性能”是容器相较于虚拟机最大的优势,不过也有不利的地方,主要就是隔离的不彻底,底层还是要使用操作系统内核,还是会存在一些问题的。比如说相关容器安全,容器里面的访问系统文件权限问题,网络管理相对比较简单、Docker对disk管理比较有限、container中的log等用户数据不便收集了、lxc是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的。

以上就是一个简单的对比,还有要提到容器镜像打包的问题,镜像是怎么通过分层、通过rootf等方式去制作镜像以及volume挂载等问题。就不做过多的叙述。

docker架构

image.png

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。

Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。

参考文档:

kuberneters in action
极客时间深入剖析kubernetes等