1.认识下Docker

news2025/7/22 21:10:06

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容器学习官网

  • docker官网: https://www.docker.com
  • docker文档: https://docs.docker.com/ docker的文档非常详细
  • docker仓库: https://hub.docker.com/

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机器上,也可实现虚拟化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pthread_attr_getstacksize 问题

最近公司里遇到一个线程栈大小的问题,借此机会刚好学习一下这个线程栈大小相关的函数。如果公司里用的还是比较老的代码的话,都是用的 pthread 库支持线程的,而不是 c11 里的线程类。主要有两个相关函数:pthread_attr_setstacksiz…

Android 10-11适配外部存储方案

Android Api 29 对文件和文件夹进行了重大更改。不允许使用外部存储,如下方法: Environment.getExternalStorageDirectory() /mnt/sdcard Environment.getExternalStoragePublicDirectory(“test”) /mnt/sdcard/test 只能使用内部存储 getExterna…

安防监控项目---web网页通过A9控制Zigbee终端节点的风扇

文章目录 前言一、zigbee的CGI接口二、请求线程和硬件控制三、现象展示总结 前言 书接上期,我们可以看一下前面的功能设计的部分,网页端的控制还有一个,那就是通过网页来控制zigbee上的风扇节点,这部分的工作量是相当大的&#x…

管理类联考——英语二——阅读篇——题材:心理

文章目录 2013年,Text 3——题材:心理细节题(难)细节题——排除法细节题细节题观点态度题 2015 年,Text 1——题材:心理细节题细节题推断题词义句意题细节题 2019 年,Text 1——题材&#xff1a…

八、W5100S/W5500+RP2040树莓派Pico<DNS>

文章目录 1 前言2 协议简介2.1 什么是DNS2.2 DNS的优点2.3 DNS工作原理2.4 应用场景 3 WIZnet以太网芯片4 DNS网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 烧录验证 5 注意事项6 相关链接 1 前言 为了更好地支持应用程序的性能和可用性…

RuoYi若依源码分析1 - security

Security springsecurity配置文件夹 security springsecurity总配置类 SecurityConfig.java SecurityConfig 总配置分析 首先看一下总配置,我们可以从总配置项里面大体的总结出springsecurity鉴权在ruoyi框架里面是如何执行的 自动装配关键处理类以及过滤器等…

爬虫 | 【实践】百度搜索链接爬取,生成标题词云 | 以“AI换脸”为例

目录 📚链接爬取 🐇流程梳理 🐇代码实现 🐇结果 📚词云生成 🐇代码实现 🐇结果 📚链接爬取 🐇流程梳理 总体流程是:构建搜索链接 -> 发送HTTP请求…

解决Linux Debian12系统中安装VirtualBox虚拟机无法使用USB设备的问题

Debian12系统中安装VirtualBox,再VirtualBox虚拟机中无法使用 USB设备。如下图所示: 解决方法如下: 1.安装 Virtualbox增强功能。如下图所示: 2.添加相关用户、用户组( Virtualbox 装完成后会有 vboxusers 和 vboxs…

初学编程学什么语言,中文编程系统化教程课程之自定义图形窗口自定义标题栏编程,零基础学编程轻松学编程

初学编程学什么语言,中文编程系统化教程课程之自定义图形窗口自定义标题栏编程,零基础学编程轻松学编程 该编程工具开发的系列管理软件 编程系统化课程总目录及明细,零基础学编程视频教程,点击进入了解详情。 https://blog.csdn.n…

无法ping通ECS服务器公网IP的排查方法

无法ping通ECS实例的原因较多,您可以参考九河云编辑的文章进行排查。 问题现象 本地客户端无法ping通目标ECS实例公网IP,例如: 本地客户端为Linux系统,ping目标ECS实例公网IP时无响应,如下所示: 本地客…

Java日志组件之三Log4j2漏洞剖析及重现

一、前言 这一篇我们来介绍一下史上第二严重的安全漏洞是个什么情况,原理是什么,如何重现。 二、Log4j2 Lookup机制 Log4j2 Lookup机制最重要的功能就是提供一个可扩展的方式让你可以添加某些特殊的值到日志中。你调用logger.info(name);这样的语句&a…

【赠书第1期】零基础学无人机航拍与短视频后期剪辑实战教程

文章目录 前言 1 购买前须知 2 准备工作 3 飞行控制 4 拍摄技巧 5 安全提示 6 推荐图书 7 粉丝福利 前言 随着科技的不断发展,无人机已经不再是军事装备的专属,它已经成为了消费级无人机的主流产品。作为国内领先的无人机生产商,大疆…

【腾讯云 HAI域探秘】StableDiffusionWebUI一小时搞定100张设计图

目录 前言一、选择 HAI部署的优势二、HAI 搭建AI绘图服务实现思路三、生成设计图操作流程1、新建HAI应用2、StableDiffusionWebUI(1)功能介绍(2)页面转中文(3)线稿生成图 四、部署StableDiffusionWebUI服务…

通讯网关软件033——利用CommGate X2OPC实现PI数据写入OPC Server

本文推荐利用CommGate X2OPC实现从PI服务器读取数据并写入OPC Server。CommGate X2OPC是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从PI实时数据库获取数据并写入OPC Server。 【解决…

maven环境变量的配置

windows系统 1. win键 r,输入sysdm.cpl打开系统属性界面,选择高级栏目,点击环境变量菜单打开环境变量界面。 2. 选择系统变量下的新建菜单,变量名输入MAVEN_HOME,变量值输入maven的安装目录,例如&#xff…

CNN卷积神经网络模型的GPU显存占用分析

一、参考资料 浅谈深度学习:如何计算模型以及中间变量的显存占用大小 如何在Pytorch中精细化利用显存 二、相关介绍 0. 预备知识 为了方便计算,本文按照以下标准进行单位换算: 1 G 1000 MB1 M 1000 KB1 K 1000 Byte1 B 8 bit 1. 模型参数量的计…

基于构件的开发(CBD)

基于构件的开发(Component-Based Development,简称CBD)或基于构件的软件工程(Component-Based Software Engineering,简称CBSE)是一种软件开发新范型,它是在一定构件模型的支持下,复…

FPGA与ASIC有什么差异?二者该如何选用?

前言 对于一个数字电路的新手来说,这可能是会经常遇到的一个问题:FPGA和ASIC之间的区别是什么? 接下来本文将尝试讲解 “什么是FPGA?” 和 “什么是ASIC?”,然后讲述一些关于FPGA和ASIC的问题,例如它们之间…

【【FIFO to multiplier to RAM的 verilog 代码 和 testbnench 】】

FIFO to multiplier to RAM的 verilog 代码 和 testbnench 只完成了单个数据的传输 大数据需要修改 tb 或者基本连线 FIFO.v //synchronous fifo module FIFO_syn #(parameter WIDTH 16, // the fifo wideparameter DEPTH 1024, …

【MATLAB】全网唯一的7种信号分解+ARIMA联合的时序预测算法全家桶

有意向获取代码,请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有7种信号分解ARIMA组合的时序预测算法,绝对不亏,知识付费是现今时代的趋势,而且都是我精心制作的教程,有问题可随时反馈~也可单独获取某一算…