美文网首页
Docker基础

Docker基础

作者: 唯爱熊 | 来源:发表于2020-01-07 19:24 被阅读0次

什么是docker

Docker 最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并与2013年3月以Apache 2.0授权协议开源),主要项目代码在GitHub上进行维护。Docker项目后来还加入了Linux基金会,并成立推动开放容器联盟。

Docker 自开源后受到广泛的关注和讨论,至今其GitHub项目已经超过3万6千个星际和一万多个fork。甚至由于Docker项目的火爆,在2013年底,dotCloud公司决定改名为Docker。Docker最初在Ubuntu12.04上开发实现的;Redhat则从RHEL6.5开始对Docker进行支持;Google也在其PaaS产品中广泛应用Docker。Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于LXC,从0.7以后开始去除LXC,转而使用自行开发的libcontainer,从1.11开始,则进一步演进为使用runC和containerd。

Docker 的基本概念

Docker 容器是资源分割和调度的基本单位,封装整个服务的运行时环境,用于构建、发布和运行发布式应用的一个框架。它是一个跨平台,可移植并且简单易用的容器解决方案。

Docker 容器可以快速自动化地部署应用,并通过操作系统内核技术(namespaces、cgroups等)为容器提供资源隔离与安全保障。Docker 作为轻量级的虚拟化方式,实现了PaaS平台高效部署、运行和维护。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等待,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便,快捷。

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。(优点:支持多种操作系统,除了linux,还支持windows,uninx、solaris等)
  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟化。因此容器要比传统虚拟机更为轻便。(缺点:只能运行在linux系统上,需要linux内核。)



为什么要使用Docker?

  • 更高效的利用系统资源
      由于容器不需要进行硬件虚拟化以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

  • 更快速的启动时间
      传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主机,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

  • 一致的运行环境
      开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。

  • 持续交付和部署
      对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous lntegration)系统持续进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。而使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

  • 更轻松的迁移
      由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  • 更轻松的维护和扩展
      Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本。

Docker对比传统虚拟机

docker三大核心概念

Docker虚拟化技术有三个基础概念:Docker镜像、Docker容器、Docker仓库,三个概念详解如下:

1)Docker镜像:

Docker虚拟化最基础的组件为镜像,镜像跟我们常见的Linux ISO镜像类似,但是Docker镜像是分层结构的,是由多个层级组成,每个层级分别存储各种软件实现某个功能,Docker镜像是静止的、只读的,不能对镜像进行写操作。

2)Docker容器:

Docker容器是Docker虚拟化的产物,也是最早在生产环境使用的对象,Docker容器的底层是Docker镜像,是基于镜像运行,并且在镜像最上层添加一层容器层之后的实体,容器层是可读、可写的,容器层如果需用到镜像层中的数据,可以通过JSON文件读取镜像层中的软件和数据,对整个容器进行修改,只能作用于容器层,不能直接对镜像层进行写操作。

3)Docker仓库:

Docker仓库是用于存放Docker镜像的地方,Docker仓库分为两类,分别是:公共仓库(Public)和私有仓库(Private),国内和国外有很多默认的公共仓库,对外开放、免费或者付费使用,企业测试环境和生产环境推荐自建私有仓库,私有仓库的特点:安全、可靠、稳定、高效,能够更加自身的业务体系进行灵活升级和管理。

Docker镜像原理剖析

完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统数据支撑。Docker镜像是分层结构的,是由多个层级组成,每个层级分别存储各种软件实现某个功能,Docker镜像作为Docker中最基本的概念,有以下几个特性:

1)镜像是分层的,每个镜像都由一个或多个镜像层组成;
2)可通过在某个镜像加上一定的镜像层得到新镜像;
3)通过编写Dockerfile或基于容器Commit实现镜像制作;
4)每个镜像层拥有唯一镜像ID,Docker引擎默认通过镜像ID来识别镜像;
5)镜像在存储和使用时,共享相同的镜像层,在PULL镜像时,已有的镜像层会自动跳过下载;
6)每个镜像层都是只读,即使启动成容器,也无法对其真正的修改,修改只会作用于最上层的容器层。

如图所示为一个完整的Docker容器系统,可以看出:

Docker容器是一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。基于每个镜像的Json文件,可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置什么样的环境变量,而Docker守护进程实现了从静态向动态的转变。

Docker虚拟化引也是一个C/S(Client/Server)结构的应用,如图所示:

该图为Docker虚拟化完整体系结构图,包括如下各个组件:

1)Docker Server是一个常驻进程;
2)REST API 实现了client和server间的交互协议;
3)Docker CLI 实现容器和镜像的管理,为用户提供统一的操作界面;
4)Images为容器提供了统一的软件、文件底层存储;
5)Container是Docker虚拟化的产物,直接作为生产使用;
6)Network为Docker容器提供完整网络通信;
7)Volume为Docker容器提供额外磁盘、文件存储对象。

Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信,架构如图所示:

如上图可以清晰的看出Docker虚拟化整个生态体系:

1)基于Docker Client客户端-Rest API-操作Docker Daemon;
2)Docker daemon部署至Docker宿主机(通常为硬件物理机);
3)基于Docker pull可以从Registry仓库获取各种镜像至Docker Host主机;
4)基于Docker run可以通过获取的镜像启动Docker Container(容器);
5)基于Docker build可以构建满足企业需求的各种Docker images(镜像);

Docker 8大应用场景

  • 简化配置

这是Docker公司宣传的 Docker 的主要使用场景。Docker 能将运行环境和配置放在代码中然后部署,同一个 Docker 的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

  • 代码流水线(Code Pipeline)管理

代码从开发者的机器到最终生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有微小的差别,Docker 给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

  • 提高开发效率

Docker 能提升开发者的开发效率。不同的开发环境中,Docker 都可以把两件事做好,一是可以在开发环境、生产环境之间直接迁移,二是可以让我们快速搭建开发环境。开发环境的机器通常内存比较小,之前使用虚拟机的时候,我们经常需要为开发环境的机器加内存,而使用Docker可以轻易的让几十个服务在Docker中跑起来。

  • 隔离应用

有很多原因会让我们选择在一个机器上运行不同的应用,Docker 非常适合在较低的成本下实现多种应用的隔离。

  • 整合服务器

Docker 隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker 可以比虚拟机提供更好的服务器整合解决方案。通常数据中心的服务器资源利用率只有30%,通过使用Docker 并进行有效的资源分配可以大幅度提高服务器资源的利用率。

  • 调适能力

Docker 提供了很多的工具,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。

  • 多租户环境

另外一个Docker 的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为物联网的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和高效的diff命令。

  • 快速部署

在虚拟机之前,购入部署新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker 通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正式Google和Facebook 都看重的特性。我们可以创建销毁Docker 容器而无需担心重新启动带来的开销。

相关文章

网友评论

      本文标题:Docker基础

      本文链接:https://www.haomeiwen.com/subject/qiddactx.html