理解和构建Docker映像的初学者指南

爱德华Kisller
2021-05-04福音11:24

用户添加图片

最后更新:2021年3月17日

Docker映像是一个只读模板,它包含一组用于创建可以在Docker平台上运行的容器的指令。它提供了一种方便的方式来打包应用程序和预配置的服务器环境,您可以将其用于自己的私人使用或与其他Docker用户公开共享。Docker映像也是第一次使用Docker的人的起点。

因此,在这篇介绍中,我们不仅将带您了解Docker映像的基础知识,还将向您展示在哪里可以找到现成的映像,这些映像将使您在构建自己的容器应用程序、工具和服务时处于领先地位。

作为Docker的新用户,您还需要了解如何构建自己的自定义映像。因此,我们将简要介绍如何创建用于部署代码和组装基于容器的服务的Docker映像。但首先让我们更详细地看看Docker映像的组成。


基础:Docker初学者指南


剖析Docker映像

Docker映像由一组文件组成,这些文件将所有的基本内容捆绑在一起——例如安装应用程序代码,依赖关系-需要配置一个完全运行的容器环境。您可以使用以下两种方法之一创建Docker映像:

  • 互动:从现有Docker映像运行容器,通过一系列实时步骤手动更改容器环境,并将结果状态保存为新映像。
  • Dockerfile:通过构造一个纯文本文件,称为Dockerfile,它提供了创建Docker映像的规范。

我们将在本指南后面更详细地讨论这两个方法。现在,让我们关注最重要的Docker图像概念。

图像层

组成Docker映像的每个文件都称为.这些层形成了一系列的中间的图片每一层都是分阶段建立在另一层之上的,每一层都依赖于它的下一层。的层次结构是Docker映像的有效生命周期管理的关键。因此,应该将变化最频繁的层组织在堆栈的最上层。这是因为,当您对映像中的某个层进行更改时,Docker不仅会重建该特定层,还会重建从该层构建的所有层。因此,对堆栈顶部的一层的更改所涉及的重建整个图像的计算工作量最少。

容器层

Docker每次从映像启动一个容器时,都会添加一个薄的可写层,称为容器层,该层在运行时期间存储对容器的所有更改。由于这一层是活动操作容器和源Docker映像本身之间的唯一区别,因此任何数量的同类容器都可以潜在地共享对相同底层映像的访问,同时保持各自的单独状态。

用户添加图片

基于相同映像的容器共享该映像,从而减少了资源开销

父母的形象

在大多数情况下,Docker映像的第一层称为父映像。它是构建所有其他层的基础,并为容器环境提供基本的构建块。上可以找到各种现成的图像作为父映像使用公共容器注册表码头工人中心.您也可以在少量的第三方服务上找到它们,例如谷歌容器注册表.或者,您可以使用自己的一个现有映像作为创建新映像的基础。

典型的父映像可能是精简的Linux发行版,或者带有预安装的服务,例如数据库管理系统或者一个内容管理系统(CMS)

基地图片

简单地说,基本映像是一个空的第一层,它允许您从零开始构建Docker映像。基本映像使您可以完全控制映像的内容,但通常适用于更高级的Docker用户。

码头工人清单

除了一组单独的层文件外,Docker映像还包括一个附加文件,称为清单。这本质上是对图像的描述JSON格式,包括图像标记、数字签名等信息,以及关于如何为不同类型的主机平台配置容器的详细信息。用户添加图片


扫描您的Docker映像免费使用JFrog CLI,只需3个简单的步骤

扫描您的Docker图像


容器注册

容器注册表是存储位置的目录,称为存储库,在那里您可以推和拉容器图像。三种主要的注册表类型是:

  • 码头工人中心: Docker自己的官方图像资源,在这里您可以访问由软件供应商、开源项目和Docker用户社区共享的超过10万张容器图像。您还可以使用该服务托管和管理您自己的私有映像。
  • 第三方注册服务:完全托管的产品,作为访问您自己的容器映像的中心点,提供了一种存储、管理和保护它们的方法,而无需运行自己的本地注册表。支持Docker映像的第三方注册中心产品的例子包括Red Hat Quay、Amazon ECR、Azure容器注册中心、谷歌容器注册中心和JFrog容器Regi士的宁
  • 自托管登记:一种注册表模型,受到那些喜欢在自己的内部基础设施上托管容器映像的组织的青睐——通常是出于安全性、遵从性方面的考虑或较低的延迟需求。要运行自己的自托管注册中心,需要部署注册中心服务器。或者,您可以设置自己的私有、远程和虚拟码头工人注册表

步骤指南:建立一个免费的私有Docker注册表


容器存储库

容器存储库是Docker映像实际存储的特定物理位置,每个存储库由一组同名的相关映像组成。存储库中的每个映像都由不同的标记单独引用,并表示基本相同的容器部署的不同版本。例如,在Docker Hub上,mysql是一个存储库的名称,它包含流行的开源DBMS MySQL的不同版本的Docker映像。

如何创建Docker映像

在最后一节中,我们将更详细地介绍创建Docker映像的两种不同方法,这样您就可以开始将您的知识应用到实践中了。

互动的方法

优点:创建Docker映像的最快、最简单的方法。非常适合于测试、故障排除、确定依赖性和验证流程。

缺点:困难的生命周期管理,需要对实时交互过程进行容易出错的手动重新配置。更容易创建非优化的图像与不必要的层。

以下是交互式创建图像的一组简化步骤:

  • 安装Docker并启动Docker引擎
  • 打开终端会话
  • 使用下面的码头工人运行命令使用从指定的映像启动的容器启动交互式shell会话image_name: tag_name

运行- image_name:tag_name bash

如果省略了标记名,那么Docker会自动提取最新的图像版本,该版本由最新标记标识。如果Docker无法在本地找到映像,那么它将从Docker Hub上适当的存储库中提取构建容器所需的内容。

在我们的例子中,我们将启动一个基于Ubuntu最新版本的容器环境:

运行- ubuntu bash

  • 现在,通过安装所需的所有框架、依赖项、库、更新和应用程序代码来配置容器环境。下面是添加NGINX服务器的简单示例:

# apt-get update && apt-get install -y nginx

接下来,您需要知道正在运行的容器实例的名称或ID。

  • 打开另一个Bash shell,输入以下docker ps命令,列出活动的容器进程:

码头工人ps美元

下面的示例输出显示了带有ID的正在运行的容器e61e8081866d和名字keen_gauss

Container id image命令创建状态端口名称

ubuntu“bash”2分钟前Up 2分钟

这个名称是由Docker守护进程随机生成的。但是您也可以使用更有意义的东西来标识您的容器,方法是使用-来分配您自己的名称名操作员码头工人运行命令。

  • 方法保存图像码头工人承诺命令,指定要创建它的容器的ID或名称:

$ docker commit keen_gauss ubuntu_testbed

在上面的例子中,我们提供了容器的名称并调用了生成的图像ubuntu_testbed

  • 现在,使用码头工人的图片命令查看您刚刚创建的映像:

码头工人美元图片

您应该会在结果中看到新映像的列表。

存储库标签图像id创建的大小
64.2MB

  • 最后,返回到交互式容器外壳并输入退出关闭它。

#退出

Dockerfile方法

优点:干净,紧凑和可重复的基于食谱的图像。更容易的生命周期管理,更容易集成到持续集成(CI)和持续交付(CD)过程中。清晰的自我记录的步骤,采取了装配图像。

缺点:对初学者来说更困难,从头开始创建更耗时。

Dockerfile方法是实际的企业级容器部署的首选方法。它是构建Docker映像的一种更系统、更灵活和更有效的方法,也是紧凑、可靠和安全的容器环境的关键。

简而言之,Dockerfile方法是一个三步过程,您可以在其中创建Dockerfile并添加组装映像所需的命令。

下表显示了你最可能使用的Dockerfile语句:

命令

目的

指定父映像。

WORKDIR

为Dockerfile中后面的任何命令设置工作目录。

运行

安装容器所需的任何应用程序和包。

复制

从特定位置复制文件或目录。

添加

作为COPY,但也能够处理远程url和解压压缩文件。

入口点

命令,该命令将在容器启动时始终执行。如果不指定,默认为/bin/sh -c

CMD

传入入口点的参数。如果没有设置ENTRYPOINT(默认为/bin/sh -c), CMD将是容器执行的命令。

暴露

定义通过哪个端口访问容器应用程序。

标签

向映像添加元数据。

例子Dockerfile

#使用官方的Ubuntu 18.04作为基础
从ubuntu: 18.04
#安装nginx和curl
执行apt-get update &&
Apt-get upgrade -y &&
Apt-get install -y nginx curl &&
rm射频/var/lib/apt/lists/*

这是一个Dockerfile的例子,用于在安装了Nginx的Ubuntu 18.04官方平台上构建镜像

接下来,我们将设置一个dockerignore文件,列出在Docker构建过程中创建的、希望从最终构建中排除的任何文件。

.dockerignore文件在创建更紧凑、运行更快的容器方面发挥着重要作用——它提供了一种防止敏感或不必要的文件和目录进入映像构建的方法。你的.dockerignore文件应该位于根目录中,即构建目录上下文,你打算以此来建立你的形象。的当前工作目录或指定的路径码头工人建造命令,我们将在下面讨论。

用户添加图片

Docker构建上下文

现在使用Docker构建命令创建您的Docker映像。使用- t国旗设置图像名称和标记。

$ docker build -t my-nginx:0.1

在上面的例子中,我们从与Dockerfile和上下文相同的目录中构建映像。参数只是告诉Docker守护进程从当前工作目录中的文件和文件夹构建映像。

最后,正如我们在交互方法中看到的,您可以使用码头工人的图片命令查看刚刚创建的映像。

码头工人美元图片

存储库标签图像id创建的大小

f95ae2e1344b 10秒前138MB

64.2MB

同样,您应该会看到新映像列在结果中。

了解更多关于Docker的信息: