1.认识下Docker

1.Docker为什么会火?

Docker能火起来,不仅仅与它开源有关系,一定是解决了我们软件从开发到上线的痛点,要不然几乎不可能。那Docker到底解决了什么问题?下面这几点,相信我们程序员都深有感触:

1. 解决环境不一致的问题

程序员经常说的一句话:"不可能有问题啊!我本地是好的啊!"。但是有时候线上确实是无法正常运行,可能经过很长时间的排错,最后发现某个第三方包或者运行时环境和本地不相同,并且这种排错是非常耗时的。

2.解决服务器繁多复杂的软件安装问题

我们拿一个普通的java-web项目来说,要部署这个项目,那我就需要jdk、tomcat、nginx、Mysql、redis等等软件中间件

  1. 部署一个节点运行,这时候我们至少需要两个环境:测试和生产环境。这时候我们就告诉运维,需要安装这些软件,并且还要告诉运维详细的版本。运维同学拿到需求后,首先部署一套测试环境,费劲巴拉的弄完,还需要再费劲巴拉的部署一套生产环境,好不容易弄完了,并且都是重复的工作;
  2. 假如这时候我需要扩容,部署一个集群,比如需要我的应用需要4个节点,这是运维同学就需要另外再至少部署三台的java运行环境;如果我的MySql需要主从,那么运维同学就需要再装一从库;假如我需要Redis做主从,运维同学还需要至少要搞个哨兵;
  3. 很多服务器上的软件安装也并不是特别容易,对于开发者来源,他可能没有这么强的能力搞定这些东西,那么就会对运维同学产生强依赖,导致离开运维之后,我们的软件就没法上线部署。

3.docker生逢其时

2013年Docker诞生之时,正值企业应用转向互联网应用高速发展时期,应用小型化微服务化的需求正好是其用武之地,也就是适应了今天流行面更广的微服务的一个方面---应用部署到容器中运行。这样就解决了服务拆分后快速上线部署,同时,在遇到大流量扩容方面,可以很容易就进行扩容,再也不需要再安装那么多软件,配置那么多环境,弄完还要调试等等繁琐的事情,达到了快速扩容,同时也保证了扩容时程序的稳定性(因为是同一个镜像,容器内的运行环境是一样的)

那么针对第一个问题,主要还是从开发者来说,如果我的程序能和它所依赖的环境一起打一个包交给运维,那么测试和生产部署就会更顺畅,因为任何地方运行我的程序都是一样的,因为环境都一样;

针对第二个问题,从运维角度来看,如果所有的这些重复安装的工作能省掉就行了,或者我安装一次,其他的直接复制就行(当然,运维肯定是有这种工具);

从开发者角度来看,要是这些软件能和我的软件一样,把环境和软件打一个包,我直接傻瓜式的一启动就安装好,那我是不是就不再强依赖运维了,开发者自己也能够部署项目了,省去了那些极其繁多复杂的软件安装问题。Docker 公司的口号:Build,Ship,and Run Any App,Anywhere

正式因为许许多多的开发者一直面临着这些问题,所以docker一开源,立马就收到了广大开发者的推崇,使得docker很快就大火,甚至可以说的又红又紫。所以docker能大火,由数以万计的程序员推动起来的。

2.Docker历史

2.1 Docker的发展史

2010年,几个搞IT的年轻人,在美国成立了一家公司,dotCloud。他们做的是 pass的云计算服务,其中他们用到了LXC(Linux Containers)有关的容器技术!

注意:LXC并不是docker公司的,而是linux原生支持的容器技术。

下面链接是LXC的基本介绍,可以看一下:https://blog.csdn.net/qq_44281591/article/details/132251767

他们这个东西并没有引起别人的重视,以至于自己的公司活下去都比较难了,所以在2013年,他们选择将自己容器化技术开源,起名为docker。Docker开源后,越来越多的人发现Docker的优点,Docker开始火了,每个月都会更新一个版本。2014.4.9,Docker1.0发布。所以,有时候开源是可以拯救一个公司的。

2.2 Docker的不同版本

最早的时候docker就是一个开源项目,主要由docker公司维护。2017年年初,docker公司将原先的docker项目改名为mobyhttps://github.com/moby/moby,并创建了docker-ce和docker-ee。

这三者的关系是:moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品。docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品;docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。moby project由社区维护,docker-ce project是docker公司维护,docker-ee是闭源的。使用免费的docker,从网页docker-ce上获取;要使用收费的docker,从网页docker-ee上获取。

3.容器化技术

到这里我们看到,其实容器化也可以算是虚拟化的一种,在之前包括现在,我们都还会使用虚拟机化技术,最常见的就是Vmware在我们自己的电脑上虚拟出多个主机来。用过虚拟机的同学可能知道,我只要配置好一台,做出一个镜像,其他虚拟主机的安装就好装了,直接克隆出来就行了,配置环境都是一样的,所以这么看,docker的容器化技术也没有比虚拟机来的更好。但事实真的是这样么?随着我们不断的使用和比较,我们发现,docker容器技术在我们开发运维过程中,确实比虚拟机技术好用太多了,甚至可以说是两种完全同的技术方案。

Docker容器化技术与虚拟机技术的不同:

3.1 虚拟机

我们常用的虚拟机是Vmware,使用的是windows电脑, 我想要模拟一台linux服务器, 方便部署应用, 在windows上安装了一台虚拟机,我就能够用有一台Linux的机器了。

  • 基础服务(Server):可以理解成我们的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host OS):你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
  • 虚拟机管理系统(Hypervisor):利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。
  • 子操作系统(Guest Operating System):假如我们需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个子操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存.

这样构建出来的虚拟机,是和真机具有一样功能的机器,它需要有自己的内核、有自己的各种lib库,需要安装各种应用软件服务,并且本身比较笨重,启动速度也非常慢。

3.2 Docker容器

  • 基础服务(Server):可以理解成我们的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host OS):你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
  • Docker引擎(Docker Engine):Docker Engine 取代了Hypervisor,他是运行在主操作系统之上的后台进程,负责管理docker容器。
  • 各种依赖(libs):对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的;
  • 应用(app):应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

所以从docker容器来看,它会共享主机的Kernel内核,不需要模拟各种硬件、只需要少量的必须库lib就可以啦。这里要说明一点,我们说docker容器会共享Kernel内容,那么我们在centos上为什么能运行Ubuntu的容器?

这里我们首先要区分下Linux内核与Linux发行版。

  • Linux内核是Linux系统的核心,负责硬件管理,比如管理内存、管理磁盘(文件系统)、管理cpu(进程)等等;
  • Linux发行版是在Linux内核基础上添加了一些工具软件,比如图形界面、函数库、软件包管理等。

所以,CentOS 与 Ubuntu 是不同的 Linux 发行版, 它们都是基于 Linux 内核, 只是添加的工具软件不同。比如, 他们的软件包管理系统不同, CentOS 使用 yum 命令安装软件, 而 Ubuntu 使用 apt-get 命令安装软件。这样,在 CentOS 上运行基于 Ubuntu 镜像的容器时,容器使用了 CentOS 主机的内核以及 Ubuntu 镜像,Ubuntu 镜像中安装了 Ubuntu 的各种软件(apt-get)。

那我们可能还会有疑问,那windows为什么能运行centos的容器?centos和windows的内核可是绝对不一样的啊!Docker 公司开始推出自己的 Docker for Windows 工具包,它旨在为开发人员在 Windows 上开发面向 Docker 的应用程序提供完整的工具链,其中包括运行环境、客户端,Docker Swarm 编排工具和其他工具。Docker for Windows 中负责运行环境配置的工具是 Docker Machine。与 boot2docker 类似,Docker Machine 也会在 Windows 上创建一个 Linux 虚拟机,用于运行 Docker 引擎。

3.3 Docker与虚拟机的区别

  • 传统虚拟机, 虚拟出一条硬件,运行完整的操作系统, 然后在这个操作系统上安装和运行软件;而Docker容器内的应用直接安装在主机的内核上, 容器没有自己的内核, 也没有虚拟的硬件, 所以就轻便了.由于没有臃肿的子操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。

  • 容器的启动速度很快, 一般在几毫秒~几十毫秒;

  • 应用场景不同。虚拟机更擅长于彻底隔离整个运行环境.例如,云服务提供商通常采用虚拟机技术隔离不同的用户。Docker通常用于隔离不同的应用,例如前端,后端以及数据库。

  • 容器和虚拟机相比, 可以更多的利用起来小块的闲置资源,它们不运行完整的操作系统。

  • 性能对比:

3.4 docker容器化技术在DevOps(开发,运维)中的作用

  • 应用更快速的交付和部署

    • 传统: 每台服务器要安装哪些应用, 配置哪些环境变量, 安装顺序, 都会一一记录到帮助文档
    • docker: 打包镜像, 一键运行.
  • 更便捷的升级和扩缩容

    • 传统: 需要安装软件, 部署, 重复工作
    • docker: 部署应用就像搭积木, 项目打包为一个镜像, 扩展服务器非常方便.
  • 更简单的系统运维

    • 在容易化部署之后, 我们的开发, 测试环境都是高度一致的, 不会出现在开发耗时, 部署到测试,线上不好使的情况
  • 更高效的利用计算机资源

    • docker是内核级别的虚拟化, 可以在一个物理机上运行很多个容器实例, 服务器的性能可以被压榨到极致.

      通常, 一台主机只能同时运行2-3个虚拟机, 但是可以同时运行20-30个容器

3.5 Docker容器学习官网

4.什么是Docker?

上面这个图片就是Docker的log,这是一条鲸鱼,鲸鱼上载满了集装箱。官方团队对Logo的解释:The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you。Docker直译过来是码头工人,然而Docker给人的第一感觉是容器,容器技术英译为Linux Container, Container的直译有集装箱,容器两个意思,如果要形象的理解Linux Container的话还是叫集装箱技术比较好(可以结合着上图及LOGO理解这句话),由于中国本土文化,念集装箱技术会比较奇怪,所以我们都称之为容器技术。

我们都知道码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,「在于其格式划一,并可以层层重叠, 集装箱与集装箱之间互不影响」。IT领域借鉴了这一理念,我部署一个服务运行好后,我再想移植到另外一个地方,**不用再安装一套操作系统和依赖环境。**这就像集装箱运载一样,我把一辆特斯拉(好比开发好的应用APP+环境),打包放到一容器集装箱里,它通过货轮可以轻而易举的从青岛港(CentOS7.2环境)运送到天津港(Ubuntu14.04环境)。而且运输期间,我的特斯拉(APP+环境)没有受到任何的损坏(文件没有丢失),在另外一个天津港卸货后,依然可以(启动正常)。

为了更好的理解docker,我们再讲一个小故事。张三想在天津要造一栋别墅,他重金请来了高级设计师,高级建造师,等各种高级工人,热火朝天历时多半年,房子建成了,半年后,张三由于工作调动需要换到另一个青岛,他只好在青岛花了重金又打造了一栋别墅;

而张三有一个朋友李四,跟李四是同样的场景,唯一不同的是,李四认识一个天神,天神施展了法术(构建镜像),将李四的别墅直接复制了一份(镜像),装到了李四的双肩包(仓库)里,李四去到另一个城市找了一片空地(容器)直接将装在双肩包(仓库)里的房子拿了出来,拿出来的房子就能变成跟李四在原城市一模一样的房子。那么我们说,不论天津还是青岛,这块土地都是一样的东西(同一个内核),房子就是容器。听完了故事,咱们再来理解docker的两句口号就更好理解了

  • 「Build, Ship and Run (搭建,发送,运行)」
  • 「Buildonce,Runanywhere (搭建一次,运行到任何地方)」

所以要给Docker下一个定义的话:Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。

相关推荐
功德+n8 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
小敬爱吃饭9 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
木子欢儿10 小时前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
coppher11 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
虚伪的空想家12 小时前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
SXJR12 小时前
k8s中的Pod
云原生·容器·kubernetes
文静小土豆12 小时前
K8s 滚动更新在 Java 应用中的实践与优化
java·容器·kubernetes
w61001046613 小时前
CKA-2026-Ingress
云原生·容器·kubernetes·cka
bloglin9999913 小时前
docker logs 如何一直监听日志输出
运维·docker·容器
说实话起个名字真难啊14 小时前
Docker 入门之网络基础
网络·docker·php