使用 Docker 支持创建 ASP.NET Core 应用程序






4.62/5 (12投票s)
在本文中,我们将了解如何为 ASP.NET Core 应用程序利用 Docker。
背景
这个时髦的词‘Docker’是什么意思?让我们来了解一下。
在图片中,我们可以看到海豚快乐地驮着许多箱子。这些箱子被称为容器,它们包含运行我们的软件所需的一切,而 Docker 就是提供这种容器化技术的平台。从技术上讲,容器只不过是虚拟机镜像。
上图描绘了传统虚拟机镜像与容器的对比。两张图片都有相同的底层基础——基础设施(可以看作是服务器),然后是操作系统。在第一张图中,Hypervisor 是一个虚拟框,可以是任何虚拟化软件,如 Hypervisor、VMware 等,并承载所有客户操作系统。此外,这些客户操作系统包含源代码和二进制文件以及应用程序。而在第二张图,也就是容器环境,则只有 Docker Engine,没有客户操作系统。那么,操作系统在哪里呢?
不用担心。它在那里。Docker Engine 本身内部包含一个小的操作系统,它将所有内容作为容器包含在内。这意味着这个小内核被它之上的每一个应用程序/二进制文件共享。
总而言之,我们可以说 Docker 是虚拟机的轻量级替代方案,因为它不需要 Hypervisor。
Docker 包含什么?
Docker 包含操作系统、源代码、环境变量(如果有)以及运行软件所需的依赖组件。所以,如果有人想运行你的软件,他们可以直接获取容器并开始使用,而无需费力进行机器设置来让一切正常工作。
我们为什么需要它?
很多时候,你一定听过开发者说——“它在我机器上运行正常,但我不知道你的机器上缺少什么”或者“为什么同一个软件在你的机器上就不能运行?”这类讨论通常在测试阶段出现,根据我个人的经验,有时需要花费数小时才能找到那个被遗漏的小依赖。这时,Docker 就派上用场了。由于它是容器化的,每一个依赖项都以容器的形式打包,并且同时适用于 Linux 和 Windows。因此,使用该软件的每个人都将拥有相同的环境。基本上,Docker 的概念彻底解决了环境不匹配的问题。是不是很棒?
创建具有 Docker 支持的 ASP.NET Core 应用程序
打开 Visual Studio,选择 **新建项目**,然后选择 **ASP.NET Core Web 应用程序**,如下图所示。
点击 **确定** 后,您将看到如下屏幕,您需要勾选“**启用 Docker 支持(需要 Docker for Windows)**”复选框,并将操作系统选择为“**Windows**”。
还有一个超链接“**需要 Docker for Windows**”,可用于安装适用于 Windows 的 Docker。如果您在开始此练习之前没有安装 Docker,现在可以通过点击此超链接进行安装。您还可以通过在 Windows PowerShell 中键入以下命令来验证 Docker 安装。
Docker –version
应用程序创建后,您会在应用程序中看到一个名为 Dockerfile 的文件。此时,如果愿意,您可以更改应用程序的视图。
什么是 Dockerfile?
导航到解决方案资源管理器,您会看到 Dockerfile 包含类似以下内容:
FROM microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1803 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/dotnet:2.1-sdk-nanoserver-1803 AS build
WORKDIR /src
COPY ["ContainerBasedApp/ContainerBasedApp.csproj", "ContainerBasedApp/"]
RUN dotnet restore "ContainerBasedApp/ContainerBasedApp.csproj"
COPY . .
WORKDIR "/src/ContainerBasedApp"
RUN dotnet build "ContainerBasedApp.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "ContainerBasedApp.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ContainerBasedApp.dll"]
Dockerfile 是一个包含一些命令的文本文件。这些命令用于创建 Docker 镜像。让我们简要介绍一下这些命令。
FROM
– 这为后续指令设置了基础镜像,我们的基础镜像是dotnet:2.1-aspnetcore
。WORKDIR
– 这为存储使用给定命令生成的输料设置了工作目录。EXPOSE
– 这告知 Docker 容器正在监听指定的端口。COPY
– 这会将文件/文件夹从源路径复制到目标路径。RUN
– 在给定的镜像上执行给定的命令。ENTRYPOINT
– 这会将容器设置为可执行文件运行。
有关 Dockerfile 的更多信息,请在此处找到 这里。
从 Dockerfile 生成 Docker 镜像
Dockerfile 用于创建 Docker 镜像,因为它包含构建镜像所需的所有必要信息。Build
命令用于从 Docker 文件创建镜像。现在,可以通过 Visual Studio UI 或 CLI 来生成镜像。让我们在这里看一下 Visual Studio 的路径。
右键单击项目,然后单击 **发布…**。
接下来是创建一个容器注册表,它将部署和存储 Docker 镜像,在这里,我们将选择 Docker Hub,如下所示。
单击 **创建配置文件** 按钮后,将出现以下对话框,您需要在其中提供凭据以连接到 **Docker Hub**。
如果一切都正确完成,将出现以下屏幕。
现在单击 **发布** 按钮。它将启动 Docker 可执行文件并执行 Dockerfile 中写的每一行。
成功发布后,您将在输出窗口中看到一条消息“**已成功标记 containerbasedapp:latest**”。但也可以在 Docker 网站上进行验证,如下所示。
也可以通过命令提示符进行验证。
现在是时候运行应用程序并验证我们是否可以看到网页了。为此,只需从 Visual Studio 运行应用程序,您就能看到您的视图。这是我从我的示例应用程序中看到的内容。
在这里,您可以看到您的应用程序正在 Docker 中运行。
容器化现有的多层应用程序
根据应用程序的结构,无论是单个独立应用程序还是包含多个服务的应用程序,都可以引入容器化。根据应用程序的不同,有时单个容器就足够了,有时则需要为每个服务或组件创建一个容器。要为现有应用程序启用 Docker 部署,请转到 **解决方案资源管理器**,右键单击项目,选择 **添加**,然后选择 **Docker 支持**,如下图所示。
执行上述操作后,将添加 Docker 所需的文件。现在让我们来了解一下 docker-compose
。
Docker-Compose
Docker-Compose
是一个用于定义和运行多容器应用程序的工具。这个工具最棒的地方在于,它使用的命令与 Docker 相同,这意味着我们不需要记住任何特殊的命令来使用这个工具。使用这个工具有多种方法,但在这篇文章中,我将采用 yml 文件的方式。以下是创建 yml 文件的步骤。
安装 Docker Compose 工具
在安装 Docker 时,该工具会自动安装在 Mac 和 Windows 上。但在 Linux 上,它需要显式安装,可以使用此处提到的命令进行安装 这里。工具安装完成后,可以使用以下命令进行验证。
决定 yml 文件的存储位置
我们可以将 yml 文件存储在磁盘上的任何位置。所以,让我们在您的机器上创建一个文件夹,并在其中创建一个空的 yml 文件。
向 yml 文件添加内容
现在,在向此文件添加内容之前,我们需要决定我们的主要组件或说应用程序的组成部分。例如,假设我们需要创建一个 Web 应用程序。因此,为此,最低要求是 Web 服务器和数据库服务器。通过访问此 链接,可以选择 Web 服务器和数据库服务器镜像。 在这里,我选择 Windows IIS 作为 Web 服务器,并选择 MYSQL 作为我的数据库。下面是使用此处提到的命令拉取 IIS 镜像的截图 here。
同样,如果数据库服务器镜像尚未在您的机器上,您也可以拉取它。相应地,我已经更新了我的 yml 文件,如下所示。
验证 yml 文件
文件创建后,下一步是验证我们的 yml 文件。转到保存 yml 文件的目录,并使用 CLI 运行以下命令。
如果您可以看到文件内容,则意味着一切正常。
一些有用的命令
运行 yml 文件并创建应用程序中容器的命令。
docker-compose up
停止所有正在运行的容器的命令。
docker-compose down
请注意,本文创建的 yml 文件只包含最少的信息,不足以用于实际的生产项目。在实际项目中,我们可能需要提供更多信息,如端口、卷等。完整信息可以在这里找到 here。
主要收获
容器提供了打包和完成应用程序及其所有必需依赖项的能力,这意味着该应用程序将在任何其他机器上运行,而无需考虑任何设置。一句话,我们可以总结一切——Dockerfile 是部署脚本,镜像是一个打包好的应用程序,注册表是一个镜像存储库,而容器是运行应用程序的虚拟环境。
参考文献
- https://docs.dockerd.com.cn/engine/reference/commandline/docker/
- https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/
- https://blog.netapp.com/blogs/containers-vs-vms/
历史
- 2019 年 8 月 14 日:初始版本