云原生的核心技术之一就是容器,很多人会以为Docker等于容器,其实Docker并不等于容器。其实容器可以理解为:cgroups(资源控制)+namespaces(访问隔离)+rootfs(文件系统)+engine(容器生命周期管理)。
容器与虚拟机的区别
系统虚拟化是将一台物理计算机虚拟成一台或多台虚拟计算机系统,每个计算机系统都有自己的虚拟硬件,其上的操作系统认为自己运行在一台独立的主机上,计算机软件在一个虚拟平台上,而不是真实的硬件平台上运行。
容器和虚拟机都是虚拟化技术。容器是在Linux上本机运行,并与其他容器共享主机的内核,无须模拟操作系统指令,它是运行在宿主机上的一个独立的进程。在操作系统(Operating System,OS)的基础上进行虚拟化以及进程资源隔离,占用的CPU/内存资源不比其他任何可执行文件多,非常轻量。
虚拟机运行的是一个完整的访客操作系统,每个虚拟机中都有一个独立的操作系统内核,通过软件模拟宿主机的操作系统指令,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,因此隔离效果要比容器好一些。
Docker的构成
Docker是C/S架构的程序,Docker客户端向Docker守护进程(Dockerdaemon)发起请求,守护进程负责构建、运行和分发Docker容器,处理完成后返回结果。
Docker客户端和守护进程既可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程,CLI使用REST API通过脚本或直接通过CLI命令来控制Docker守护进程或与之交互。守护进程创建并管理Docker对象,如镜像、容器、网络和数据卷。
Docker三大组件
要在Docker宿主机上拉起并运行Docker容器,与3个组件密切相关,分别是Docker镜像、Docker镜像仓库、Docker容器。
- Docker镜像(image):镜像是容器的基石,容器基于镜像启动,镜像就像是容器的源代码,保存了用于容器启动的各种条件(应用代码,二方库、环境变量和配置文件等)。
- Docker镜像仓库(registry):Docker镜像仓库用于保存用户创建的镜像,仓库分为公有和私有两种。Docker公司自己提供了仓库Docker Hub,可以在Docker Hub上创建账户,保存并分享自己创建的镜像,当然也可以架设私有镜像仓库。
- Docker容器(container):容器是Docker的执行单元(运行时),通过镜像启动,容器中可以运行客户端的多个进程。如果说镜像是Docker生命周期的构建和打包阶段,那么容器则是启动和执行阶段。
Docker处理流程
假如我们要启动一个新的Docker应用“app1”,整个工作的处理流程如下:
- Docker客户端向守护进程发送启动app1指令。
- Docker守护进程发请求给Docker镜像仓库,在仓库中检索app1的软件镜像。
- 如果找到app1应用,就把它下载到我们的服务器上。
- Docker守护进程启动app1应用。
- 把启动app1应用是否成功的结果返回给Docker客户端。
Docker的优势
Docker支持将应用打包进一个可移植的容器中,重新定义了应用开发、测试、部署上线的过程,核心理念是“一次构建,到处运行”,其典型应用场景是在开发和运维上提供持续集成和持续部署的服务。
- 标准化和版本控制:Docker是软件工程领域的“标准化”交付组件。还可以像Git仓库一样,可以让你提交变更到Docker镜像中,并通过不同的版本来管理它们。
- 一次构建,多次交付:Docker 具有可移植性。基于Docker容器镜像能够很容易地移植到其他云厂商的平台上,应用不用做任何改动。
- 应用隔离:Docker能够确保每个容器都拥有自己的资源,并且和其他容器是隔离的。你可以用不同的容器来运行使用不同堆栈的应用程序。