上一节咱们运行了一个容器,和大家一起感受了以容器运行应用的高效性。本节将和大家从以下几个方面探讨容器:容器定义、为什么要使用容器、容器的核心技术以及Docker的工作原理。
1.容器定义
什么是容器?它和应用的关系是什么?或许从它的定义中可见一斑。
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可在任何环境中运行,不拘是物理机、虚拟机、私有云与公有云。
2.容器魅力何在?
过往开发人员在开发过程中,常会遇到这样的问题:程序在自己计算机上运行的很正常,换台计算机可能就出现了问题,这是一个比较尴尬头疼的事,其原因就是一个应用包含多个服务,每个服务又有自己依赖的库和包,且需要在不同运行环境间进行迁移。而对于运维人员而言,应用换个环境就得做出相应的配置,费时费力且会产生因手工操作带来的错误。
有需求就会带来创新,受集装箱(将某种货物打包,放在一个集装箱内,可在各种交通工具间进行运输)的启迪,2008年IT领域的集装箱(container)技术就此诞生,我们称之为“容器”。因为是基于Linux内核,因为被称之为Linux Container(LXC)。而Docker是dotcloud公司提出的容器引擎技术,可将应用程序及其依赖打包成一个轻量级、可移植、自包含的容器,目前应用比较广泛。Docker的logo就是集装箱。
容器技术出现后,应用程序只需创建一次运行环境,打包后可运行于各种操作系统环境,这样开发人员只需关注业务逻辑的开发,而不用担心运行环境的变化,做到了Build Once,Run Anywhere;而对于运维人员,只需配置好标准的运行时环境,就允许任意的应用容器在其中运行,大大提高了运维效率,做到了Config Once,Run Anything。
容器技术与虚拟机技术的对比:
容器与虚拟机都是对应用进行封装与隔离,但容器技术较比虚拟机技术有诸多优势。咱们用一张图来看下:
上图中左侧是虚拟机架构图,右侧是容器架构图。
其中虚拟机中的Hypervisor相当于对硬件的虚拟,多个虚拟机共用虚拟的硬件,并有自己的操作系统。而容器是对操作系统的虚拟,多个容器共用主机的CPU、内存资源。操作系统的启动,需要调用很多资源,因而容器相比虚拟机不仅节约了资源,而且使应用的启动时间由分钟级变为秒级。
3.容器核心技术
容器技术两大核心要点:cgroup和namespace。
1)cgroup
容器相当于一个进程,cgroup(control group)的作用就是实现一组进程间物理资源的限制与隔离,是Linux内核提供的特性。这样就可以防止某些进程抢占CPU与内存资源。cgroup有多个子系统,对资源的具体管理是由这些子系统分工完成的。
2)namespace
namespace是对PID(进程ID)、IPC、Nerwork等系统资源进行隔离,将内核的全局资源做封装,使得每个namespace都有一份独立的资源,不同的进程在各自的namespace内对同一种资源的使用互不干扰。目前,Linux 内核实现了6种 Namespace。
4.Docker工作原理
Docker核心组件有:
客户端Client
服务器Docker daemon
镜像Image
镜像仓库registry
容器Container
Docker采用Client/Server架构,我们可通过一张图来理解下这些组件之间的关系:
1)Client
Docker Client最常用的是docker
命令行工具,通过这些命令我们可方便地在Host上构建和运行容器。常用的docker
命令如下: docker version
#显示Docker版本信息 docker info
#显示镜像和容器数 docker build
#使用 Dockerfile 创建镜像 docker images
#列出本地镜像 docker login
#登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub docker pull
#从镜像仓库中拉取或者更新指定镜像 docker push
#将本地的镜像上传到镜像仓库,要先登陆到镜像仓库 docker run
#创建一个新的容器并运行一个命令 docker exec
#在运行的容器中执行命令
除了docker
命令行工具,用户也可以通过REST API或socket与远程的服务器通信。
2)Docker daemon
Docker daemon是服务器组件,以Linux后台服务的方式运行,负责创建、运行、监控容器,构建、存储镜像。
3)Image
镜像是一个特殊的只读文件系统,包含应用程序及相关配置信息,用来创建容器。
镜像可包含操作系统、web服务器和应用。我们可以创建新的镜像,更新镜像,也可以从镜像仓库获取镜像。一个没有父镜像的镜像称之为基础镜像(base image),基础镜像是应用镜像的父镜像。
最常通过Dockerfile创建容器镜像:Dockerfile是一个文本格式的配置文件,由一系列命令和参数构建的脚本,用户可通过这个快速构建自定义镜像。每一条指令描述某层镜像需添加的配置、文件以及该如何构建等信息。
关于镜像的构成以及构建方法,我们将在接下来的文章中详细分享,这里大家先了解下概念。
4)Registry
镜像仓库是集中存储、分发镜像的服务,分为公有和私有。默认的Registry是Docker Hub(https://hub.docker.com/),私有更安全、快速些。
5)Container
容器是镜像运行时的实体,可以被创建、启动、停止、删除等。容器=镜像+可读层。
下面这张图可说明容器和镜像的关系:
6)Docker各组件协同工作原理
我们从运行容器的过程来对各个组件有更多的认识以及了解他们之间是如何协同工作的。
i)Docker客户端执行
docker run
命令;ii)Docker daemon发现本地没有hello-world镜像时,它便从Docker Hub下载镜像;
iii)下载的镜像hello-world被保存到本地;
iv)Docker daemon启动容器。
docker images | grep hello-world
可查看下载到本地的hello-world镜像:
docker ps -a
可看到控制台显示了hello-world镜像的容器信息,而docker ps
只能看到当前正在运行的容器:
小结
这一节和大家一起探讨了容器的产生背景,它与虚拟机相比的优势,以及容器技术给开发和运维人员带来的福利,最后也和大家分享了Docker的核心组件及工作原理,希望对大家初步认识容器有所帮助。
+
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33268.html