【问题标题】:Publish ASP.NET MVC Project via Docker Container in Azure Service Fabric solution在 Azure Service Fabric 解决方案中通过 Docker 容器发布 ASP.NET MVC 项目
【发布时间】:2018-02-14 15:51:44
【问题描述】:

这是一个相当基本的问题。微软到处宣传lift and shift approach,这意味着您可以将旧的 ASP.NET MVC 项目(云服务 Webroles)移动到 Docker 容器中,以便在 Service Fabric (SF) 上首次发布,然后再将它们转换为原生 ASP.NET Core。

不幸的是,没有一个完整的描述如何做到这一点:

  • First example Lift and Shift:微软将旧 Web 项目放入容器的主要广告。但是他们只使用了一些特殊的“持续交付”方法来发布,这并没有帮助。
  • Approach with VS Docker Compose support:只有如何将单个容器发布为自包含应用程序。但它不允许将容器与其他服务一起嵌入到整个 SF 项目中。此外,它不适用于 1 中创建的 Docker-Compose。1 在我的机器上执行,可以发送到集群并以某种方式在集群上执行。但是仍然无法从外部访问 Web 应用。
  • Tutorial how to containerize and include container into SF Solution:将容器包含在解决方案中的正确方向。不幸的是,他们容器化的 Web 项目并不是一个完整的 ASP.NET Web 项目。它只是一个 python 脚本。因此,在这种情况下,他们可以轻松创建 docker 文件。
  • ASP.Net Core Docker Tutorial from the Docker docs:这里解释了如何创建一个容器,比单个 python 脚本更复杂。但是,本教程仅以 ASP.NET Core 项目为特色,并使用原始 ASP.NET 中不存在的“dotnet publish”指令!?
  • 不幸的是,所有其他将 ASP.NET MVC 应用程序从旧云服务迁移到 SF 的教程只是解释了立即升级到 ASP.NET Core(例如Herehere

我迷路了。我认为策略应该是编写一个自己的 docker 文件并像 4 中那样手动创建一个容器,然后按照 3 将该容器嵌入到 SF 解决方案中。最后的问题是:如何编写 Dockerfile 来容器化 ASP.NET MVC 项目?

【问题讨论】:

  • 更让我困惑的是:在 Visual Studio 中有所有这些教程,甚至还有本机 docker-compose 支持,而 docker-file 会自动创建。但是还是不能用……
  • youtube.com/watch?v=LgKGLT-OL1E。该视频可能会有所帮助。此处,此人在容器中托管 asp.net 应用程序,并将容器托管在 Azure VM 中。

标签: asp.net azure-service-fabric docker-container


【解决方案1】:

先回答最后的问题: 用于 ASP.NET MVC 的 dockerfile 示例:

FROM microsoft/aspnet:4.6.2
WORKDIR /inetpub/wwwroot
COPY /publish .

这会将 Web Publish 输出从 /publish 目录复制到您的容器。

为了扩展您在上面放置的链接,有一些关于容器的重要概念:

  • Docker 文件(描述如何构建容器的文件)
  • Docker compose(可以描述如何构建和运行多个容器的文件)- 单个容器不需要
  • Docker 主机(在操作系统上运行并可以拉取容器映像并运行它们的服务)
  • Container Registry(容器镜像在其中驻留,并在 docker 主机需要运行它们时从中提取)
  • Visual Studio Container Tooling(帮助您创建 docker 文件和 docker compose 文件并与 docker 主机集成以在本地调试和运行容器)
  • 您在上面第一个项目中提到的 CI 集成(Visual Studio Team Services 和 Visual Studio 帮助您配置如何构建容器并将其推送到容器注册表)
  • Orchestrator(花哨的多节点东西以类似云的方式运行容器。在解决方案中运行多个容器时提供可靠性和可扩展性 - 也就是节点集群 - Service Fabric 和 Kubernetes 是这里的选项)。

根据上面的四个项目符号来说明以上内容:

  • Lift and Shift:意味着作为一种简单的端到端解决方案,其中 CI/CD 管道是为您创建的。包含以上所有内容。那里 是一个视频,从第一个链接介绍了这个场景 上图:https://channel9.msdn.com/events/Build/2017/T6001
  • 支持 VS Docker Compose 的方法:由上述用于 手动将 docker compose 文件推送到 Service Fabric,后者 指示 Service Fabric 从 容器注册表。
  • 教程如何将容器容器化并将容器包含到 SF 解决方案中: 解释如何在不使用 docker compose 或 Visual 的情况下实现这一点 工作室(由您选择)
  • Docker 文档中的 ASP.Net Core Docker 教程:如何构建 一个容器。

【讨论】:

  • 正如我所料,但这在某种程度上不起作用:1. FabrikamFiber 教程的自动生成 Dockerfile 是:FROM microsoft/aspnet:4.6.2 ARG source WORKDIR /inetpub/wwwroot COPY ${source:-obj/Docker/publish} => 您的建议与自动生成的错误相同:Step 4/4 : COPY /publish: COPY failed: GetFileAttributesEx \\?\C:\WINDOWS\TEMP\docker-builder148860378\publish:
  • 我认为您必须删除前面的斜线 - 这是 COPY 命令参考的链接:docs.docker.com/engine/reference/builder/#copy
  • 2.手动将 docker-compose 文件推送到 Service Fabric 不起作用。相同的 docker-compose 在本地工作 + 容器在集群上加载和执行。但是在集群上它说 page not available。当项目映射到另一个端口时,我在端口 80 上看到 IIS 消息。我看到,对于本地调试,VS 在 docker-compose 完成后执行了一些魔法 cmets:docker exec <container> cmd /c "...tem32\inetsrv\appcmd.exe set config -sect:syste...ationHost/applicationPools /[name='DefaultAppPool'].procModel.identType:LocalSystem /commit:apphost & ...ication/anonymousAuthentication.."
  • @1.任何地方都没有 /publish 文件夹。它应该存在于哪里?
【解决方案2】:

希望手动构建自动创建的 dockerfile 的其他人的一个补充:

.dockerignore file 也是自动生成的,它会忽略除 obj\Docker 文件夹之外的所有内容。如果您 publish manually 并且您的发布文件夹不同,这就是为什么您的引用可能无法找到的原因,尽管您在 dockerfile 中正确设置了它们。

【讨论】:

  • 对——那也咬了我几次。好收获
【解决方案3】:

另一个提示:

在您自己的集群上发布解决方案时请注意,您必须在负载均衡器中手动设置转发规则。默认情况下,仅转发端口 19000 和 19080。这在任何教程中都没有提到。您不知何故只能在in depth explanations 中找到添加平衡规则的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2018-07-16
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多