“Docker”可以指代的对象可以有如下几个:

  • Docker 容器技术:可以创建和使用Linux容器
  • Docker 社区:开源Docker社区致力于改进这些技术,使所有用户受益(https://forums.docker.com/)
  • Docker 公司:以Docker社区的工作为基础,使其更加安全,并将这些进步回馈给更大的社区。为企业客户提供经过增强的技术。

本文要介绍的是Docker容器技术。

Docker是一种容器技术,正是因为它,容器技术才变得广为人知。Docker是第一个使容器能更加容易地在不同机器之间移植的容器系统。它简化了应用程序及其相关依赖的打包流程,甚至整个操作系统的文件。Docker将它们都打包进一个简单的、可移植的包,这样,一个应用程序就可以以docker包(即镜像)的形式分发到任何安装了docker软件的机器上,然后快速地启动。

当我们使用docker运行被打包的应用程序时,它能看到其附带的文件系统内容。不管我们是在开发环境还是生产环境运行这个应用程序,docker看到的文件都是一致的,即使生产服务器是一个完全不同体系的Linux操作系统。应用程序接触不到所在服务器上的任何东西,因此即使生产服务器与开发服务器安装的库完全不一样也无关紧要。

举个例子,如果我们使用了整个红帽子Linux系统(RHEL)的文件对应用程序打包,然后让其运行在装有Fedora或者Debian等其它Linux发行版系统的服务器,应用程序都会认为它运行在RHEL系统中。只是内核有可能不同。

与通过在VM中安装一个操作系统得到一个镜像,再将应用程序打包到镜像里,最后再将整个镜像分发到主机并运行起来类似,Docker也能够达到同样的效果,但不是使用VM来隔离应用程序,而是使用Linux容器技术来实现与VM几乎同级别的隔离机制。容器不会使用大的单体VM镜像,而是使用通常来说更小的容器镜像。

使用Docker,我们可以将容器视为非常轻量级的、模块化的虚拟机。这些容器还提供了灵活性——可以在不同环境中创建、部署、复制和移动它们,这有助于为云平台优化应用程序。

基于Docker的容器镜像与VM镜像最大的一个不同之处在于容器镜像是由多层组成的,这些层可以在多个镜像之间共享和复用。这就意味着,如果一个镜像和另外某个或某些镜像具有相同的层,那么当下载这个镜像的时候,这些相同的层就会被提前下载下来,后面的镜像运行的时候就无需再重复下载这些公共层了,只需要下载其他层即可。

Docker相关概念

Docker 是一个打包、分发和运行应用程序的平台。它是我们能够将应用程序及其所依赖的整个环境合在一起打包。这个依赖的环境可以是一些应用程序需要的库,甚至也可以是一个安装好的操作系统通常情况下所有可用的文件。通过使用Docker,我们可用将这个包上传到一个中央仓库,然后这个包就可以被分发到任何安装了Docker的机器上去执行。

这里就要提到三个概念:

  • 镜像(Images):Docker容器镜像里包含了打包的应用程序和其所依赖的环境。这个镜像包含了应用程序可用的文件系统和其他元素据,比如镜像运行时需要执行的可执行文件的路径。
  • 镜像仓库(Registry):Docker镜像仓库存储Docker镜像,有利于在不同的人群和电脑之间共享镜像。当构建好镜像后,我们既可以在构建镜像的电脑上运行它,也可以将其推送(push)到镜像仓库,然后在另外一台电脑上拉取(pull)它并运行。这一点其实与通过git推送和拉取代码类似。Git也有自己的仓库,只是这个仓库存储的是代码文件而已。镜像仓库也可以做权限控制,比如某些镜像仓库是公开的,任何人都可以从这个仓库拉取镜像;有些镜像是私有的,只有某一部分人或机器可访问。
  • 容器(Container):Docker容器是一个常规的Linux容器,它基于Docker镜像创建。一个运行中的容器就是一个运行在装有Docker的主机上的进程,但这个进程是完全与主机以及运行在主机上的所有进程隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的一定量的资源(CPU、内存等等)。

构建、分发和运行Docker镜像

开发人员首先构建好镜像,然后将其推送到仓库。到这一步,镜像就能被任何能访问镜像仓库的人获取到。可以拉取这个镜像到任何其他运行了Docker的机器上,然后运行该镜像。Docker基于镜像创建一个隔离的容器,然后执行二进制可执行文件,该文件被指定为镜像的一部分。从下图可以看出镜像、仓库和容器三者之间的关系:

虚拟机 VS Docker容器

如下图所示,相同的6个应用A、B、C、D、E、F分别运行在虚拟机上(3个VM)和容器中(6个Docker 容器):

我们注意到,不管是在一个VM中运行还是在两个分离的容器中运行,A和B能够访问相同的二进制文件和库。在VM中这是很显然的,因为两个应用程序看到都是同一个VM中的相同文件系统。但我们知道,每个容器有它主机的隔离的文件系统,那么应用程序A和B又是如何共享文件的呢?

什么是镜像层

Dockers镜像由多层构成。不同的镜像可以包含完全相同的层,因为每个Docker镜像都是在另一个镜像的基础上构建的,而且两个不同的镜像都可以使用相同的父镜像作为基础镜像。这就提升了镜像在网络上的分发速度,因为当传输某个镜像时,如果相同的层已被之前的镜像传输, 那么这些层就不需要再被传输了。

镜像层(Layer)不只使分发效率变得更高,而且也有助于减少镜像的存储空间。每一层仅被存储一次。因此,由基于相同基础层的两个镜像创建的两个容器都可以读取相同的文件,但是如果其中一个容器写入某些文件,另一个是无法看见文件变更的。因此,即使它们共享文件,但仍然是彼此隔离的。这是因为容器镜像层是只读的。

当运行一个容器的时候,一个新的可写层在镜像的顶层上被创建。当容器中的进程写入位于底层的一个文件时,此文件的一个拷贝在最顶层被创建,进程写入的是此拷贝。

如果觉得本文对您有帮助,还请点赞+关注,您的支持是我持续创作的最大动力[可爱]

docker 不包含依赖 打包_从零开始学K8s: 4.Docker是什么相关推荐

  1. docker 不包含依赖 打包_Docker容器技术(概念篇)

    微信公众号:Java患者 专注Java领域技术分享 Docker介绍 Docker是基于Go语言实现的开源应用容器引擎,通过对应用组件的封装.分发.部署.运行等生命周期的管理,使的用户的应用及其运行环 ...

  2. docker 不包含依赖 打包_Docker打包深度学习项目(解决:Opencv依赖库、共享内存)...

    最近比赛要提交打包好的CNN模型给主办方去测试,使用Docker镜像.这可难倒了我这个小白,搞了好几天才打包好.在这里记录一下Docker使用过程,希望能给广大同学们提供点帮助. 文章内容包含以下3个 ...

  3. docker 不包含依赖 打包_docker源码打包RPM

    docker打包rpm 在完成了docker代码的编写和测试之后,如何发布docker程序?在centos上,一般使用RPM包进行打包.本文主要 RPM主要包括两种,一种是以二进制代码发布,一种是以源 ...

  4. docker 不包含依赖 打包_2019开启新学习,带你从零了解Docker

    2013年发布至今, Docker是近年来非常火的技术, 一直广受瞩目,被认为可能会改变软件行业.而且Docker不仅仅是Linux Redhat和Canonical等Linux巨头眼里的宠儿,微软等 ...

  5. k8s一个容器多个镜像_从零开始学K8s: 6.运行一个简单的容器

    如果觉得本文对您有帮助,可以关注.转发.点赞,您的支持是我持续创作的最大动力! 如果要在Kubernetes中运行应用程序,需要先将它们打包到容器镜像中.本文以Docker为例来进行具体讲解. 1.安 ...

  6. linux 父子进程 资源_从零开始学K8S(二):进程隔离让docker看起来像虚拟化

    各位小伙伴大家好,我是运维虫子! 上一篇,我们一起学习了docker的起源以及docker的简单运用,今天我们来从软件层面来了解一下docker的具体工作原理. Linux进程 进程是在 CPU 及内 ...

  7. 某系统有6台输出设备 有多个进程均需要使用2台_从零开始学K8s: 2.开发与部署方式的演变...

    近年来,应用开发和部署发生了一些变化.这些变化是由两方面促成的,一方面是大型单体应用被拆解为更多小型的微服务,另一方面是应用程序运行所依赖的基础架构发生了变化.理解这些变化,将使我们更好的看到使用k8 ...

  8. docker用gpu的参数_从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制

    导读:2016 年,随着 AlphaGo 的走红和 TensorFlow 项目的异军突起,一场名为 AI 的技术革命迅速从学术圈蔓延到了工业界,所谓 AI 革命从此拉开了帷幕.该热潮的背后推手正是云计 ...

  9. k8s ready 不调度_从零开始学K8s: 10.在K8s上运行应用

    上一节我们学习了如何使用Minikube搭建一个k8s环境,这一节开始我们来学习如何将之前创建的Node.js应用程序部署到这个k8s环境里 在部署之前,通常我们都会先准备好YAML或者JSON格式的 ...

最新文章

  1. go读取excel_Excelize 2.3.0 发布,Go 语言 Excel 文档基础库
  2. Exchange 常见问题之二----3
  3. ES6-3 let进阶、const、全部变量与顶层对象
  4. Java EE安全性API向前发展
  5. 微信薅羊毛拼团商城小程序 v2.7.5
  6. android studio中讯飞sdk“组件未安装.(错误码:21002)”的解决办法
  7. SpringCloud注解和配置以及pom依赖说明
  8. 计算机关机键消失了,如何解决Windows7电脑中的关机键不见了
  9. python 数据分析领域常用的包
  10. 【chrome】插件开发-教程00(如何开发插件)
  11. ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例
  12. 闪电html编辑器,闪电pdf编辑器
  13. Java 游戏自动寻路,老游戏仙境传说RO私服自动寻路求交流(含代码)
  14. 对计算机科学与技术专业课程的认识,计算机科学与技术专业课程
  15. windows资源保护无法启动修复服务器,Windows资源保护无法启动修复服务 | MOS86
  16. 图像特效---LOMO Filter
  17. 企业内的ITSM软件与OA系统有什么区别和关系?
  18. 收藏 | 堪称神器的42款Chrome插件
  19. 大数据分析12大就业方向
  20. xcode8继续愉快的使用插件

热门文章

  1. ASP.NET2.0+SQL Server2005构建多层应用 [转]
  2. 蛋白质折叠的霰弹枪方法
  3. c mysql insert语句_MySQL_mysql insert详细讲解,INSERT语法 INSERT [LOW_PRIORITY |DELA - phpStudy...
  4. windows redis 客户端_redis高并发的最佳解决方案
  5. python迭代数据类型_在大型数据集上自动迭代推断数据类型和最小项大小
  6. 【Matlab 控制】求函数极限
  7. 零 目录-机器学习老师板书-斯坦福吴恩达教授
  8. android 修改ramdisk.img和init.rc android启动后设置/data权限为770
  9. 【笔记】微软onedirve云存储使用小结
  10. 基于DVB-T标准,COFDM调制系统的利用导频信号进行符号粗同步