(1):Welcome to Docker
前言¶
2022年3月底我开始正式的接触Docker这项技术,以往一直以为Docker是一项全新的虚拟技术,认为与我的生活和工作无关,因此也从未计划去了解和使用它。直到看到同事通过它快速地完成了一次服务部署,在以往我是需要花大量时间才能完成的工作,哪怕在运维上已经有丰富的经验也难以避免。而他只需要数分钟就能完成,这巨大的反差令我瞬间对Docker产生了非常浓厚的兴趣,便开始阅读书籍《Docker实战》、翻阅官网手册并加入Docker社区,在短暂的实战中切实的感受到了Docker带来的改变和便利,便想着在这里出个“Docker系列”地博客,跟大家一起分享Docker。如果你也感兴趣,那么请跟我一起进入到下面的Docker世界吧~
问题¶
如果你是一位开发者,你是否跟我一样有如下问题:
- 在部署各种服务器时浪费了大量的时间。
- 因为各种原因(比如服务器崩溃了、跟同事分享环境等)需要反复的部署相同的环境,可即便之前部署过了,但还是需要花大量的时间才能完成。
- 基于个人或工作目的想搭建一个完整的前后端环境,但碍于知识面不足等原因迟迟无法动手,即便最后完成了也需要耗费大量的精力,常常为此感到不值和困恼。
- 开发环境随着项目的增长而变得混乱臃肿,最坏的情况是项目间彼此间互不兼容。
如果你是一位在IT领域内的从业者,但并非研发,你是否有如下困恼:
- 期望使用开源的项目来服务自己的生活或工作,但碍于没有开发功底,无法自行部署,哪怕网上有教程,也被各种复杂的命令,以及过程中遇到的各种意外而放弃。
- 由于工作原因,比如运维、测试和技术支持等,需要部署一些服务去完成工作任务或则提高工作效率,但部署服务往往较为困难,且过程复杂,需要投入较大的精力。最后好不容易部署完了,却仍旧需要投入大量精力去维护。最后好不容易部署好的环境,也很难进行移植和分享。
如果你是一位领导或则软件及服务的直接受益者,你是否有如下担忧:
- 想尝试或则使用一款新的Linux软件,但是担心运行起来的程序带有恶意代码,进而导致资产受到威胁。
- 希望开发的服务可以在各部门或产线间复用,并以一种可编排的形式复用。
那么恭喜你,Docker将为你解决如上问题、困恼和担忧。同时,Docker有如下优点:
- 服务编排:以服务为单元按需按序编排,提高服务的复用率,进而快速孵化产品。
- 程序与系统解耦:由于Docker将操作系统与程序解耦,从根本上解决了移植问题。
- 网络和资源隔离:网络和资源的隔离,可以有效的保护运行程序的设备,降低资产的受威胁面积。
- 丰富的docker仓库:Docker Hub
- 详细的手册:Docker Docs
- 大型社区:Docker Community
什么是Docker?¶
Docker是一个“docker(命令行程序)”、“dockerd(提供docker服务的守护进程)”、“Registry(存放镜像的仓库)”的一个集合,它简化了安装、运行、发布、删除、移植和管理软件的过程,解决了在传统过程中会出现的很多问题。
同时也提供了一种高效编排服务的方法。而其直接使用的技术是现存的UNIX技术“容器”,因此Docker本身并不引入新的技术,它是一个竖立于技术之上的一种抽象的服务,是基于开发需求而诞生的一种“平台服务”。
docker运行在Linux中的示例图
Docker不是虚拟化¶
在没有Docker的时代中,商家和开发们普遍使用的是虚拟机(硬件虚拟化),以提供隔离的需求,比如常用的“VMWare”、“VirtualBox”等。虚拟机提供虚拟的硬件,可直接安装操作系统,但它们花费的时间也较长,通常以分钟来计算。除了时间开销外,还伴随着大量的资源开销,因为它们除了运行你需要的软件外,还需要支撑系统的运行。
而Docker则不同,它不提供硬件虚拟化技术。如上图所示,Docker中的容器与Kernel(操作系统)之间是没有额外的中间层的,它们可以直接与操作系统打交道。而之所以能如此,是因为它使用的是2007年就已经成为Linux一部分的“namespace”和“cgroups”技术。因此,Docker本身并不提供容器技术,但它使容器的使用更加简单了。
Docker隔离¶
Docker构建的容器有如下8方面的隔离:
- PID命名空间 —— 进程ID
- UTS命令空间 —— 主机名和域名
- MNT命令空间 —— 文件系统访问和结构
- IPC命令空间 —— 基于共享内存的进程间通信
- NET命名空间 —— 网络访问和结构
- USR命名空间 —— 用户名和标识
- chroot() —— 控制文件系统根目录的位置
- cgroups —— 资源保护
Docker镜像¶
镜像是容器要运行的资源集合。容器如同集装箱一样,而镜像则是集装箱里面装着的物资,因为集装箱之间是相互隔离的,因此相同内容的物资可以放在多个集装箱中,即通过一个镜像可以产生N个容器,且不必担心他们之间产生冲突。
我们通常在Registry仓库中下载的内容就是镜像。因此,再Docker中镜像是分发的单元,我们通过将自己的程序或文件打包成镜像,并发布到仓库中,最终由仓库分发此镜像给需要的(授权的)用户。
以打包一个Nginx镜像为例,如下所示:
打包Nginx镜像并分发示例图
什么时候使用Docker?¶
鉴于上面所述,Docker可以随时随地的使用,尤其现在Docker已经支持主流的操作系统,如:Windows、OS X、Linux。在Windows和OS X更是提供了桌面版,让大家操作镜像跟在应用商店操作软件一样简单和方便,可以快速的添加和删除一个镜像以及启停一个容器。
毫不避讳的说,我最近的博客网站就是用Docker快速搭建的,除去对博客软件的学习时间整个搭建过程也就不到3分钟。
结语¶
容器虽然能够提供一定的保护,预防许多类型的攻击,但并不是安全问题的总解决方案,你不应使用不受信任来源的镜像。也不应当随便的将非完全可控的的容器运行在相互协作的环境中。
如果你觉得有帮助或则喜欢的话可以留言,在更新内容后我会第一时间通知您。