背??景随着云原生、容器化、微服务、k8s等技术的发展,容器Docker也开始流行起来,并逐渐被软件开发者在实践中使用。个人在自己接手的项目、参与的项目或技术交流中发现Docker已经变得非常流行。对于大多数开发者来说,Docker被广泛使用的主要原因可能是方便。提供了一套标准化的解决方案,大大提高了部署、发布和运维的效率。所以,如果你目前没有在你的项目中使用Docker,或者想了解更多关于Docker的知识,这篇文章值得一读。什么是码头工人?在谈Docker是什么之前,我们先来回顾一下传统产品开发上线的难点。一个产品从开发到上线,经历了开发环境、测试环境、生产环境等不同的操作系统、运行环境和应用配置。在项目管理中,还涉及不同版本、不同版本之间的兼容性等问题。这些问题对开发者和运维人员都是极大的考验,同时对各方的配合也有一定的要求。否则就会出现“这里的代码运行正常”这样的尴尬情况。Docker的出现就是为解决此类问题提供了一套标准的解决方案。DockerDocker的口号是“创建或配置一次,随处运行”。正如广告语所说,Docker的出现对于开发和运维人员来说是一大福音。基于Docker,可以轻松完成标准化的发布流程,无需担心不同环境带来的问题。其实Docker的使用可以理解为:软件是随环境一起安装的,也就是说安装的时候把原来的环境一模一样复制过来。这样也消除了不同机器运行结果不同的问题。那么,什么是Docker?Docker是一个开源的应用容器引擎,基于Go语言,遵守Apache2.0协议开源。它允许开发人员将应用程序和依赖项打包到一个轻量级、可移植的容器中,然后将其发布到任何流行的Linux机器上,并且还可以进行虚拟化。Docker可用于应用开发、应用交付、应用运行等场景。容器完全使用沙箱机制,它们之间不会有任何接口。更重要的是,容器的性能开销极低。Docker允许用户将基础设施中的应用程序分开,形成更小的局部容器,从而提高软件交付的速度。Docker从17.03版本开始分为CE(CommunityEdition:社区版)和EE(EnterpriseEdition:企业版)。通常,社区版可以满足大部分业务场景。Docker容器和虚拟机的区别Docker容器类似于虚拟机,但是它们之间有很大的区别。虚拟机是由软件模拟出来的,具有完整的硬件系统功能,运行在完全隔离的环境中的完整的计算机系统。创建虚拟机时,会使用物理机的部分硬盘和内存容量作为虚拟机的硬盘和内存。每个虚拟机都有独立的硬盘和操作系统,可以像物理机一样操作虚拟机。虚拟机消耗了大量的系统资源和开销,尤其是当多个虚拟机运行在同一台物理服务器上时,每个虚拟机都有自己的子操作系统,大量的精力和资源用于虚拟化部署和运行。容器类似于虚拟机,不同之处在于容器通常只包含必要的操作系统包和应用程序,而不是完整的操作系统,这就是它们轻量级的原因。可以生产Docker和虚拟机。传统的虚拟机是在宿主机的基础上,加入新的操作系统,导致虚拟机臃肿,不适合迁移。而Docker是直接存放在宿主机上,这样会完全避免大部分虚拟机带来的麻烦。Docker是一个黑盒进程。与传统进程不同,Docker可以独立创建自己的空间,这样Docker中的行为和变量就不会溢出到宿主机中。容器和虚拟机的区别:Docker能做什么?那么,在开发中使用Docker能给我们带来哪些便利呢?我们先来看一张图。使用Docker前后对比在没有使用Docker的时候,我们开发了一个项目,需要打包成war包或者jar包。然后在服务器上进行各种环境的安装、配置和应用维护,例如:JDK、Tomcat、数据库等。另外,以上配置需要在开发环境、测试服务器、生产服务器(通常有很多),工作量相当大。使用Docker后,我们可以创建一个空镜像从头开始构建,也可以使用公共仓库中已经构建好的镜像直接使用。当需要在不同环境部署时,可以直接使用构建好的镜像,一次构建,多个环境多次使用,方便快捷。Docker的6大优势与传统的运维发布方式相比,Docker有以下6大优势:1.更高效地利用系统资源:Docker对系统资源的利用率更高。由于容器不需要硬件虚拟化和运行完整操作系统等额外开销,无论是应用程序执行速度、内存损耗,还是文件存储速度,都比传统的虚拟机技术更高效。因此,与虚拟机技术相比,一台相同配置的主机往往可以运行更多的应用程序。2、更快的启动时间:“传统的虚拟机技术往往在分钟级启动应用服务,但由于Docker直接运行在宿主机内核上,不需要启动完整的操作系统,因此可以做到秒级甚至毫秒级.启动时间大大节省了开发、测试、部署的时间3.一致的运行环境开发中一个普遍的问题就是环境一致性,由于开发、测试和生产环境的不一致,导致一些bug无法解决在开发过程中,发现Docker镜像提供了除内核之外完整的运行环境,保证了应用运行环境的一致性,不会再出现“代码能在我机上运行,??它是不是我的错”。4.持续交付和部署对于开发和运维(DevOps)来说,最有希望的是创建或配置ure一次,在任何地方都可以正常运行。使用Docker,您可以通过自定义应用镜像实现持续集成、持续交付和部署。这部分的练习可以参考这篇文章《为了实现CI/CD,先来定制一个Docker镜像【实战精华篇】》。5.迁移更简单Docker保证了执行环境的一致性,让应用迁移更简单。Docker可以在很多平台上运行,无论是物理机、虚拟机,还是公有云、私有云,甚至笔记本,运行结果都是一致的。因此,用户不必担心由于运行环境的变化而导致应用程序无法正常运行的情况。6、更容易维护和扩展:“Docker使用分层存储和镜像技术,使得应用中重复的部分更容易复用,也让应用的维护和更新更容易。进一步扩展镜像也很简单以基础镜像为基础,另外Docker团队与各个开源项目团队一起维护了大量高质量的官网镜像,可以直接在生产环境中使用,也可以作为进一步定制化的基础,大大降低了应用服务的镜像制作成本Docker的基本概念在使用Docker的时候,我们需要掌握Docker中的一些核心组件和概念,我们来看一张Docker架构图:DockerArchitectureDiagramDocker的基本组件是image,container,andrepository.镜像(image)Docker镜像是一个只读模板,它是文件和元数据的集合。镜像是imp以层为基础,每一层都可以添加和删除文件,形成一个新的镜像。镜像可以理解为树状结构,每个镜像都依赖另一个镜像。这种依赖关系反映在Docker镜像创建的Dockerfile中的FROM命令中。需要注意的是:如果是树的根,则需要“FROMscratch”。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。容器(container)Docker使用容器来独立运行一个应用程序或一组应用程序。容器是使用图像创建的运行实例,它在图像的最后一层之上添加了另一层。容器的定义和图像的定义几乎一样,也是层层叠叠的统一视角。唯一的区别是容器的顶层是可读可写的。容器类比镜像:镜像负责存储和分发,容器负责运行。它们之间的关系可以类比Java中类和实例的关系。容器可以启动、启动、停止、删除。每个容器都是一个隔离且安全的平台。您可以将容器视为Linux环境及其中运行的应用程序的简化版本。存储库(repository)是图像文件集中存储的地方。有点类似于Maven/Git仓库。当我们需要图像文件时,我们可以从远程仓库中拉取它们。仓库和仓库注册服务器(Registry)是有区别的。仓库注册服务器上存储了多个仓库,每个仓库包含多个镜像,每个镜像有不同的标签(tag)。仓库分为公共仓库(Public)和私有仓库(Private)。目前最大的公共存储库是DockerHub。总结通过这篇文章,我向大家讲解了Docker的基本使用场景,相关概念,Docker能给我们带来什么,以及Docker的优势。想必通过这篇文章,你已经能够从整体上了解Docker的概况了。
