🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea
Docker 是什么?
Docker 是一种开源软件平台,它的构想理念是「Build and Ship any Application Anywhere」,意即让开发者在虚拟环境中,开发、部署和管理任的何应用程序。 Docker 的轻量化特性,提供应用程序独立的测试环境。 让用户只需专注于应用程序的开发,为他们省下建置环境的时间与精力。
为什么要使用 Docker
(一)在主机上快速部署
由于 Docker 容器具有跨平台便携性,并且共享操作系统中的资源,它相较虚拟机更为轻量。 在相同资源下,能执行容器数大约是虚拟机的5到10倍,能够提高开发者的工作效率并节省资金。
此外,使用EDB提供的PostgreSQL Docker image,您可以快速地在开发、测试和生产环境中部署PostgreSQL数据库,而不需要担心环境配置和兼容性问题。 EDB 的 PostgreSQL Docker image 也针对 Docker 环境进行了优化,可以提供更高的性能和可靠性。
(二)版本控管和对象重复使用
Docker 让用户能够储存不同的版本的历史纪录,用户能够依照自己的喜好回滚(Roll Back)至最合适的版本。 开发人员只需将环境设定好,就能使用先前保存好的容器,达到重复使用的目的。
此外,使用 HashiCorp Vault 可以安全地管理 Docker image 中的 secrets 和配置信息。 Vault 可以将这些敏感信息加密存储,并提供安全的访问控制,确保只有授权的用户和应用程序才能访问这些信息,避免 secrets 泄露的风险,同时也能方便地重复使用这些安全的映像文件(Image)。
(三)更有效率的 CI/CD 流程
Docker 帮助开发人员在任何环境下测试代码,协助他们在应用程序开发初期就能找出错误。 利用 Docker 易与其他工具整合的优势,开发人员能将 GitHub 和 Jenkins 整合至 Docker 中。 只需将代码交付至 Github,再由 Jenkins 进行自动化布署,就能够快速地建立映像文件(Image)。 开发者还能将映像文件上传至 Docker Hub 来解决不同版本间环境不兼容的问题。 Docker 能够简化开发部署流程、减少环境建置的时间,以及让开发人员同时执行多个测试。
此外,在CI/CD流程中,可以使用ELK Stack来收集和分析Docker容器的日志和事件,例如建置日志、测试结果、部署状态等。 这些信息可以帮助开发人员快速识别和解决问题,并追踪应用程序的交付过程。 ELK Stack 的 dashboards 和可视化功能可以提供 CI/CD 流程的清晰概览,帮助团队更好地监控和管理整个流程。
开发人员让 Docker 融入 CI 流程的一种方式是,开发者在建立完应用程序后,通过 CI 服务器建立 Docker 映像文件(Image),再将应用装入映像文件,最后再上传到 Docker Hub。 开发者能够在另一台主机上,不论是在QA、DEV或正式环境,从Docker Hub上接入映像文件并运行容器,在CI服务器中,开发者甚至能在创建映像文件的过程中,完成编辑和测试。
虚拟化技术是什么?
在认识 Docker 前,我们必须先了解何谓虚拟化? 简而言之,虚拟化技术想解决的核心问题是,不同电脑的操作系统与硬件资源配置不兼容。 举例来说,今天我开发了一款应用程序,经测试后,它能够在我的地端环境中正常运行,但如果我想将它安装至其他环境或部署至云端。 我就必须建置相同的环境,和配置相同硬件资源,例如:服务器、CPU、数据库、扩充程序等等。
然而,这种「例行公事」往往需要耗费大量时间,而且没人能保证你的程序在新环境中能够正常运作。 因为不同环境使用的操作系统不尽相同,即便同样使用 Linux,不同版本间也存在着些微的差异。 而虚拟技术的问世就是为了解决这种「明明在我的环境中能运作,但搬到其他地方就坏掉」的问题。
目前常见的虚拟技术有两种,一种是以处理操作系统为单位的虚拟化技术,我们将它称之为虚拟机(Virtual Machine),著名的代表有 VMware; 另一种是以 APP 为单位的虚拟化技术,我们将它称为容器化(Containerize),著名的代表有 Docker Container。 下文将为各位分别介绍这两种技术
虚拟机(VM)
VM 是一种体积庞大且耗能高的软件套件。 VM 会模拟底层的主机资源(CPU、RAM、Storage),将资源分配给上层的应用程序使用。 在 VM 的架构中有一层名为 Hypervisor 的平台。 这种平台被用于管理硬件资源的使用和分配。 简单来说,Hypervisor 让用户能够在操作系统上(Host OS)增加另一个操作系统(Guest OS),并且让这两种操作系统相互协作。 每个 VM 包含操作系统、应用程序、必要的二进制文件和系统库的完整副本-容量大约为 10 GB,因此 VM 启动的时间会较为缓慢。
容器化(Containerize)
容器化是一种在概念上相似于虚拟机,但在原理上略有不同的技术,其主要目的在于提供开发者用于测试应用程序的沙盒环境。 开发者将想测试的应用程序与 Dependency(相依性资源)封装于容器进行测试。 容器化与 VM 的相异之处在于,由于容器不会模拟系统底层的基础架构,因此需耗费的资源也相对较低。 开发者能够在容器内配置不同的资源,因为每个容器都独立运行且彼此之间不会互相影响。
译注: Dependency(相依性资源): Dependency (相依性资源)在这边泛指 system libraries(系统函式库)、External Third-Party Code Package(第三方代码套件)。
容器(Container)VS 虛擬機(VM)
雖然容器和虛擬機具有類似的功能及優勢,但其實它們被用於處理不同面向的問題,VM 的主要功能是作業系統的虛擬化,容器主要的功能是虛擬化操作系統,因此容器相較於 VM 更容易攜帶,也更高效。
以下表格為容器與虛擬機的對比
功能 | Virtual Machine | Docker Container |
虛擬化的目標 | 作業系統 | 應用系統 |
啟動時間 | 久(幾分鐘) | 短(幾秒) |
容量 | GB | MB |
耗費資源 | 較多 | 較少 |
複製相同環境 | 慢 | 快 |
服務內容 | 大型專案服務 | 多使用於微服務中 |
组成 Docker 的重要元素
在了解虚拟技术的基本观念后,我们将在这段剖析构成Docker的重要元素,让大家对Docker元素间的工作流程有更全面的了解。
Dockerfile
开发人员在使用 Docker 时发现,大多现成的 Docker 映像文件无法满足他们的需求,因此需要一种能够生成映像档的工具。 Dockerfile 是一种简易的文件文件,里面包含了建立新映像文件所需的指令。
Dockerfile 语法主要由 Command(命令)和 Argument (参数选择)两大元素组成。 以下是一个简易的 Docker file 示意图:
命令式语法+选择参数(Command + Argument)
以这张图来说 From 是命令式,而 nginx 是选择参数
Image (映像文件)
Docker 映像文件是创建容器的模板,我们能将它想象为一种虚拟机快照(snapshot),映像文件包含了开发者需要部署的应用程序、操作系统和编译环境。 开发者能透过映像文件建置不同的容器,在容器中,每个应用程序都是独立运行的,彼此互不影响。
Container (容器)
容器是映像文件建立出来的实例(Instance),我们能将它比喻为一个轻量级的沙盒,Docker 利用容器运行和隔离应用程序,能够在容器中将应用程序启动、开始、停止、删除。 由于映像文件是唯读(Read Only)的模板,因此容器在运行后映像文件的上层会增加一个能够修改的读写层(Read and Write),而映像档本身则不变。
Repository(仓库)
Repository 是储存映像档的地方,用户可以将自己完成的映像文件上传至仓库上储存,仓库上也有许多现成的映像文件供用户存取,仓储的种类被分为公开与私人两种,目前官方最大的公开仓库是 Docker Hub。 在上面储存了超过 15,000 个映像文件供用户下载。
Docker 的运作流程
步骤一、撰写 Dockerfile,步骤二、将 Dockerfile 建立为 Image,步骤三、将 Image 运行为容器。 透过这三个简单的步骤,就能创建自己的 Docker 容器啰!