Docker


文档摘要

Docker 必读资源: 面向初学者的容器、虚拟机和Docker简介 Docker教程与Python 为什么使用DOCKER? 在开发者的控制台上应用运行良好,但在测试或生产环境中却无法正常工作。 开发环境中的软件可能是更新过的版本,但在测试和生产环境中使用的却是旧版本。 Docker是一个计算机程序或工具,它使部署和运行应用程序变得更加容易。其核心概念是“容器化”。 想象一下,作为开发者,你的应用被打包成一个包含所有所需组件(如库和其他依赖项)的包,然后作为一个整体进行分发。 Docker本质上是一个轻量级的虚拟化工具和容器化平台,在Linux环境中可以运行和部署应用程序及其依赖项。 Docker是一个基于Linux容器的开源项目。

Docker

必读资源:

面向初学者的容器、虚拟机和Docker简介

Docker教程与Python

  • 为什么使用DOCKER?

    • 在开发者的控制台上应用运行良好,但在测试或生产环境中却无法正常工作。

    • 开发环境中的软件可能是更新过的版本,但在测试和生产环境中使用的却是旧版本。

    • Docker是一个计算机程序或工具,它使部署和运行应用程序变得更加容易。其核心概念是“容器化”。

    • 想象一下,作为开发者,你的应用被打包成一个包含所有所需组件(如库和其他依赖项)的包,然后作为一个整体进行分发。

    • Docker本质上是一个轻量级的虚拟化工具和容器化平台,在Linux环境中可以运行和部署应用程序及其依赖项。

    • Docker是一个基于Linux容器的开源项目。它利用Linux内核的特性(如命名空间和控制组)来创建容器。

  • Docker引擎

    • Docker引擎是Docker运行的基础层。它是轻量级的运行时和工具,用于管理容器、镜像、构建等。它在Linux系统上原生运行,并由以下部分组成:
        1. 运行在主机上的Docker守护进程。
        1. 与Docker守护进程通信以执行命令的Docker客户端。
        1. 用于远程与Docker守护进程交互的REST API。
  • Docker客户端

    • Docker客户端是你作为Docker的最终用户所沟通的对象。你可以将其视为Docker的用户界面。
  • Docker守护进程

    • Docker守护进程实际执行发送给Docker客户端的命令——例如构建、运行和分发容器。Docker守护进程运行在宿主机上,但作为用户,你不会直接与守护进程通信。Docker客户端可以在宿主机上运行,但不是必须的。它可以运行在另一台机器上并与宿主机上运行的Docker守护进程通信。
    • 卷是容器的数据部分,当容器创建时初始化。卷允许你持久化和共享容器的数据。数据卷独立于默认的联合文件系统,存在于宿主机文件系统的正常目录和文件中。因此,即使你销毁、更新或重建容器,数据卷仍然保持不变。当你需要更新卷时,可以直接对它进行更改。(额外的好处是,数据卷可以在多个容器之间共享和重用,这非常棒。)
  • 微服务架构:

    • 微服务架构的理念是将应用程序分解成更小的部分,使其更容易构建和维护。

    • 每个组件可以独立开发和完成……

    • 示例:在线购物服务:

      • 账户服务
      • 产品目录
      • 购物车服务器
      • 订单服务器
  • 微服务架构的优势:

    • 因为被分解成更小的部分,所以构建和维护都更加容易。
    • 如果需要添加新功能或更新某个模块,由于依赖关系较少,所以会更简单。
    • 如果某个组件出问题,整个应用不会受到太大影响。
  • 采用微服务的问题:

    • 在使用Docker之前:对于微服务架构,我们需要一台主机和几个虚拟机,每个虚拟机对应一个微服务。问题是,这会导致大量资源浪费。随着应用规模增大,越来越多的虚拟机会占用大量的磁盘空间和内存。
  • Docker如何解决这个问题:

    • 我们可以在一个虚拟机中运行多个微服务,通过为每个微服务运行不同的Docker容器。
    • Docker不需要初始的RAM和磁盘需求。
  • Docker如何解决“在整个交付过程中(开发、测试、生产)没有一致的计算环境”的问题:

    • Docker容器由开发者构建。
    • Docker在整个软件开发生命周期(SDLC)中提供一致的计算环境。
  • 什么是镜像?

    • Docker镜像是容器的基础。它是一系列堆叠在一起的只读层。每个Docker镜像引用了一个表示文件系统差异的只读层列表。可以将其类比为Java应用程序的jar文件,创建一个jar文件后,可以在任何启用Java运行时的环境中部署它。

    • Docker镜像是一个存档,包含了容器中所有的文件。

    • 可以从同一个Docker镜像创建许多Docker容器。

    • 镜像可以在任何Docker环境中部署并作为容器执行。

    • Docker镜像包含了运行容器所需的一切,包括:

      • 代码
      • 运行时
      • 环境变量
      • 配置文件

      Docker镜像

  • 什么是容器?

    • 容器是一种标准的软件单元,它封装了代码及其所有依赖项,使得应用可以在不同计算环境中快速可靠地运行。

    • Docker容器镜像是一种轻量级、独立且可执行的软件包,包含了运行应用所需的一切:代码、库、设置等。

    • 容器镜像在运行时变成容器。对于Docker容器来说,镜像在Docker引擎上运行时变成容器。

    • 容器共享宿主机的操作系统内核,因此不需要为每个应用分配操作系统。

    • 应用在容器中更安全,Docker提供了业界最强的默认隔离能力。

    • Docker容器是从Docker镜像创建的实际运行单元。Docker镜像和Docker容器之间的唯一区别是一个可写的顶层。当你创建一个新的容器时,会在底层堆栈之上添加一个新的薄写层。这个层通常被称为“容器层”。所有对正在运行的容器所做的更改——如写入新文件、修改现有文件或删除文件——都会写入这个薄可写的容器层。但是,一旦你删除容器,这个顶层层也会被删除。所以它不是持久化的。Docker最好的一点是,你可以使用当前的Docker容器创建一个新的Docker镜像,从而捕获系统信息并使其不可变,这样可以在任何地方复现。这解决了我们今天遇到的许多服务器相关问题。

    Docker容器

  • 容器与虚拟机的区别

    • 当谈到容器化时,经常会与虚拟机进行比较。让我们看看下面的图片,了解它们的主要区别:

    • Docker容器平台始终运行在宿主操作系统之上。容器包含二进制文件、库和应用程序本身。容器不包含来宾操作系统,这确保了容器的轻量级特性。

    • 相比之下,虚拟机运行在管理程序(负责运行虚拟机)之上,并包含自己的来宾操作系统。这显著增加了虚拟机的大小,使得设置虚拟机更加复杂,并且需要更多的资源来运行每个虚拟机。

    容器与虚拟机

  • Dockerfile

    • Docker镜像的蓝图(文本文档)称为Dockerfile。此文件包含构建所需Docker镜像的所有命令。Docker可以读取此文件来构建镜像,这是Docker的一个关键优势。
    # Super simple example of a Dockerfile FROM ubuntu:latest MAINTAINER Tikam Alma RUN apt-get update RUN apt-get install -y python python-pip wget RUN pip install Flask ADD hello.py /home/hello.py WORKDIR /home
    • 我们首先编写Dockerfile,就像定义镜像一样。使用Dockerfile我们可以创建一个Docker镜像。然后我们将此镜像推送到Docker Hub,并提供一个唯一的标签,以便识别我们的镜像。使用这个标签和镜像名称,我们可以在另一台计算机上拉取Docker镜像并作为Docker容器部署。

容器的工作原理深入解析

  • “容器”这个词实际上只是一个抽象的概念,用来描述几种不同功能如何协同工作以实现“容器”这一概念。让我们快速回顾一下这些功能:
    1. 命名空间
    • 命名空间为容器提供了独立于底层Linux系统的视图,限制了容器能够访问的内容。当你运行一个容器时,Docker会为该特定容器创建命名空间。

    • Linux内核中有几种类型的命名空间,Docker会使用其中一些,例如:

      • a. NET:为容器提供独立于系统的网络堆栈视图(例如,其自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等)。

      • b. PID:PID代表进程ID。如果你曾经在命令行中运行过ps aux来检查系统上运行的进程,你会看到一个名为“PID”的列。PID命名空间为容器提供了独立的进程视图,包括独立的init(PID 1),它是“所有进程的祖先”。

      • c. MNT:为容器提供独立于系统的“挂载”视图。因此,不同挂载命名空间中的进程对文件系统层次结构有不同的视图。

      • d. UTS:UTS代表UNIX时间共享系统。它允许进程标识系统标识符(即主机名、域名等)。UTS允许容器具有独立于其他容器和宿主机系统的主机名和NIS域名。

      • e. IPC:IPC代表进程间通信。IPC命名空间负责隔离每个容器内部运行的进程间的IPC资源。

      • f. USER:这个命名空间用于隔离每个容器内的用户。它通过允许容器具有与宿主机系统不同的用户ID(uid)和组ID(gid)范围来实现功能。结果是,进程的uid和gid在容器内外可能不同,这也允许进程在容器外部拥有非特权用户而不牺牲容器内的root权限。

    1. 控制组
      • 控制组(也称为cgroups)是Linux内核的一个特性,用于隔离、优先级排序和记录一组进程的资源使用情况(CPU、内存、磁盘I/O、网络等)。在这种意义上,cgroup确保Docker容器只使用它们需要的资源——如果需要,还可以设置容器可以使用的资源上限。cgroup还确保单个容器不会耗尽这些资源之一并导致整个系统崩溃。
    1. 隔离的联合文件系统:
      • Docker使用联合文件系统来构建镜像。你可以将联合文件系统想象为一种堆叠式文件系统,这意味着来自不同文件系统(称为分支)的文件和目录可以透明地叠加形成一个单一文件系统。

      • 叠加分支中具有相同路径的目录被视为一个合并的目录,避免了每次使用镜像创建和运行新容器时都需要创建单独副本的需求。相反,它们都可以指向同一资源;当某些层需要修改时,它会创建一个副本并在本地进行修改,而原始层保持不变。这就是文件系统可以“看起来”可写但实际上不允许写入的方式。(换句话说,这是一种“写时复制”系统。)

      • 分层系统提供了两个主要好处:

          1. 无重复:层帮助避免每次使用镜像创建和运行新容器时都复制完整的一组文件,使得Docker容器的实例化非常快速且廉价。
          1. 层分离:修改更快——当你修改镜像时,Docker只会将更新传播到已更改的层。

声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。


发布者: 作者: 转发
评论区 (0)
U