本文作为Docker基础系列的第一篇,将对三个问题进行阐述和解析:什么是Docker?为什么要使用Docker?如何快速掌握Docker技术?本系列文章中Docker的使用演示是基于CentOS7的,假设读者已经掌握了Linux的初步知识。如果你不熟悉Linux最基本的常用命令和操作,请参考我之前写的Linux系列教程。.1、什么是Docker?用一句简单的话来概括:Docker是一种容器虚拟化技术。要理解Docker为什么会出现,它解决了什么样的问题,有必要回顾一下虚拟化技术和Docker的发展历程。1.1虚拟化技术及分类ps:相信如果你安装或使用过VMware虚拟机,可能都遇到过虚拟化技术的问题。在我的Linux入门系列《Linux入门系列1--环境准备与Linux安装》3.2.1中提到,你可能会遇到“ThishostisuptoInterlVT-x,butInterlVT-xisinDisabledstate"这个问题,如果你想在VMware中安装Linux,你需要在BIOS中启用虚拟化支持。虚拟化技术是一个笼统的概念,不同的领域可能会有不同的理解。在计算机领域,通常指计算虚拟化或服务器虚拟化。其核心是对资源进行抽象,目的是在同一台主机上同时运行多个系统或软件应用程序,从而提高服务器系统资源的利用率。效率,降低成本,并促进应用程序生命周期的管理。虚拟化技术的分类一般分为两类:基于硬件的虚拟化和基于软件的虚拟化。真正意义上的基于硬件的虚拟化并不多见,而基于软件的虚拟化从对象层面又可以分为应用虚拟化和平台虚拟化。应用虚拟化一般是指通过软件模拟设备,而我们通常所说的虚拟化技术在大多数情况下是指平台虚拟化技术。平台虚拟化可以细分为以下几类:完全虚拟化的虚拟机模拟底层硬件环境和权限的执行过程,不需要修改客户操作系统。例如:VirtualBox,VMwareWorkstation硬件辅助虚拟化利用硬件,主要是CPU,辅助处理敏感指令,实现全虚拟化,客户操作系统无需修改。目前在86架构上可用的硬件辅助虚拟化技术有Intel-VT和AMD-V。例如:VMwareWorkstation、Xen、KVM的部分虚拟化只是虚拟化了部分硬件资源,需要修改客户操作系统。部分超虚拟化硬件接口以软件的形式提供给客户操作系统,需要对客户操作系统进行修改。操作系统级虚拟化内核通过创建多个虚拟操作系统实例(包括内核和库)来隔离不同的进程。我们通常所说的容器相关技术就属于这一类,而Docker就是这众多容器技术中的一种。如果要说Docker和虚拟化技术的关系,我想可以概括为:虚拟化技术发展之后,从传统的硬件层面实现虚拟化的方式,逐渐演变为如今流行的基于容器的方式。在操作系统层面。方式。Docker作为容器化技术的领导者脱颖而出。1.2Docker的前世今生Docker是一个基于Go语言的开源容器项目。Docker项目加入了Linux基金会,遵循Apache协议。所有开源代码都维护在https://github.com/docker项目仓库。正如官网所述,Docker的理念是“BuildShipandRunAnyApp,Anywhere”,即通过对应用程序的打包(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime),简单来说就是一次打包,到处运行。目前各大主流操作系统都支持Docker,包括Linux、Windows、MacOS等各大发行版,都可以安装使用。同时,各大云服务商如IBM、亚马逊、Azure等云平台均对Docker提供集成支持。那么为什么Docker发展如此迅速呢?正如Docker的创始人所说,Docker只是在正确的时间和正确的地点做了正确的事情。它的出现并非偶然。它实际上是在其前身LXC的基础上开发的。LXC(LinuxContainers)通常也被称为Linux容器技术。关于LXC的更多细节我就不说了。简单的说,LXC经过长期的发展,踩了很多坑,才被融入到主流Linux的内容中。这为Docker的诞生铺平了道路。Docker在LXC的基础上进一步优化了容器体验,使得容器化技术大行其道。例如,提供各种容器管理工具,实现应用分发、版本迁移等,让用户无需关注底层操作;同时,还引入了分层文件系统和高效的镜像机制,大大降低了迁移难度。早期的Docker直接基于LXC。在0.9版本之后,libcon-tainer项目被开发为更广泛的容器驱动实现,从而取代了LXC的实现。试图让容器的支持不再局限于Linux操作系统,而是更安全、更开放、更具扩展性。Docker基于Linux平台上的多项开源技术,提供高效、敏捷、轻量级的容器解决方案,支持部署到本地环境和各种主流云平台。可以说,Docker首次为应用程序的开发、运行和部署提供了“一站式”的实用解决方案。1.3Docker核心概念Docker包括三个核心概念:镜像、容器和仓库。基本功能都是围绕它们开发的,所以简单的印象就足够了。镜像可以简单理解为一个只读的模板或者一个应用及其环境的封装,通过它创建后续的容器。它类似于虚拟机映像。如果你有面向对象的编程经验,你也可以把它理解为一个实体类(Class)。容器简单理解为沙箱,用来运行和隔离我们开发的应用。你可以把它理解为一个正在运行的虚拟机,也可以理解为一个通过实体类Clss创建的对象。镜像是静态的,容器是动态的。Warehouse仓库是图像整合和存储的地方。Docker仓库类似于代码仓库。如果你有使用Git和Maven的经验,就很容易理解。官方仓库是DockerHub,但是有时候国外的网速不太理想。因此,阿里云、网易云等国内云厂商也提供本地镜像仓库源。当然你也可以搭建自己的私有仓库。2、为什么要用Docker要搞清楚我们为什么要用Docker,我们先来看看Docker能做什么?2.1Docker的快速部署和分发就像Docker的理念宣言:一次打包,到处运行。因为Docker镜像就是把我们开发的应用和它需要运行的环境打包在一起,它带来的好处是非常明显的,尤其是快速部署和分发的能力。举个简单的例子,假设我们开发了某个软件并部署在了某个服务器上,但是由于种种原因,我们想将该软件部署到另一个服务器上。我们通常需要做什么?我们需要登录新的服务器,按照之前的方法重复部署运行环境,然后运行观察结果,担心环境变化带来的未知影响。那么如果你使用Docker呢?我们只需要下载相应的镜像并运行即可。快速且无忧。还记得之前系列文章中的LNMP环境搭建吗?《Linux入门系列20--Web服务之LNMP架构实战》,是不是感觉很麻烦?这个过程至少需要半个小时。如果我们切换到Docker进行部署,可以在几分钟内完成。下面的文章将演示使用Docker部署LNMP。到时候会有很直观的对比。我相信你会爱上Docker。2.2Docker在开发运维方面的优势DevOpsDocker可以一次打包,到处运行。由于环境已经包含在镜像中,所以不会出现开发者可以在本地开发运行,但是交给运维人员运行时就会出现问题。同时使迁移、扩容和更新管理变得更加容易,大大减少了重复劳动,有效解放了运维人员。2.3Docker与虚拟机的比较容器化技术在性能上优于虚拟机。Docker容器除了运行其中的应用程序外,基本不消耗额外的系统资源,在保证应用程序性能的同时最大限度地降低了系统开销。在传统的虚拟机模式下,需要启用N个虚拟机来运行N个不同的应用程序。每个虚拟机都需要分配独享的内存、磁盘等资源,而Docker只需要启动N个容器,将应用程序放入容器即可。能。它的启动速度、性能、内存消耗和迁移都优于虚拟机。2.4Docker在微服务中的应用微服务架构是当前软件开发领域的热门技术之一。如果你是开发者或者了解开发技术,相信你一定听说过单体应用和微服务这两个名词。在软件架构的演化过程中,一个归档包(如war包)用来包含所有应用程序的功能。比如在一个web系统中,所有的功能模块都放在一起,通常被称为单体应用。虽然可以在项目内进行模块化开发,但是所有的业务功能都集中在一个项目中,复杂度高,部署麻烦,可靠性差。例如,如果只修改了一个小功能,则必须重新部署;一小部分的问题也会导致整个系统的问题。为了解决这些情况,创建了微服务架构。如果是Java开发,主要是指SpringBoot和SpringCloud技术栈。微服务需要功能拆分,业务单一,将复杂的系统拆分成小而可靠的模块。这样虽然有很多好处,但是也增加了运维和管理的难度。虽然微服务架构容器很多,管理起来有点麻烦,但是Docker可以很好的管理和弹性扩展每一个容器,所以经常使用SpringBoot+SpringCloud+Docker的微服务架构模型。2.5Docker在大数据中的应用在传统的大数据架构中,通常会部署Hadoop、Hbase、Kafka、Zookeeper、Flink、Spark等集群。如果手动管理或者使用脚本管理,效率很低,在弹性扩容、缩容、迁移的情况下,需要做一些额外的工作来控制,而如果使用Docker来管理和容器化部署,这一切都会变得容易。这部分演示会在大数据相关知识分享后进行对比,敬请期待。2.6Docker在各大企业的应用案例Docker容器技术在各大企业得到充分验证,如:京东618、美团点评、腾讯、新浪、蘑菇街等Docker在京东618的应用2016年,京东弹性云团队从1万Docker到15万,从测试部分应用到承接所有流量,都通过了618的严苛考验。Docker在美团点评的应用2015年,美团云团队开始测试Docker容器集群管理平台。多个业务单元提供容器计算服务,承载上百个在线业务,业务类型涵盖Web、数据库、缓存、消息队列等Docker在腾讯的应用腾讯于2014年10月正式推出Docker,其基于Yarn的调度平台代号Gaia兼容Docker和非Docker应用程序。其上层服务包括离线、实时和在线服务,如HadoopMR、Spark、Storm、Hive以及腾讯内部的Lhotse、Hermes、广电通等服务。Docker在新浪微博的应用新浪微博的DCP是基于Docker的混合云架构。2014年,Docker容器化落地。2015年实现私有云+混合云、动态调度。2016年,从容应对。十亿级PV,千亿级数据,2000多台服务器规模,20多个大小服务模块,百亿级数据Hbase存储,千余个Docker混合云集群。Docker在蘑菇街的应用蘑菇街私有云项目于2014年圣诞期间上线,将应用拆分成一个个的微服务,实现基于PaaS应用的部署和发布。经过几次双11大促,逐渐形成了一定的规模。3.如何使用Docker3.1相关网站的官网https://www.docker.com/从官网可以看到Docker分为社区版(CE)和企业版(EE)。通常,您可以使用社区版。Docker在线实战https://labs.play-with-docker.com/本网站是Docker船长几天开发的一款浏览器产品,帮助大家学习Docker,play-with-docker,俗称PWD,它是一个Docker游乐场。它允许用户在几秒钟内在浏览器中体验一个免费的AlpineLinux虚拟机,运行Docker命令,构建和运行Docker容器,甚至可以在DockerSwarm模式下创建集群。除了drillfield,PWD还包括来自多个Docker实验室的示例和测试。如果你只是想快速体验Docker,甚至不需要使用本地安装环境也可以立即体验。注册账号或直接使用DockerHub账号登录即可进入体验。3.2Docker安装上面说了它支持Linux、Windows、MacOS等,但是我们生产环境一般使用Linux,所以本文将演示Centos7下Docker的安装和使用。Docker的安装也很简单,按照官网的说明即可。官网介绍了三种安装方式:rpm、yum、script。接下来使用YUM安装。3.2.1准备虚拟机并配置IP地址。同时,为了减少干扰,关闭防火墙和SELinux。如果你的系统比较老,需要更新yum,这一步就没有必要了。[root@docker~]#yumupdate-y3.2.2安装必要的包[root@docker~]#yuminstall-yyum-utils\device-mapper-persistent-data\lvm2...省略部分输出完成![root@docker~]#3.2.3设置仓库[root@docker~]#yum-config-manager--add-repohttps://download.docker.com/l......省略一些输出内容repo保存到/etc/yum.repos.d/docker-ce.repo[root@docker~]#这里直接使用官方仓库https://download.docker.com/linux/centos/docker-ce。repo,如果你网速慢,也可以换成国内的仓库,比如阿里云。3.2.4安装Docker[root@docker~]#yuminstalldocker-ce...省略部分输出内容完成![root@docker~]#安装过程中按三次y确认。这个过程与网速有关,一般需要10多分钟才能完成安装。由于该命令没有具体的版本号,默认的tag是latest,所以不同时间执行的版本可能不同。生产环境建议带上指定的版本号。3.2.5启动Docker安装完成后,Docker并没有启动,需要先启动Docker,设置为开机启动。可以通过systemctlstatusdocker查看Docker的状态。[root@docker~]#systemctlstartdocker[root@docker~]#systemctlenabledocker创建了从/etc/systemd/system/multi-user.target.wants/docker.service到/usr/lib/systemd/system的符号链接/docker.service.[root@docker~]#systemctlstatusdockerdocker.service-DockerApplicationContainerEngineLoaded:loaded(/usr/lib/systemd/system/docker.service;enabled;vendorpreset:disabled)活动:活跃(运行)自周三2020-02-2621:39:22CST;1min30sagoDocs:https://docs.docker.comMainPID:57003(dockerd)CGroup:/system.slice/docker.service..省略部分内容可以看到处于运行状态.至此,docker已经安装并启动成功。3.2.6查看版本和Docker信息查看版本信息[root@docker~]#docker-vDockerversion19.03.6,build369ce74a3c查看docker安装信息[root@docker~]#dockerinfo...省略部分内容DockerRootdir:/var/lib/docker...如果省略一些内容,可以看到默认的安装路径是/var/lib/docker。3.3运行第一个容器HelloWorld3.3.1创建第一个容器我们通过DockerHub官方提供的现成的hello-world镜像来创建一个容器。要创建容器,请使用dockerrun命令。容器的作用是创建并启动输出单词helloworld。[root@docker~]#dockerrunhello-worldUnabletofindimage'hello-world:latest'locallylatest:Pullingfromlibrary/hello-world1b930d010525:PullcompleteDigest:sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b75图像下载状态world:latest来自Docker的问候!此消息表明您的安装似乎工作正常。为了生成这条消息,Docker采取了以下步骤:Docker客户端联系Docker守护进程。Docker守护进程从DockerHub中拉取“hello-world”图像。(amd64)Docker守护进程从该图像创建了一个新容器,它运行生成您当前正在阅读的输出的可执行文件。Docker守护进程将该输出流式传输到Docker客户端,后者将其发送到您的终端。要尝试更雄心勃勃的事情,您可以使用以下命令运行Ubuntu容器:$dockerrun-itubuntubash共享图像、自动化工作流程等e和免费的DockerID:https://hub.docker.com/更多示例和想法,请访问:https://docs.docker.com/get-s...[root@docker~]#可以看到容器已经运行成功并输出hellofromdocker!此时使用dockerimages命令查看本地镜像。可以看到一个名为hello-freedocker的镜像~】#3.3.2hello-world容器原理分析运行一个容器其实就是运行容器内部的程序,就像我们平时做helloworld程序一样,需要用到java或者其他开发语言,然后打包成jar文件,然后通过java命令执行。每次需要运行程序时,都需要手动执行命令。在docker中,我们将helloworld对应的jar包打包到容器中。你只需要运行容器,程序就可以立即执行。是不是很方便?我们来分析一下hello-world容器运行的原理:首先我们看到类似“Unabletofindimage'hello-world:latest'locally”的提示,说明本地没有这个hello-world镜像,会自动从DockerHub仓库下载镜像,然后创建容器,在容器中运行helloworld程序。这个过程是自动化的。而启动的容器其实就相当于一个小型的linux系统,只是启动的速度非常快,几秒就启动并运行起来,这也正是和前面说的虚拟机相比的优势所在。至于为什么这么快?这个容器里到底是什么?可以执行哪些docker命令?您将在后续文章中找到答案。这样,Docker环境就准备好了。在下一篇文章中,我们将正式演示Docker中各种命令的使用。
