docker的基本概念_registory drbd-程序员宅基地

技术标签: docker  

一、Docker容器技术

想要搞懂Docker的概念我们必须先从容器开始说起。
先从容器开始讲解
什么是容器?

1、一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。

2、容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。

3、容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。

4、容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

5、再来看看容器较为通俗的解释:

6、如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。

在这里插入图片描述
7、图解物理机、虚拟机、容器

关于虚拟机与容器的对比在后面会详细介绍到,这里只是通过网上的图片加深大家对于物理机、虚拟机与容器这三者的理解。

8、物理机

在这里插入图片描述

9、虚拟机:

在这里插入图片描述

10、容器:

在这里插入图片描述
11、通过上面这三张抽象图,我们大概可以通过类比概括出: 容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。

12、相信通过上面的解释大家对于容器这个既陌生又熟悉的概念有了一个初步的认识,下面我们就来谈谈Docker的一些概念。

二、什么是docker

1、说实话关于Docker是什么并太好说,下面我通过四点向你说明Docker到底是个什么东西。

2、Docker是世界领先的软件容器平台。

3、Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docke最初实现是基于LXC。

4、Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。

5、用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

三、docker的基础介绍

在这里插入图片描述
在这里插入图片描述

1、docker发展历史

(1)Docker 是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。 Docker 利用 Linux 核心中的资源分离机制,例如 cgroups,以及 Linux 核心名字空间,来创建独立的容器。

(2)这可以在单一 Linux 实体下运作,避免引导一个虚拟机造成的额外负担。Linux 核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户 ID 与挂载文件系统,而核心的 cgroup 提供资源隔离,包括 CPU、存储器、block I/O 与网络。

(3)从 0.9 版本起,Dockers 在使用抽象虚拟是经由 libvirt 的 LXC 与 systemd – nspawn 提供界面的基础上,开始包括 libcontainer 库做为以自己的方式开始直接使用由 Linux 核心提供的虚拟化的设施,

(4)依据行业分析公司“451 研究”:“Dockers 是有能力打包应用程序及其虚拟容器,可以在任何 Linux 服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。” 。

(5)Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

(6)docker诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在GitHub 上进行维护。

(7)docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

(8)docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术。

(9)在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

(10)下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、2010年,几个雄心勃勃的年轻人怀揣1000万美元的融资在旧金山成立了一家做PaaS平台的公司,起名为dotCloud。目标是做世界上最好的PaaS,dotcloud 打败他们:

Amazon AWS
Google GAE
IBM Bluemix
RedHat OpenShift
Microsoft Azure
VMware Cloud Foundry
Heroku

3、什么是PaaS?

传统的软件产品开发一般是这样的:
1)、确定产品定位和需求,确定首次迭代的范围。
2)、制作界面原型。
3)、技术选型,然后根据技术选型为每个开发者搭建开发环境和技术栈,例如 Java 环境、Python 环境、Ruby 环境、数据库、中间件等等。
4)、构建基础技术框架和服务,包括日志、存储、消息、缓存、搜索、数据源、集群扩展等等。
5)、模拟用户容量,构建测试环境。
6)、开始编写真正的业务代码,实现产品功能。
7)、迭代开发/测试,生生不息,周而复始
而PaaS 平台可以直接省略3,4 ,5 三个步骤

4、dotcloud在苦苦支撑了几年之后,公司业务始终不见起色。dotCloud的创始人Solomon Hykes决定把dotCloud的所有源代码开源来搏一把。 没想到,他们的核心引擎Docker重现了当年Linux Kernel开源时的丰彩,获得了广大服务端程序员的追捧:“这个容器管理引擎大大降低了容器技术的使用门槛,轻量级,可移植,虚拟化,语言无关,写了程序扔上去做成镜像可以随处部署和运行,开发、测试和生产环境彻底统一了,还能进行资源管控和虚拟化。

5、于是,dotCloud迅速停下其它手中业务的开发,开始专心研发Docker产品和维护相关社区,过上了幸福而快乐的生活。后面甚至2013年把公司名字都改成Docker,2014年8月Docker宣布把平台即服务的业务dotCloud出售给位于德国柏林的平台即服务提供商CloudControl,dotCloud的历史告一段落,Docker的序幕缓缓拉开。

6、docker是当前非常火的一款虚拟化产品

7、docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的cgroup,namespace 等技术对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离进程独立于宿主和其他的隔离的进程,因此也称为容器。

四、为什么要使用 docker?

1、作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

2、首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

3、容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

4、具体说来,Docker 在如下几个方面具有较大的优势。

(1)更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高,无论是应用执行速度,内存消耗以及文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

(2)更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行与宿主内核,无序启动完整的操作系统,因此可以做到妙级,甚至毫秒级的启动时间,大大的节约了开发,测试,部署的时间。

(3)一致的运行环境

开发过程中一个常见的问题是环境一致性问题,由于开发环境,测试环境,生产环境不一致,导致有些bug并未在开发过程中被发现,而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而不会再出现(这段代码在我机器上运行没问题啊)zz这类问题。

(4)持续交付和部署

对于开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用Docker可以通过定制应用镜像来实现持续集成,持续交付,部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署

(5)更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易,Docker可以在很多平台上运行,无论是物理机,虚拟机,公有云,私有云,甚至是比较本,其运行结果是一致的,因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

(6)更轻松的维护和扩展

Docker使用的分层存数以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单,此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

(7)更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

(8)更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

(9)更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

(10)更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

对比传统虚拟机总结

特性	                  容器	                虚拟机
启动	                  秒级	                分钟级
硬盘使用	             一般为 MB	           一般为 GB
性能	                 接近原生	            弱于
系统支持量	         单机支持上千个容器	   一般几十个

五、docker核心与思想

思想:集装箱、标准化、隔离

标准化:①运输方式、②存储方式、 ③API接口

docker有3大核心:镜像、容器、仓库。

Docker 镜像仓库


Docker 镜像


Docker 容器

六、docker可以在什么情况下使用

1.web应用自动化打包发布,像tomcat应用的发布。

2.自动化测试和持续集成、发布。

3.在服务型环境中部署和调整数据库或其他的后台应用。

4.搭建paas环境。

七、使用docker有什么好处

1.简单易操作,简化了以往复杂的应用程序安装步骤,使用docker会变得非常简便。

2.可兼容多种应用,Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成镜像部署。

3.省钱 docker结合云可以做到高性能低价格

特别之处:Docker是基于Linux 64bit的,在32位机器上无法运行。

4、Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。Docker能处理的事情包括:

隔离应用依赖
创建应用镜像并进行复制
创建容易分发的即启即用的应用
允许实例简单、快速地扩展
测试应用并随后销毁它们

5、标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;

6、节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;

7、方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;

8、节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

9、方便持续集成,通过与代码进行关联使持续集成非常方便;

10、可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。

11、目前大型互联网公司有腾讯、京东、美团、新浪、大众点评等都在使用。比如说腾讯的盖亚,基于docker部署管理,据说已经有万台规模,用于大数据处理。美团主要是用于持续集成,自动构建方面,另外新浪也做了实践。容器化是一个大趋势,以后这方面的公司会越来越多。

12、Docker提供功能广泛,这里有几个的例子:

Images(镜像):Docker可以通过Pull和Push命令构建对象到服务中心

Containers(容器):Docker可以通过Start/Stop命令管理容器的生命周期

Logging(日志):Docker可以通过stdout,stderro捕获输出所有的容器内部信息

Volumes(存储):Docker可以创建和管理容器的相关文件存储

Networking(网络):Docker可以创建管理虚拟的接口和内部所有容器之间的网络桥接

RPC:Docker服务器提供允许外部程序去控制所有容器的行为的API

在这里插入图片描述

13、镜像管理

镜像是Docker管理最基础的部分,同时也是Docker最大的亮点。镜像管理涉及到镜像的制作、更新、存储、分发、权限等多个方面。

镜像制作方面,应该坚持三个原则,第一是坚持镜像总是从Dockerfile生成。这样做最大的好处是可以通过Dockerfile“阅读”镜像,在后续的协作、升级维护等方面会带来巨大的便利。第二是镜像之间应该避免依赖过深,建议为三层,这三层分别是基础的操作系统镜像、中间件镜像和应用镜像。第三是坚持所有镜像都应该有对应的Git仓库,以方便后续的更新。

镜像的更新需要一个自动化的流程,这可以通过SCM和CI系统自动触发实现。具体的流程如下图所示。开发者首先将代码和Dockerfile提交到Git仓库,然后Git通过webhook方式触发Jenkins的主动获取代码和Dockerfile文件,Jenkins再通过Docker相关的插件生成镜像并推送镜像到私有的Registry。这样,在服务器上就可以通过拉取新的镜像部署容器。

关于Registry,可能会涉及三方面的问题,一个是单点问题,对应的解决方案可以考虑DRBD、分布式存储以及云存储。二是Regitry的性能问题,目前可用的解决方案是通过HTTP反向代理缓存来加速Layer的下载。三是Registry用户权限,Nginx LUA可以提供一个简单快速的实现方案。

14、发布管理

和传统的发布流程相比,Docker最大的好处是不需要考虑外部依赖,利用容器的自包含的特点,我们可以将发布回滚流程标准化和产品化。而传统的发布和回滚,需要casebycase去针对不同应用做升级回滚的方案。要做到基于Docker的发布,镜像的生成必须坚持自动化,否则会发现升级比传统的方法更麻烦。因此在现实中我们也发现很多企业将代码目录放到主机目录映射到容器内,这样做破坏了Docker的自包含特性,解决的办法是坚持应用镜像更新自动化。

15、日志管理

由于容器是无状态的,所以存储在容器内的日志会随着容器的销毁而消失。stdout/stderr类型的日志,可通过logspout转发到syslog中心来收集。打印到文件的支持,比如accesslog,需要将日志存储到外部的Volume,并在Docker主机上使用logstash收集转发。

16、配置管理

容器里没有CM agent,无法接收CM指令。CM运行到Host上也无法管理容器中的文件,如果手工修改容器内的配置,那新创建的容器仍然是旧的。配置大体上分为两种类型,一种是服务之间的连接信息,这种配置建议考虑使用服务发现系统,也可以使用一些更加传统的方法,比如通过环境变量来协调作开发和生产环境的配置差异。一种是一般的配置文件参数,配置文件和Dockerfile应该一起存储到一个Git仓库,修改后自动build更新镜像。

17、网络管理

目前Docker支持的网络包括Host网络、NAT网络、物理网桥和网络虚拟化。Host网络中容器和主机共享网络命名空间,不同容器需要做好端口规划,防止端口冲突。Nat网络是基于四层代理以及NAT技术,依赖portmap,进出都需要转发,性能低,主机上需要做好端口规划,容易搞混。物理网桥方案,和传统虚拟机的网桥没有区别,适合容器数量有限且相对静止的场景。网络虚拟化是基于隧道的overlay网络,目前开源方案有SocketPlane、Weave、Flannel,适合数量大,动态创建销毁容器的场景。

八、容器 VS 虚拟机

1、简单来说: 容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

2、两者对比

3、传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

在这里插入图片描述

4、通过Docker官网,我们知道了这么多Docker的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用 ,例如前端,后端以及数据库。

九、镜像(Image)——一个特殊的文件系统

1、操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。

2、Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

3、Docker设计时,就充分利用Union FS的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。

4、镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

5、分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

十、容器(Container)—镜像运行时的实体

1、镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。

2、容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。

3、容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

4、按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

十一、仓库(Repository)——集中存放镜像文件的地方

1、镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

2、一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

3、通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

这里补充一下Docker Registry公开服务和私有Docker Registry的概念:

4、Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

5、最常使用的Registry公开服务是官方的Docker Hub ,这也是默认的Registry,并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。在国内访问Docker Hub可能会比较慢国内也有一些云服务商提供类似于Docker Hub的公开服务。

6、除了使用公开服务外,用户还可以在本地搭建私有Docker Registry 。Docker官方提供了Docker Registry镜像,可以直接使用做为私有Registry服务。开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持Docker命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

7、如果你搜索Docker官网,会发现如下的字样:“Docker - Build, Ship, and Run Any App, Anywhere”。那么Build,Ship,and Run到底是在干什么呢?

Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源。
Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样。
Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。

8、Docker运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。所以,我们也常常将Docker称为码头工人或码头装卸工,这和Docker的中文翻译搬运工人如出一辙。

十二、通俗解释docker

1、首先,我们登陆至docker官网的时候可以看到是个鲸鱼的形状,然后我们把鲸鱼比作是操作系统。

2、要交付的应用程序是各种货物,要将各种形状和尺寸不同的货物放到大鲸鱼上,得考虑每件货物怎么安放(应用程序配套的环境),还得考虑货物和货物之间能否重叠起来(应用程序依赖的环境是否会冲突)。

3、现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。

4、即:打包放到鲸鱼上,鲸鱼放到服务器上。也就是“build——ship——run”,这样在自己的电脑上怎么运行,在服务器上也会怎么运行。

用docker运行一个程序的过程:

5、去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。

在这里插入图片描述

(1) 镜像-复制的程序

定义:
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

作用
类似于虚拟机的快照,用来创建新的容器。

特点:
镜像不包含任何动态数据,其内容在构建之后也不会被改变。

在这里插入图片描述

(2)容器-集装箱

运行程序的地方
镜像是静态的,每一层都只是可读的,而容器是动态的,里面运行着我们指定的应用。

(3)仓库-存放镜像的地方

存放镜像的地方,和git类似
why?
在知乎上看到一个很好的解释:

简单来说就是,不同的应用程序所依赖的环境不一样,如果把他们依赖的软件都安装在一个服务器上,不仅需要调试很久,而且可能会有冲突。

如果想把两个应用程序隔离起来,可以在服务器上创建不同的虚拟机,不同的虚拟机放不同的应用,但是虚拟机的开销比较高。docker作为轻量级的虚拟机,是一个很好的工具。

在这里插入图片描述

作用

解决运行环境不一致所导致的问题。这样就不会产生“本地运行没问题,可一到服务器上就不行了”的情况。
限定最大的cpu使用内存硬盘,这样就起到了隔离的作用,避免产生“一块代码产生死循环,把磁盘占满了,其它程序也挂了”的情况。
双11时可以扩展机器用。

总结成一句话:docker的标准化让快速扩展,弹性伸缩变得简单

使用之前和之后

之前,可以发现,每发布一个程序,都要走一遍以下的流程:

之后:

how?
docker安装?
检查计算机是否符合要求,版本和是否开启了虚拟化之类的。
去官网下载并安装
测试是否安装成功

docker的使用?——hello world
从中央库中拉取镜像

查询到拉取成功

运行镜像,查看到结果

原理解析

docker pull的时候,Docker damemon先在本地仓库中找,如果没有,再去中央仓库中拉取,拉取到本地仓库就好了。
docker run的时候,也是先在本地仓库中找,如果有,直接放到容器里用。否则,去中央仓库中拉取。

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。总之docker就是集装箱原理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aaronszm/article/details/104252025

智能推荐

python运行程序的快捷键_4.Python IDLE使用方法详解(包含常用快捷键)-程序员宅基地

文章浏览阅读1.5k次。在安装 Python 后,会自动安装一个 IDLE,它是一个 Python Shell (可以在打开的 IDLE 窗口的标题栏上看到),程序开发人员可以利用 Python Shell 与 Python 交互。本节将以 Windows7 系统中的 IDLE 为例,详细介绍如何使用 IDLE 开发 Python 程序。单击系统的开始菜单,然后依次选择“所有程序 -> Python 3.6 -> IDL..._python idle 如何自动补函数

Unity关于对象池的使用_unity find prefab名字有个(clone)-程序员宅基地

文章浏览阅读801次。在游戏中大量的出现的,比如敌人,子弹,都可以用到对象池,为什么要用的对象池呢?其实是因为系统在创建,销毁对象是非常消耗内存的,这样对优化内存会有很大的帮助。回头再总结一下优化方面的注意方面。那么,如何使用,或者说如何创建对象池呢?首先我们Assets 下创建一个Resources文件夹。里面放上需要重复创建的预制体。(注意给这个预制体加上刚体),创建脚本using UnityEngin_unity find prefab名字有个(clone)

Linux 指令lsblk 作用,以及查看cpu使用情况和磁盘IO iostat指令详解

(列表块设备)命令是一个非常实用的工具,用于显示所有可用的块设备信息,如硬盘、USB驱动器、SD卡以及它们的分区。这个命令以易于理解的树状结构展示这些信息,清晰地表明了设备间的层次关系和依赖性。是一个用于监控Linux系统中CPU使用情况和磁盘I/O统计信息的命令行工具,它是sysstat包的一部分。行中的数据,你可以大致了解系统的CPU资源是如何被分配和使用的,进而判断是否存在CPU瓶颈或者I/O等待等问题。可以帮助识别系统中的I/O瓶颈,监控磁盘活动,并据此进行性能调优或问题诊断。在Linux系统中,

第六天----数据结构笔记_路径点和边重复-程序员宅基地

文章浏览阅读495次。笔记参考文章1、1.图根据边是否有方向,将图可以划分为:无向图和有向图。2.一条边上的两个顶点叫做邻接点。3.在无向图中,某个顶点的度是邻接到该顶点的边(或弧)的数目。4.在有向图中,顶点的度=入度+出度。–顶点的入边,是指以该顶点为终点的边。而顶点的出边,则是指以该顶点为起点的边。–某个顶点的入度,是指以该顶点为终点的边的数目。而顶点的出度,则是指以该顶点为起点的边的数目。5.路径:如果顶点(Vm)到顶点(Vn)之间存在一个顶点序列。则表示Vm到Vn是一条路径。–路径长度:路径中"_路径点和边重复

[word技巧]把标题、图表题注编号由“一.1”改为"1.1"_word 图一.1-程序员宅基地

文章浏览阅读4.1w次,点赞6次,收藏31次。[word技巧]把标题、图表题注编号由“一.1”改为"1.1"_word 图一.1

python编程语言的缺点-常见的AI编程语言优缺点比较,程序员千万不要入错行!...-程序员宅基地

文章浏览阅读228次。原标题:常见的AI编程语言优缺点比较,程序员千万不要入错行!人工智能编程是一种技术的提升,为不同公司的运营和人们的生活带来了极高的效率和最佳效益。 人工智能为不同的行业带来了另一种智能技术,其潜力的前景仍在增长,期望它能够达到人类的智慧。 这是因为开发人员愿意探索,试验和实施其能力,以满足更多的人力和组织需求。 毕竟,需求是发明之母。 就像在大多数软件应用程序的开发中一样,开发人员可以使用各种语言..._ai python 跟语言无关

随便推点

集美大学2024年团体程序设计天梯赛模拟赛( H 创造花田的魔法) 思路清晰简单明了,有代码有思路_2024天梯模拟赛-程序员宅基地

文章浏览阅读479次,点赞10次,收藏8次。第一点题目分析完后我们得到:地图是n * m 的有湖泊L(当且只有它的周围8个方向都是湖泊L的时候种荷花S)山脉M (不种任何东西)青草块G 1.周围没有房屋H,有湖泊L,种水仙N 2.周围没有房屋H,没有湖泊L,种苍月草N房屋H (不种任何东西,且周围不能种花)第二点那么我们可以定义四个变量 L,M,G,H 来统计当前这个点周围有哪些这个点自己是湖泊,且周围湖泊L== 8 的话,种荷花S这个点是青草块 1、周围房屋H == 0 且有_2024天梯模拟赛

SSM+mysql智慧物业管理系统-计算机毕业设计源码22076_管理员,用户登录流程图-程序员宅基地

文章浏览阅读2.9k次,点赞12次,收藏29次。1、小区管理2、居民信息管理3、工作人员管理4、停车位管理5、小区安全管理6、门禁管理7、居民收费信息管理:固定类费用缴纳(根据条件查询,显示某住户的基本信息),小区中的居民会有一些相关的物业费信息,管理员可以对这些信息进行管理操作。8、居民付费信息管理:小区居民需要对自己要缴纳的费用进行提交,管理员则可以对这些交易记录进行管理工作,可以对其进行添加、删除、修改操作。9、保修管理:用户对自己要保修的部位进行在线保修.然后管理员在后台对提交的信息进行管理操作。10、业主投诉管理_管理员,用户登录流程图

Java 高级面试问题及答案(一)

多线程是指在程序中同时运行多个线程,而并发是指在多线程环境下,多个线程在同一个时间点上执行不同的任务。Java中的多线程可以通过继承Thread类或者实现Runnable接口来实现。并发编程需要考虑线程安全,避免竞态条件和死锁等问题。我在一个高并发的Web服务项目中使用了多线程。服务需要处理大量的请求,并且每个请求都需要执行时间密集型的任务。为了提高性能和响应速度,我将任务分配到不同的线程上,这样CPU可以并行处理这些任务,而不是在单个线程上顺序执行。

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources,这里不需要混淆,暂时关闭。学习记录,每天不停进步。

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

复制进芯电子国产DSP官网提供的配置文件。

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示:DS C君认为的难度:B>A>C,开放度:A=B

推荐文章

热门文章

相关标签