初学者理解和构建Docker映像的指南
Docker镜像是一个只读模板,它包含一组用于创建可以在Docker平台上运行的容器的指令。它提供了一种方便的方式来打包应用程序和预配置的服务器环境,您可以将其用于自己的私人用途,也可以与其他Docker用户公开共享。Docker映像也是任何第一次使用Docker的人的起点。
所以,在这篇介绍中,我们不仅会带你了解Docker映像的基础知识,还会告诉你在哪里可以找到现成的映像,让你在构建自己的容器化应用程序、工具和服务时领先一步。
作为Docker的新用户,您还需要了解如何构建自己的自定义映像。因此,我们将简要介绍如何创建Docker映像来部署代码和组装基于容器的服务。但首先让我们更详细地看看Docker映像的组成。
Docker映像的解剖
Docker映像由一组文件组成,这些文件将所有的基本内容捆绑在一起,例如安装,应用程序代码,依赖关系-需要配置一个完全可操作的容器环境。您可以使用以下两种方法之一创建Docker映像:
- 互动:通过从现有的Docker映像运行容器,通过一系列活动步骤手动更改容器环境,并将结果状态保存为新映像。
- Dockerfile:通过构造一个纯文本文件,称为Dockerfile,它提供了创建Docker映像的规范。
在本指南的后面部分,我们将更详细地介绍这两个方法。现在,让我们关注最重要的Docker映像概念。
图像层
组成Docker映像的每个文件都被称为层.这些层形成了一系列的中间的图片在这个过程中,每一层都依赖于它下面的一层。的层次结构是Docker映像有效生命周期管理的关键。因此,您应该将变化最频繁的层组织在堆栈的尽可能高的位置。这是因为,当您对映像中的某个层进行更改时,Docker不仅会重建该特定层,还会重建从该层构建的所有层。因此,对堆栈顶部的一层进行更改所涉及的重建整个图像的计算工作量最少。
容器层
每次Docker从映像启动容器时,它都会添加一个薄的可写层,称为容器层,该层在运行时存储容器的所有更改。由于这一层是活动操作容器和源Docker映像本身之间的唯一区别,因此任何数量的同类容器都可以潜在地共享对相同底层映像的访问,同时保持各自的状态。
基于相同映像的容器共享该映像,从而减少资源开销
父母的形象
在大多数情况下,Docker映像的第一层被称为父映像。它是构建所有其他层的基础,并为容器环境提供基本的构建块。上可以找到各种现成的图像作为父图像使用公共容器注册Docker Hub.您还可以在少量第三方服务上找到它们,例如谷歌集装箱注册处.或者,您也可以使用自己现有的映像作为创建新映像的基础。
典型的父映像可能是精简的Linux发行版,或者带有预安装的服务,例如数据库管理系统或者一个内容管理系统(CMS).
基地图片
简单来说,基本映像是一个空的第一层,它允许你从头开始构建Docker映像。基本图像让你完全控制图像的内容,但通常是针对更高级的Docker用户。
码头工人清单
除了一组单独的层文件外,Docker映像还包括一个称为清单的附加文件。这本质上是对图像的描述JSON格式和包含诸如图像标记、数字签名以及关于如何为不同类型的主机平台配置容器的详细信息。
容器注册
容器注册中心是存储位置的目录,称为存储库,在这里你可以推和拉容器图像。三种主要的注册表类型是:
- 码头工人中心: Docker自己的官方图像资源,在这里您可以访问由软件供应商、开源项目和Docker的用户社区共享的超过100,000个容器图像。您还可以使用该服务托管和管理您自己的私有映像。
- 第三方注册服务:完全托管的产品,作为访问您自己的容器映像的中心点,提供了一种存储、管理和保护它们的方法,而不用担心运行自己的本地注册表的操作问题。支持Docker映像的第三方注册中心产品示例包括Red Hat Quay、Amazon ECR、Azure容器注册中心、谷歌容器注册中心和JFrog货柜注册处.
- 自托管登记:喜欢在自己的本地基础设施上托管容器映像的组织所青睐的注册中心模型——通常是出于安全性、遵从性考虑或较低的延迟需求。要运行自己的自托管注册表,需要部署一个注册表服务器。或者,您可以设置自己的私有、远程和虚拟码头工人注册表.
容器存储库
容器存储库是Docker映像实际存储的特定物理位置,其中每个存储库由具有相同名称的相关映像集合组成。存储库中的每个映像都由不同的标记单独引用,并表示基本上相同的容器部署的不同版本。例如,在Docker Hub上,mysql是存储库的名称,它包含流行的开源DBMS MySQL的不同版本的Docker映像。
如何创建Docker镜像
在最后一节中,我们将更详细地介绍创建Docker映像的两种不同方法,这样你就可以开始将你的知识应用到实践中了。
互动的方法
下面是一组交互式创建图像的简化步骤:
- 安装Docker并启动Docker引擎
- 打开终端会话
- 使用以下方法码头工人运行命令启动交互式shell会话,并从指定的映像启动容器image_name: tag_name:
运行-it image_name:tag_name bash
如果省略标签名,Docker将自动提取最新的图像版本,该版本由最新标签标识。如果Docker无法在本地找到映像,那么它将从Docker Hub上适当的存储库中提取构建容器所需的内容。
在我们的例子中,我们将启动一个基于Ubuntu最新版本的容器环境:
运行ubuntu bash
- 现在,通过安装所需的所有框架、依赖项、库、更新和应用程序代码来配置容器环境。下面是添加NGINX服务器的简单示例:
# apt-get update && apt-get install
接下来,您需要知道正在运行的容器实例的名称或ID。
- 打开另一个Bash shell,输入以下docker ps命令来列出活动的容器进程:
$ docker ps
下面的示例输出显示了使用ID运行的容器e61e8081866d还有名字keen_gauss:
容器id镜像命令创建状态端口名称
e61e8081866d ubuntu " bash " 2分钟前Up 2分钟
这个名称是由Docker守护进程随机生成的。但是您也可以使用-来指定自己的名称,从而用更有意义的东西来标识容器名操作员在码头工人运行命令。
- 方法保存图像码头工人承诺命令,指定你想创建它的容器的ID或名称:
$ docker commit keen_gauss ubuntu_testbed
在上面的例子中,我们提供了容器的名称,并调用了生成的图像ubuntu_testbed.
- 现在,使用码头工人的图片命令查看刚刚创建的映像:
$ docker图像
您应该在结果中看到您的新图像。
存储库标记映像id创建大小
ubuntu latest 775349758637 5 minutes ago 64.2MB
- 最后,回到交互式容器外壳和类型退出关闭它。
#退出
Dockerfile方法
Dockerfile方法是现实世界企业级容器部署的首选方法。它是构建Docker映像的一种更系统、更灵活、更高效的方式,也是紧凑、可靠和安全的容器环境的关键。
简而言之,Dockerfile方法是一个三步过程,在此过程中创建Dockerfile并添加组装映像所需的命令。
下表显示了你最可能使用的Dockerfile语句:
例子Dockerfile
这是一个Dockerfile的例子,用于在安装Nginx的Ubuntu 18.04上构建一个镜像
接下来,我们将设置一个.dockerignore文件列出在Docker构建过程中创建的任何文件,您希望从最终构建中排除这些文件。
.dockerignore文件在创建更紧凑、运行更快的容器方面发挥着重要作用——它提供了一种防止敏感或不必要的文件和目录进入映像构建的方法。你的.dockerignore文件应该位于根目录中,即构建目录上下文,你打算以此来建立你的形象。目录中指定的当前工作目录或路径码头工人建造命令,我们将在下面讨论。
Docker构建上下文
现在使用Docker build命令创建Docker映像。使用- t国旗设置图片名称和标签。
-t my-nginx:0.1
在上面的示例中,我们从与Dockerfile和上下文相同的目录中构建映像。参数只是告诉Docker守护进程从当前工作目录中的文件和文件夹构建映像。
最后,正如我们在交互方法中看到的,您可以使用码头工人的图片命令查看刚刚创建的映像。
$ docker图像
存储库标记映像id创建大小
我的nginx 0.1 f95ae2e1344b 10秒前
ubuntu 18.04 ccc6e87d482b 12天前64.2MB
同样,您应该在结果中看到您的新图像。
了解更多关于Docker的信息
发布日期:2020年6月29日
最后更新:2021年3月17日