练习 - 自定义 Docker 映像来运行自己的 Web 应用
Dockerfile 包含生成自定义 Docker 映像的步骤。
你决定使用 Docker 部署组织的一个 Web 应用。 选择一个可实现酒店预订网站的 Web API 的简单 Web 应用。 Web API 公开创建和检索客户预订的 HTTP POST 和 GET 操作。
注意
在此版本的 Web 应用中,预订不会实际保留,查询返回虚拟数据。
在本练习中,将为没有 Dockerfile 的应用创建 Dockerfile。 然后,将在本地生成和运行映像。
为 Web 应用创建 Dockerfile
如果尚未运行,请在计算机上启动 Docker。
在本地计算机上的命令提示窗口中,运行以下命令来下载 Web 应用的源代码。
git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
输入以下命令以打开
src
目录。cd mslearn-hotel-reservation-system/src
在
src
目录中,输入以下命令以创建名为Dockerfile
的新文件,并在记事本中打开它:copy NUL Dockerfile notepad Dockerfile
注意
默认情况下,记事本命令会打开一个文本文件。 确保将其另存为没有文件扩展名的“所有文件”文件类型。 若要验证,请在文件资源管理器中打开 src 文件夹,选择“查看”>“显示”>“文件扩展名”。 如有必要,请重命名该文件并从文件名中删除
.txt
。将以下代码添加到 Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 WORKDIR /src COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"] COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"] RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
此代码的命令提取包含 .NET Core Framework SDK 的映像。 Web 应用的项目文件 (
HotelReservationSystem.csproj
) 和库项目 (HotelReservationSystemTypes.csproj
) 已复制到容器中的/src
文件夹。dotnet restore
命令将从 NuGet 下载这些项目所需的依赖项。将以下代码追加到 Dockerfile 的底部:
COPY . . WORKDIR "/src/HotelReservationSystem" RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
这些命令将 Web 应用的源代码复制到容器,然后运行 dotnet build 命令生成应用。 生成的 DLL 将写入容器中的
/app
文件夹。在 Dockerfile 的底部附加以下命令。
RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
dotnet publish
命令将网站的可执行文件复制到新文件夹中,并删除任何临时文件。 然后可以将此文件夹中的文件部署到网站。将以下命令附加到 Dockerfile 的底部。
EXPOSE 80 WORKDIR /app ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
第一个命令打开容器中的端口 80。 第二命令移动到包含 Web 应用的已发布版本的
/app
文件夹。 最后一个命令指定当容器运行时它应该执行命令dotnet HotelReservationSystem.dll
。 此库包含 Web 应用的已编译代码。保存文件并关闭文本编辑器。 确保将其另存为没有文件扩展名的“所有文件”文件类型。
使用 Dockerfile 生成和部署映像
在命令提示符下,运行以下命令以使用 Dockerfile 生成示例应用的映像。 不要忘记命令末尾的
.
。 此命令生成映像并将其存储在本地。 映像命名为reservationsystem
。 验证映像是否已成功生成。 过程完成后,将显示有关文件和目录权限的警告。 由于此练习的目的,可以忽略此警告。 可能需要一段时间才能生成映像。docker build -t reservationsystem .
运行以下命令以验证映像是否已创建并存储在本地注册表中:
docker image list
该映像将具有名称
reservationsystem
。 还会看到名为 microsoft/dotnet 的映像:REPOSITORY TAG IMAGE ID CREATED SIZE reservationsystem latest d2501f0f2ced About a minute ago 1.76GB
测试 Web 应用
输入以下代码,运行使用
reservationsystem
映像的容器。 Docker 将返回一个十六进制数字的长字符串。 容器在后台运行,没有任何 UI。 容器中的端口 80 映射到主机上的端口 8080。 容器名为reservations
。docker run -p 8080:80 -d --name reservations reservationsystem
启动 Web 浏览器并导航到
http://localhost:8080/api/reservations/1
。 你应会看到一个 JSON 对象,其中包含预留编号 1 的数据,类似于以下输出:将 localhost URL 末尾的“1”替换为不同的预留编号(如 2 或 20),查看相应的预留详细信息。
运行以下命令以查看容器的状态:
docker ps -a
输出列出了所有可用容器的以下内容:
- 容器 ID
- 图像
- 命令
- 创建时间
- 状态
- 端口
- NAMES
验证容器的
STATUS
是否为“Up”。CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07b0d1de4db7 reservationsystem "dotnet HotelReserva…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp reservations
输入以下命令以停止 reservations 容器:
docker container stop reservations
从本地注册表中删除“预订”容器。
docker rm reservations
将 reservationsystem 保留在本地注册表中。 下一练习中将使用此映像。
恭喜! 已为 Web 应用创建映像并使用 Docker 容器运行它。