自定义 Docker 映像以运行自己的 Web 应用

已完成

Docker 中心是非常优质的映像源,可帮助你开始构建自己的容器化应用。 你可以下载提供你所需基本功能的映像,然后在它的基础上添加自己的应用程序以创建新的自定义映像。 可以通过编写 Dockerfile 自动执行完成此过程的步骤。

在线上服装商店的场景中,公司决定将 Docker 设定为发展方向。 下一步是确定容器化 Web 应用程序的最佳方式。 该公司计划使用 ASP.NET Core 生成许多应用。 你已经注意到 Docker Hub 具有包含此框架的基础映像。 作为概念证明,你希望从此基本映像开始,并添加一个 Web 应用的代码来创建新的自定义映像。 你还希望此过程可以轻松地重复执行,以便在每次发布 Web 应用的新版本时,都能自动执行此过程。

在本单元中,你将学习如何创建自定义 Docker 映像,以及如何通过编写 Dockerfile 来自动执行此过程。

使用 Dockerfile 创建自定义映像

若要创建包含应用程序的 Docker 映像,通常首先是确定要添加文件和配置信息的基本映像。 确定合适的基础映像的过程通常从 Docker Hub 上的映像搜索开始。 你需要一个已包含应用程序框架以及 Linux 发行版(如 Ubuntu 或 Alpine)的所有实用程序和工具的映像。 例如,如果有想要打包到容器中的 ASP.NET Core 应用程序,则 Microsoft 会发布已包含 ASP.NET Core 运行时且名称为 mcr.microsoft.com/dotnet/core/aspnet 的映像。

在自定义映像时,可以首先使用具有基本映像的容器,然后再对其进行更改。 更改通常会涉及多种活动,例如将文件从本地文件系统复制到容器,以及运行各种工具和实用程序来编译代码。 完成后,使用 docker commit 命令将更改保存到新的映像。

手动完成上述过程非常耗时且容易出错。 虽然可以使用脚本语言(例如 Bash)编写此过程,但 Docker 通过 Dockerfile 提供一种更加高效的自动映像创建方式。

Dockerfile 是包含生成映像所需的全部命令的纯文本文件。 Dockerfile 使用专为生成和配置映像设计的最小化脚本语言编写。 它们记录从基础映像开始生成映像所需的操作。

以下示例演示生成 .NET Core 2.2 应用程序并将其打包为新映像的 Dockerfile。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY myapp_code .
RUN dotnet build -c Release -o /rel
EXPOSE 80
WORKDIR /rel
ENTRYPOINT ["dotnet", "myapp.dll"]

在此文件中,执行以下操作:

命令 操作
FROM 下载指定的映像,并创建基于此映像的新容器。
WORKDIR 在容器中设置当前工作目录,供后续命令使用。
复制 将文件从主机计算机复制到容器。 第一个参数 (myapp_code) 是主计算机上的文件或文件夹。 第二个参数 (.) 指定文件或文件夹的名称来充当容器中的目标位置。 在本例中,目标位置是当前工作目录 (/app)。
运行 在容器中执行命令。 RUN 命令的参数是命令行命令。
EXPOSE 在新映像中创建一个配置,用于指定容器运行时要打开的端口。 如果容器运行 Web 应用,则通常会通过 EXPOSE 命令指定端口 80。
ENTRYPOINT 指定容器启动时应该运行的操作。 在本示例中,它运行新生成的应用。 指定要运行的命令,并将每个参数都指定为字符串数组。

按照约定,应打包为 Docker 映像的应用程序的源代码根目录中通常具有 Dockerfile,且几乎都命名为 Dockerfile

docker build 命令通过运行 Dockerfile 创建新映像。 此命令的语法有多个参数:

  • -f 标志指示要使用的 Dockerfile 的名称。
  • -t 标志指定要创建的映像的名称,在本示例中为 myapp:v1。
  • 最后一个参数 . 为 COPY 命令的源文件提供生成上下文:生成过程中所需的主计算机上的文件集。
docker build -t myapp:v1 .

在后台,docker build 命令创建容器,并在其中运行命令,然后将所做的更改提交到新映像。