练习 - 自定义 Docker 映像来运行自己的 Web 应用

已完成

Dockerfile 包含生成自定义 Docker 映像的步骤。

你决定使用 Docker 部署组织的一个 Web 应用。 选择一个可实现酒店预订网站的 Web API 的简单 Web 应用。 Web API 公开创建和检索客户预订的 HTTP POST 和 GET 操作。

注意

在此版本的 Web 应用中,预订不会实际保留,查询返回虚拟数据。

在本练习中,将为没有 Dockerfile 的应用创建 Dockerfile。 然后,将在本地生成和运行映像。

为 Web 应用创建 Dockerfile

  1. 如果尚未运行,请在计算机上启动 Docker。

  2. 在本地计算机上的命令提示窗口中,运行以下命令来下载 Web 应用的源代码。

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  3. 输入以下命令以打开 src 目录。

    cd mslearn-hotel-reservation-system/src
    
  4. src 目录中,输入以下命令以创建名为 Dockerfile 的新文件,并在记事本中打开它:

    copy NUL Dockerfile
    notepad Dockerfile
    

    注意

    默认情况下,记事本命令会打开一个文本文件。 确保将其另存为没有文件扩展名的“所有文件”文件类型。 若要验证,请在文件资源管理器中打开 src 文件夹,选择“查看”>“显示”>“文件扩展名”。 如有必要,请重命名该文件并从文件名中删除 .txt

  5. 将以下代码添加到 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 下载这些项目所需的依赖项。

  6. 将以下代码追加到 Dockerfile 的底部:

    COPY . .
    WORKDIR "/src/HotelReservationSystem"
    RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
    

    这些命令将 Web 应用的源代码复制到容器,然后运行 dotnet build 命令生成应用。 生成的 DLL 将写入容器中的 /app 文件夹。

  7. 在 Dockerfile 的底部附加以下命令。

    RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
    

    dotnet publish 命令将网站的可执行文件复制到新文件夹中,并删除任何临时文件。 然后可以将此文件夹中的文件部署到网站。

  8. 将以下命令附加到 Dockerfile 的底部。

    EXPOSE 80
    WORKDIR /app
    ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
    

    第一个命令打开容器中的端口 80。 第二命令移动到包含 Web 应用的已发布版本的 /app 文件夹。 最后一个命令指定当容器运行时它应该执行命令 dotnet HotelReservationSystem.dll。 此库包含 Web 应用的已编译代码。

  9. 保存文件并关闭文本编辑器。 确保将其另存为没有文件扩展名的“所有文件”文件类型。

使用 Dockerfile 生成和部署映像

  1. 在命令提示符下,运行以下命令以使用 Dockerfile 生成示例应用的映像。 不要忘记命令末尾的 .。 此命令生成映像并将其存储在本地。 映像命名为 reservationsystem。 验证映像是否已成功生成。 过程完成后,将显示有关文件和目录权限的警告。 由于此练习的目的,可以忽略这些警告。 可能需要一段时间才能生成映像。

    docker build -t reservationsystem .
    
  2. 运行以下命令以验证映像是否已创建并存储在本地注册表中:

    docker image list
    

    该映像将具有名称 reservationsystem。 还会看到名为 microsoft/dotnet 的映像:

    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    reservationsystem   latest              d2501f0f2ced        About a minute ago   1.76GB
    

测试 Web 应用

  1. 输入以下代码,运行使用 reservationsystem 映像的容器。 Docker 将返回一个十六进制数字的长字符串。 容器在后台运行,没有任何 UI。 容器中的端口 80 映射到主机上的端口 8080。 容器名为 reservations

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. 启动 Web 浏览器并导航到 http://localhost:8080/api/reservations/1。 你应会看到一个 JSON 对象,其中包含预留编号 1 的数据,类似于以下输出:

    Screenshot of the hotel reservations system web app running in a browser.

    将 localhost URL 末尾的“1”替换为不同的预留编号(如 2 或 20),查看相应的预留详细信息。

  3. 运行以下命令以查看容器的状态:

    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
    
  4. 输入以下命令以停止 reservations 容器:

    docker container stop reservations
    
  5. 从本地注册表中删除“预订”容器。

    docker rm reservations
    
  6. 将 reservationsystem 保留在本地注册表中。 下一练习中将使用此映像。

恭喜! 已为 Web 应用创建映像并使用 Docker 容器运行它。