Docker如此受欢迎的一个原因是它提供了“一次开发,随处运行”的承诺.Docker提供了一种将应用程序及其运行时依赖性打包到单个容器中的简单方法。它还提供了一个运行时抽象,使容器能够跨不同版本的Linux内核运行。

使用Docker,开发人员可以在他或她的工作站上创建容器化应用程序,然后轻松地将容器部署到任何支持Docker的服务器。无论是在云端还是在本地,都无需为服务器环境重新测试或重新调整容器。此外,Docker还提供软件共享和分发机制,允许开发人员和运营团队轻松共享和重用容器内容。这种分发机制与跨机器的可移植性相结合,有助于说明Docker在运营团队和开发人员中的受欢迎程度。

【组件】图像层不变,容器层变。

Docker既是开发工具又是运行时环境。要了解Docker,我们必须首先了解Docker容器映像的概念。容器始终以图像开头,并被视为该图像的实例化。图像是容器在运行时应该是什么的静态规范,包括容器内的应用程序代码和运行时配置设置。Docker镜像包含只读层,这意味着一旦创建了图像,它就永远不会被修改。

图1显示了容器图像的示例。此图像描绘了具有Apache安装的Ubuntu映像。该图像由三个基本Ubuntu图层和一个更新图层组成,顶部有一个Apache图层和一个自定义文件图层。

图1:Docker图像层。

运行Docker容器是图像的实例化。从相同图像派生的容器在其应用程序代码和运行时依赖性方面彼此相同。但与只读的图像不同,运行容器包括在只读内容之上的可写层(容器层)。运行时更改(包括对数据和文件的任何写入和更新)都保存在容器层中。因此,共享相同底层图像的多个并发运行容器可具有实质上不同的容器层。

删除正在运行的容器时,可写容器层也将被删除,并且不会保留。保持更改的唯一方法是docker commit在删除容器之前执行显式命令。执行a时docker commit,正在运行的容器内容(包括可写层)将写入新的容器映像并存储到磁盘中。这成为与实例化容器的图像不同的新图像。

使用此显式docker commit命令,可以创建一组连续的离散Docker镜像,每个镜像都构建在上一个图像之上。此外,Docker使用写时复制策略来最小化共享相同基本组件的容器和映像的存储空间。这有助于优化存储空间并最小化容器启动时间。

图2描绘了图像和正在运行的容器之间的区别。请注意,每个正在运行的容器可以具有不同的可写层。

图2:Docker镜像和运行Docker容器。

除了图像概念之外,Docker还有一些与传统Linux容器不同的特定组件。(守护进程、CLI命令等)

  • Docker守护进程。Docker守护程序也称为Docker引擎,是容器和Linux内核之间的薄层。Docker守护程序是管理应用程序容器的持久运行时环境。无论底层操作系统如何,任何Docker容器都可以在任何启用了Docker-daemon的服务器上运行。
  • Dockerfile。开发人员使用Dockerfiles构建容器映像,然后成为运行容器的基础。Dockerfile是一个文本文档,包含组装容器映像所需的所有配置信息和命令。使用Dockerfile,Docker守护程序可以自动构建容器映像。此过程极大地简化了容器创建的步骤。

更具体地说,在Dockerfile中,首先指定构建过程开始的基本映像。然后指定一系列命令,之后可以构建新的容器映像。

  • Docker命令行界面工具。Docker提供了一组CLI命令,用于管理基于图像的容器的生命周期。Docker命令跨越开发功能,例如构建,导出和标记,以及运行时功能,如运行,删除,启动和停止容器等。

您可以针对特定的Docker守护程序或注册表执行Docker命令。例如,如果执行该docker -ps命令,Docker将返回在守护程序上运行的容器列表。

【内容分发】私有注册表到公共注册表

除了运行时环境和容器格式之外,Docker还提供了一种软件分发机制,通常称为注册表,可以方便容器内容的发现和分发。

注册表的概念对Docker的成功至关重要,因为它提供了一组用于打包,发送,存储,发现和重用容器内容的实用程序。Docker公司运行一个名为Docker Hub的公共免费注册表。

  • 注册。Docker注册表是发布和存储容器图像的地方。注册表可以是远程的,也可以是内部的。它可以是公共的,因此每个人都可以使用它,或者私有,仅限于组织或一组用户。Docker注册表附带了一组通用API,允许用户构建,发布,搜索,下载和管理容器映像。
  • Docker Hub。Docker Hub是一个由Docker管理的基于云的公共容器注册表。Docker Hub提供图像发现,分发和协作工作流支持。此外,Docker Hub还有一组经过Docker认证的官方图像。这些是来自已知软件发行商的图像,例如Canonical,Red Hat和MongoDB。您可以使用这些官方图像作为构建自己的图像或应用程序的基础。

图3描绘了一个工作流,其中用户构造图像并将其上载到注册表。其他用户可以从注册表中提取映像以生成生产容器,并将它们部署到Docker主机,无论它们在哪里。

【不变性】保留原来的,从而进行版本更新、管理。

Docker容器最有趣的特性之一是它们的不变性和容器的无状态性。

正如我们在上一节中所描述的,Docker镜像一旦创建,就不会改变。从映像派生的运行容器具有可写层,可以临时存储运行时更改。如果在删除之前提交容器docker commit,则可写层中的更改将保存到与前一个图像不同的新图像中。

为什么不变性好?不可变的图像和容器导致不可变的基础架构,不可变的基础架构具有传统系统无法实现的许多有趣的好处。这些好处包括以下内容:

  • 版本控制。通过要求显式提交生成新图像,Docker强制您进行版本控制。您可以跟踪图像的连续版本; 回滚到先前的图像(因此回到先前的系统组件)是完全可能的,因为先前的图像被保留并且从不被修改。
  • 更清洁的更新和更易于管理的状态更改。借助不可变的基础架构,您不再需要升级服务器基础架构,这意味着无需更改配置文件,无需更新软件,无需升级操作系统等。当需要进行更改时,您只需创建新容器并将其推出以替换旧容器。这是一种更加分散且易于管理的状态变化方法。
  • 最小化漂移。为避免漂移,您可以定期主动刷新系统中的所有组件,以确保它们是最新版本。使用封装系统较小组件的容器比使用传统的庞大软件更容易实现这一做法。

【docker的区别】

Docker的图像格式,广泛的容器管理API以及创新的软件分发机制使其成为开发和运营团队的热门平台。Docker为组织带来了这些显着的好处。

  • 最小的声明性系统。Docker容器如果是小型的单用途应用程序,则处于最佳状态。这使得容器尺寸最小化,从而支持快速交付,持续集成和连续部署。
  • 可预测的操作。系统操作中最令人头痛的问题始终是基础架构或应用程序看似随机的行为。通过强制您进行更小,更易于管理的更新,并通过提供最小化系统漂移的机制,Docker可帮助您构建更可预测的系统。当消除了漂移时,无论您部署多少次,您都可以确保软件始终以相同的方式运行。
  • 广泛的软件重用。Docker容器重用其他图像中的图层,这自然会促进软件重用。通过注册表共享Docker镜像是大规模组件重用的另一个很好的例子。
  • 真正的多云可移植性。Docker允许容器在不同的云平台,本地基础架构和开发工作站之间自由迁移,从而实现真正的平台独立性。

Docker已经在改变组织构建系统和提供服务的方式。它开始重塑我们对软件设计和软件交付经济学的思考方式。在这些变更真正扎根之前,组织需要更好地了解如何管理Docker环境的安全性和策略。但这是另一篇文章的主题。

容器101:Docker基础的更多相关文章

  1. Docker容器学习梳理 - 基础知识(1)

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  2. 容器自动化(一):docker基础(上)

    一,Docker简介,功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上 ...

  3. 容器技术学习系列(一)-Docker基础知识学习

    一.概述 1.Docker是什么? 1)Docker是世界领先的软件容器化平台 2)Docker公司开发,开源,托管在github 3)跨平台,支持Windows.MacOS.Linux 2.Dock ...

  4. 新一代Java程序员必学的Docker容器化技术基础篇

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  5. Linux ubuntu下docker容器安装和基础命令

    Docker介绍: 云计算就好比大货轮,docker就是集装箱虚拟机虽然可以隔离出很多"子电脑",但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare). 而容器技术 ...

  6. docker 基础之操作容器

    Docker子命令分类 Docker 环境信息 info .version 容器生命周期管理 Create.exec.kill.pause.restart.rm.run.start.stop.unpa ...

  7. Docker基础内容之容器

    前言 容器是独立运行的一个或一组应用以及它们的运行态环境. 相关命令 启动容器相关命令 docker run 运行一个ubuntu14.04版本的容器,如果这个镜像本地不存在则会去默认仓库中下载 do ...

  8. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  9. Docker系列03—Docker 基础入门

    本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...

  10. 【转】Docker基础

    一.简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的CGroup.Namespace.Union FS等技术实现的一种系统级虚拟化技术. 特性 更高效的利用系统资源: ...

随机推荐

  1. Java_IO_文件的续写_小笔记

    package IO; import java.io.FileWriter; import java.io.IOException; class FileWrite_WenJianXuXie { /* ...

  2. 缓存与数据库一致性之三:缓存穿透、缓存雪崩、key重建方案

    一.缓存穿透预防及优化 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步: 缓存层 ...

  3. day 102 GIT 的使用方法.

    https://www.cnblogs.com/wupeiqi/articles/7295372.html 文件名为红色表示 此文件在工作区被修改的状态 ,需要通过git add .进行提交,提交到版 ...

  4. 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换

    1.jQuery简介 为了简化JavaScript 的开发, 一些JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的页面, 并且兼 ...

  5. pre-commit 钩子,代码质量检查:在 vue-cli 3.x 版本中,已经使用尤大改写的yorkie,yorkie实际是fork husky,然后做了一些定制化的改动,使得钩子能从package.json的 "gitHooks"属性中读取

    pre-commit 钩子,代码质量检查:在 vue-cli 3.x 版本中,已经使用尤大改写的yorkie,yorkie实际是fork husky,然后做了一些定制化的改动,使得钩子能从packag ...

  6. 2017 browser market share

    Refer to Net Market Share published data for year 2017, browser share percentage as below table show ...

  7. 廖雪峰Java6 IO编程-2input和output-6classpath资源

    1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linu ...

  8. C#将对象序列化成JSON字符串

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  9. 2-zookeeper、ha

    1.zookeeper ①背景: Zookeeper 最早起源于雅虎研究院的一个研究小组.在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调, 但是这些系统往往都 ...

  10. thinkphp5 Exception类重定义

    重点定义自己的错误信息和错误码: 在TP5的配置文件中有下面一段 // 异常处理handle类 留空使用 \think\exception\Handle 'exception_handle' => ...