zoukankan      html  css  js  c++  java
  • 容器101:Docker基础

    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环境的安全性和策略。但这是另一篇文章的主题。

  • 相关阅读:
    使用AWS、Docker与Rancher提供弹性的生产级服务
    如何用微服务重构应用程序
    Prometheus入门
    Docker监控:最佳实践以及cAdvisor和Prometheus监控工具的对比
    前后端分离session不一致问题
    Eclipse整合SSM框架+AOP+全局异常处理
    SSM配置基于注解AOP
    有关Linux
    Tomcat下配置javaWeb访问路径-Linux
    Linux下如何安装Nginx
  • 原文地址:https://www.cnblogs.com/immiao0319/p/10347739.html
Copyright © 2011-2022 走看看