容器技术
- 享有虚拟机的好处,但抛弃了虚拟机的一些缺点,如:启动慢,占用内存大(一般为GB级别),这是因为虚拟机就是模拟一个操作系统,而操作系统本身是一个巨型的应用程序。
- 应用部署时一个重要的点就是隔离性,使其在运行时互不干扰。虚拟机通过操作系统层面进行隔离,而容器技术只隔离应用程序的运行时环境而可以共享同一个操作系统。
- docker就是容器技术的一种实现,它本身不是容器,而是创建容器的工具,是应用容器引擎。
特性 | 虚拟机 | 容器 |
---|---|---|
隔离级别 | 操作系统级 | 进程级 |
隔离策略 | Hypervisor | CGroups |
系统资源 | 5~15% | 0~5% |
启动时间 | 分钟级 | 秒级 |
镜像存储 | GB-TB | KB-MB |
集群规模 | 上百 | 上万 |
高可用策略 | 备份,容灾,迁移 | 弹性,负载,动态 |
Docker
- 官方文档的两句话很好的总结了docker的特性:
– Build, Ship And Run
– Build Once, Run AnyWhere
文档地址:docker官方文档
Docker引擎
- Docker Engine是一个客户端-服务器应用程序,具有以下主要组件:
① 长生命周期提供服务的守护进程
② REST API指定程序使用哪个接口与守护进程进行通信并指示其做什么
③ 命令行(CLI)客户端
- CLI使用Docker REST API通过脚本或直接的CLI命令来控制Docker守护进程或与之交互。
Docker架构
- docker采用client-server架构。Docker客户端与Docker守护进程通信,守护进程承担构建,运行和分发Docker容器的繁重工作。Docker客户端和守护进程通过UNIX套接字或通过网络接口REST API进行通信。
Docker守护进程(The Docker daemon)
- docker守护进程监听docker api请求并且管理如镜像,容器等docker对象。一个docker守护进程也可与其他的守护进程通信以便管理docker服务。
Docker客户端(The Docker client)
- docker客户端是用户唯一能与docker通信的方式,当你输入例如docker run命令时,客户端就会发送命令给docker守护进程。docker命令使用Docker API,一个docker客户端能与多个守护进程通信
Docker注册中心/docker仓库(The Docker registries)
- docker仓库存储docker镜像。而Docker Hub就是一个公共的存放大仓库,docker的配置默认从Docker Hub中拉取镜像,也可自定义私人仓库。
Docker镜像(The Docker IMAGES)
- 镜像是一个只读的模板,带有创建docker容器的指令。可以创建自己的images,也可以直接从docker仓库拉取镜像。要构建自己的镜像,你需要创建一个dockerfile,其中包含一个简单的语法,用于定义创建和运行镜像所需的步骤。Dockerfile中的每条指令都在镜像中创建一个层面(layer)。当你改变Dockerfile并重建镜像时,只有那些变动的层面才会被重建。与其他虚拟化技术相比,这也是docker镜像如此轻巧,快速的原因之一。
Docker容器(The Docker Contains)
- 容器就是一个镜像的运行实例。你可以通过Docker API或者CLI创建,启动,停止或删除一个容器。默认情况下,容器与其他容器相隔离。你可以控制容器的网络,存储或其他底层子系统与其他容器或主机之间的隔离程度。
当运行docker run -i -t ubuntu /bin/bash命令时,docker的运作情况:
- 如果本地没有ubuntu镜像,Docker会从你配置的仓库拉取,就像你已经手动运行docker pull ubuntu命令。
- Docker创建一个新容器,就像你已经手动运行了docker container create命令。
- Docker分配一个读写文件系统给容器,作为它的最后一层面(layer),这允许运行中的容器在其本地文件系统中创建或修改文件和目录。
- 在没有指定任何网络选项的情况下,Docker创建一个网络接口来连接容器到默认网络。这包括为容器分配一个IP地址,默认情况下,容器可以使用主机的网络连接到外部网络。
- Docker启动容器并且执行==/bin/bash==。由于容器以交互方式允许并附加到终端(-i和-t),所以您可以在输出记录到终端的同时使用键盘提供输入。
- 当你键入exit去终止==/bin/bash==命令,容器停止运行,但不会被移除。
Docker底层技术
- Docker由Go语言编写,它利用了Linux内核的一些特性来实现它的功能
命名空间
- Docker使用一种称为命名空间的技术来提供称为容器的隔离工作空间。)当你运行一个容器时,Docker会为这个容器创建一组命名空间。每个容器的访问权限仅限于其所在命名空间,以下是官方文档中Docker引擎在Linux上使用的命名空间:
- 此技术利用了Linux内核中的Linux Namespace。Linux Namespace机制是一种轻量级的虚拟化形式,更加精细的资源分配管理机制,提供一种资源隔离方案,也即是用来隔离内核资源的方式
Control groups
- cgroup 和 namespace 类似,也是将进程进行分组,但它的目的和 namespace 不一样,namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
- 一个cgroup限制一个应用到一个特定的资源集。cgroup允许Docker引擎向容器共享可用的硬件资源,并可选择性的执行限制和约束。例如,你可以限制特定容器的可用内存。
Union file systems
- Union文件系统(UnionFS)是一种通过创建层(layer)来运行的文件系统,使它们非常轻巧和快速。Docker引擎使用UnionFS来提供容器的构建块。Docker引擎可以使用多个UnionFS变体,包括AUFS、btrfs、vfs和DeviceMapper。