理解和构建Docker映像的初学者指南
在这篇介绍中,我们不仅将带您了解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自己的官方镜像资源,您可以访问由软件供应商,开源项目和Docker用户社区共享的100,000多个容器镜像。您还可以使用该服务来托管和管理您自己的私有映像。
- 第三方注册中心服务:完全托管的产品,作为您自己的容器映像的中心访问点,提供了一种存储、管理和保护它们的方法,而无需运行您自己的本地注册中心的操作问题。支持Docker镜像的第三方注册表产品的例子包括Red Hat Quay、Amazon ECR、Azure Container registry、Google Container registry和JFrog容器注册.
- 自托管登记:一种注册表模型,喜欢在自己的本地基础设施上托管容器映像的组织——通常是出于安全性、遵从性考虑或低延迟需求。要运行自己的自托管注册中心,需要部署注册中心服务器。或者,您可以设置自己的私有、远程和虚拟码头工人注册表.
容器存储库
容器存储库是实际存储Docker映像的特定物理位置,其中每个存储库包含具有相同名称的相关映像的集合。存储库中的每个映像都由不同的标记单独引用,并表示基本相同的容器部署的不同版本。例如,在Docker Hub上,mysql是存储库的名称,其中包含流行的开源DBMS MySQL的不同版本的Docker映像。
如何创建Docker镜像
在最后一节中,我们将更详细地介绍创建Docker映像的两种不同方法,以便您可以开始将您的知识付诸实践。
互动的方法
以下是一组简化的步骤,以交互方式创建图像:
- 安装Docker并启动Docker引擎
- 打开终端会话
- 使用以下命令码头工人运行命令,使用从指定的映像启动的容器启动交互式shell会话image_name: tag_name:
$ docker run -it image_name:tag_name bash
如果你省略了标签名,Docker会自动提取最新的镜像版本,这是由最新的标签标识的。如果Docker在本地找不到映像,那么它将从Docker Hub上的相应存储库中提取构建容器所需的内容。
在我们的例子中,我们将启动一个基于最新版本Ubuntu的容器环境:
$ docker运行- ubuntu bash
- 现在配置容器环境,例如,安装所需的所有框架、依赖项、库、更新和应用程序代码。下面是添加NGINX服务器的简单示例:
# apt-get update && apt-get install -y nginx
接下来,您需要知道正在运行的容器实例的名称或ID。
- 打开另一个Bash shell,输入以下docker ps命令,列出活动的容器进程:
$ docker ps
下面的示例输出显示了带有ID的正在运行的容器e61e8081866d还有名字keen_gauss:
容器id image命令创建status端口名称
e61e8081866d ubuntu " bash " 2分钟前启动2分钟keen_gauss
这个名称是由Docker守护进程随机生成的。但是你也可以用更有意义的东西来标识你的容器,用-来分配你自己的名字名操作员在码头工人运行命令。
- 保存您的图像码头工人承诺命令,指定要创建它的容器的ID或名称:
$ docker commit keen_gauss ubuntu_testbed
在上面的示例中,我们提供了容器的名称,并调用了生成的映像ubuntu_testbed.
- 现在,使用码头工人的图片命令来查看刚刚创建的映像:
$ docker images
您应该会在结果中看到您的新图像。
存储库标记图像id创建的大小
ubuntu最新的7753349758637 5分钟前64.2MB
- 最后,返回到交互式容器shell并键入退出关闭它。
#退出
Dockerfile方法
Dockerfile方法是现实世界中企业级容器部署的首选方法。它是构建Docker映像的一种更系统、更灵活、更有效的方法,也是构建紧凑、可靠和安全的容器环境的关键。
简而言之,Dockerfile方法是一个三步的过程,其中创建Dockerfile并添加组装映像所需的命令。
下表显示了你最可能使用的Dockerfile语句:
例子Dockerfile
一个Dockerfile的例子,用于在安装Nginx的官方Ubuntu 18.04上构建镜像
接下来,我们将设置一个.dockerignore文件列出在Docker构建过程中可能会创建的任何文件,这些文件是您希望从最终构建中排除的。
.dockerignore文件在创建更紧凑、运行更快的容器方面发挥着重要作用——通过提供一种方法来防止敏感或不必要的文件和目录进入映像构建。你的.dockerignore文件应该位于根目录中,称为构建上下文,你打算以此为基础建立自己的形象。文件中指定的路径或当前工作目录码头工人建造命令,我们将在下面讨论。
Docker构建上下文
现在使用Docker build命令来创建Docker镜像。使用- t国旗设置图片名称和标签。
$ docker build -t my-nginx:0.1
在上面的示例中,我们从与Dockerfile和上下文相同的目录中构建映像,如。参数只是告诉Docker守护进程从当前工作目录下的文件和文件夹构建镜像。
最后,正如我们在交互式方法中看到的,您可以使用码头工人的图片命令来查看刚刚创建的映像。
$ docker images
存储库标记图像id创建的大小
my-nginx 0.1 f95ae2e1344b 10秒前138MB
ubuntu 18.04 ccc6e87d482b 12 days ago 64.2MB
同样,您应该在结果中看到您的新图像。