[ Docker ] 基础概念

目录
- 什么是容器
- 虚拟化和容器技术
- docker 的基本概念java

1. 什么是容器

容器英文:Container,容器是一种基础工具;泛指任何能够用于容纳其余物品的工具,能够部分或者彻底封闭,被用于容纳、储存、运输物品;物体能够被放置在容器中,而容器则能够保护内容物体。linux

好比,一般用的带杯盖的水杯,就是一个容器,它的用途是装水,更确切的解释就是将水约束起来,当盖上杯盖后,就算水杯里的水翻江倒海,也不会溢出水杯外。这里的水杯就是容器,而水则是程序的进程,容器就是将进程约束起来,就算进程异常或者被劫持也不会影响到系统中其余进程的运行,这就是容器的做用。docker

 

2. 虚拟化和容器技术

经过上面定义的解释,不难发现容器技术和虚拟化很相似。所以,你们常常将这二者作比较。tomcat

 

经过上图,虚拟化技术中每一个虚拟机都会有一层GuestOS ,而在容器技术中,则是抽离了 GuestOS安全

 

回归到具体的应用中,当须要部署一个 java 程序时,服务器

 

传统虚拟化的作法:网络

  建立一台虚拟机,安装操做系统,而后部署 tomcat ,部署程序,启动。架构

容器技术的作法:负载均衡

  拉取镜像,关联相关程序,启动。工具

 能够发现,容器简化了程序的部署运行过程。那 容器 和 虚拟化 的具体区别是什么呢,虚拟化是在底层模拟出各类硬件,CPU,硬盘之类的,而容器 是在软件层面给资源分组。容器无限接近原生,由于容器用的就是主机系统的进程。

 

传统的虚拟机如 VMware、KVM 之类的须要模拟整台机器包括硬件,每台虚拟机都须要有本身的操做系统,虚拟机一旦被开启,预分配给它的资源将所有被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操做系统。

而容器技术是和宿主机共享硬件资源及操做系统,能够实现资源的动态分配。容器包含应用和其全部的依赖包,可是与其余容器共享内核。容器在宿主机操做系统中,在用户空间以分离的进程运行。

 

容器的隔离技术源自 Linux 容器 LXC(linux container),而LXC 又是基于 cgroup 的 namespace,chroot等。

cgroup 对于容器相当重要,cgroup 全称为 control group ,是 Linux 内核提供的功能,简单来讲,它的做用就是把系统运行的进程按用户自定义的群组区分,也就是说一个容器,就是一个group。

cgroup 有限制使用资源的能力:

 

 

 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Linux 容器是 Linux 发展出的另外一种虚拟化技术,Linux 容器不是模拟一个完整的操做系统,而是对进程进行隔离,至关因而在正常进程的外面套了一个保护层。对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的隔离。

 

Docker 相比于传统虚拟化方式具备更多的优点:

docker 启动快速的属于秒级别,虚拟机一般须要几分钟去启动,更重要的是,虚拟机须要一个独立的操做系统。

docker须要的资源更少,docker在操做系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于经过 Hypervisor 层与内核层的虚拟化

docker更轻量,docker的架构能够共用一个内核与共享应用程序库,所占内存极小。一样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率很是高

与虚拟机相比, docker 隔离性更弱, docker 属于进程之间的隔离,虚拟机可实现系统级别隔离

安全性: docker 的安全性也更弱。 Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提高为root权限,它就直接具有了宿主机的root权限,进而可进行无限制的操做。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,而且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术,这种隔离技术能够防止虚拟机突破和彼此交互,而容器至今尚未任何形式的硬件隔离,这使得容器容易受到攻击

可管理性: docker 的集中化管理工具还不算成熟。各类虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力

高可用和可恢复性: docker 对业务的高可用支持是经过快速从新部署实现的。虚拟化具有负载均衡,高可用,容错,迁移和数据保护等通过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性

快速建立、删除:虚拟化建立是分钟级别的, Docker 容器建立是秒级别的, Docker 的快速迭代性,决定了不管是开发、测试、部署均可以节约大量时间

交付、部署:虚拟机能够经过镜像实现环境交付的一致性,但镜像分发没法体系化。 Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署

 

从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优点所在:

 

 

 

3. Docker 的基本概念

Docker 的三个基本概念

 

 

 

从上图能够看到,Docker 中包括三个基本的概念:

  • Image(镜像)
  • Container(容器)
  • Repository(仓库)

镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。

 

Image(镜像)

Docker 镜像能够看做是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建以后也不会被改变。

 

 

从左边看到了多个只读层,它们重叠在一块儿。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker 内部的实现细节,而且可以在主机的文件系统上访问到。统一文件系统 (union file system) 技术可以将不一样的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。能够在图片的右边看到这个视角的形式。

 

Container(容器)

容器 (container) 的定义和镜像 (image) 几乎如出一辙,也是一堆层的统一视角,惟一区别在于容器的最上面那一层是可读可写的。

 

 

 因为容器的定义并无说起是否要运行容器,因此实际上,容器 = 镜像 + 读写层。

 

Repository (仓库)

Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,能够很容易的在当前宿主上运行,可是, 若是须要在其它服务器上使用这个镜像,咱们就须要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 相似,注册服务器能够理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中能够包含多个仓库 (Repository) ,每一个仓库能够包含多个标签 (Tag),每一个标签对应着一个镜像。因此说,镜像仓库是 Docker 用来集中存放镜像文件的地方相似于咱们以前经常使用的代码仓库。

一般,一个仓库会包含同一个软件不一样版本的镜像,而标签就经常使用于对应该软件的各个版本 。咱们能够经过<仓库名>:<标签>的格式来指定具体是这个软件哪一个版本的镜像。若是不给出标签,将以 latest 做为默认标签.。

仓库又能够分为两种形式:

  • public(公共仓库)
  • private(私有仓库)

Docker Registry 公有仓库是开放给用户使用、容许用户管理镜像的 Registry 服务。通常这类公开服务容许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

除了使用公开服务外,用户还能够在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry镜像,能够直接使用作为私有 Registry 服务。当用户建立了本身的镜像以后就可使用 push 命令将它上传到公有或者私有仓库,这样下次在另一台机器上使用这个镜像时候,只须要从仓库上 pull 下来就能够了。

 

把 Docker 的一些常见概念如 Image , Container , Repository 作了详细的阐述,也从传统虚拟化方式的角度阐述了 docker 的优点,从下图能够直观地看到 Docker 的架构:

 

 

Docker 使用 C/S 结构,即客户端/服务器体系结构。 Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。 Docker 客户端和服务端能够运行在一台机器上,也能够经过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通讯。

 

 

这张图展现了 Docker 客户端、服务端和 Docker 仓库(即 Docker Hub 和 Docker Cloud ),默认状况下Docker 会在 Docker 中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念相似于 Git ,固然这个仓库是能够经过修改配置来指定的,甚至能够建立本身的私有仓库。

相关文章
相关标签/搜索