在群晖 Docker 中运行 .Net Core 应用






4.85/5 (11投票s)
如何在群晖 NAS 的 Docker 容器中运行 .Net Core 应用。
我想利用我的 C# 技能集来构建和托管一个网站。我可以选择 Microsoft Azure,但我不想付费。我听说新的 Dot Net Core 可以在 Docker 中运行,而群晖支持 Docker。嗯,听起来很有趣,但如何实现呢?这篇博文将向您展示。
什么是 .Net Core?
.Net Core 是微软的新开发平台。它不会取代传统的 .Net,而是与 .Net 共存。

它有许多令人兴奋的特性
- 开源:由微软和 .Net 社区在 GitHub 上维护。
- 模块化结构:所有包都可以在 NuGet 上找到。
- 跨平台:支持 Windows、Mac OS 和 Linux。
- Docker 支持:.Net Core 镜像可在 Docker Hub 上获得。
什么是 Docker?
Docker 是一款轻量级的虚拟化应用程序,可以让您在 NAS 上运行容器。您可以构建自己的容器,也可以从 Docker Hub 下载。Docker 有几个优点:
- 轻量级,可以在一台机器上运行多个 Docker 镜像。
- 快速冷启动。
- 易于部署。
- 跨多个平台的可移植性,支持 Mac、Linux 和 Windows。
群晖由 Linux 驱动,如果您的 NAS 足够强大,就可以运行 Docker。请查看 群晖上的 Docker,了解您的型号是否受支持。
操作步骤
- 安装 Docker。
- 创建 Dot Net Core 应用程序。
- 将解决方案发布到 NAS。
- 构建 Docker 镜像。
- 启动并配置 Docker 镜像。
- 配置反向代理,这是可选的。
安装 Docker
下一步是在群晖 NAS 上安装 Docker。打开套件中心并搜索 Docker。

Docker 在安装过程中会创建一个文件夹“
创建 Dot Net Core 应用程序
有几种方法可以构建 .Net Core 应用程序。我更喜欢 VS 2015 社区版,它带有 .Net Core 堆栈,功能丰富且免费。确保安装 .Net Core Tools 预览版。您可以在 此处 找到所有必需的 .Net Core 设置文件。应用程序本身不是这篇博文的主要目标,所以我将保持简单,创建一个 HelloWord MVC 应用程序。

并选择 Web Application (Web 应用程序)

目前我们保持简单,选择 **No Authentication** (无身份验证)。我按下 F5 并确认“HelloWord”应用程序正在运行。

将解决方案发布到 NAS
下一步是将解决方案发布到 NAS。您可以通过多种方式完成此操作,只需确保文件已复制到“


点击“Publish”(发布) 将编译并复制部署文件到 \\
构建 Docker 镜像
构建 Docker 镜像需要几个步骤:
- 从 Docker 仓库拉取镜像。
- 创建 Dockerfile。
- 通过 telnet 会话构建 Docker 镜像。
拉取镜像
我们需要一个“基础”镜像来合并我们的文件。在 Docker hub 上有很多可用的镜像。您很容易被搞糊,不知道该选择哪一个。在我们的例子中,我们需要一个只包含 asp.net core 库的镜像。这是一个轻量级的 镜像,具有非常好的冷启动性能。在 NAS 上打开 Docker 应用程序并搜索“microsoft/aspnetcore”。选择“1.0.1”作为标签。

完成后,您将看到已下载的镜像。

创建 Dockerfile
“Dockerfile”是一个没有文件扩展名的文件。它是一种带有 Docker 命令的批处理文件。在镜像构建过程中需要此文件。您可以使用任何喜欢的文本编辑器创建该文件。将文件保存在文件夹 \\
Dockerfile 内容
FROM microsoft/aspnetcore:1.0.1 COPY . /app WORKDIR /app ENV ASPNETCORE_URLS http://*:7500 EXPOSE 7500 ENTRYPOINT dotnet webApp.dll
Dockerfile 执行几个重要步骤:
- 将使用 microsoft/aspnetcore:1.0.1 作为 helloword 镜像的基础。
- 设置 HelloWorld 文件的位置。
- 设置应用程序的 IP 端口。
- 设置应用程序的入口点。
提示:我将 Dockerfile 添加到项目解决方案中。这样,该文件在发布过程中不会被删除,并且发布选项(右键单击)可以非常方便地将文件复制到 docker 文件夹。

通过 telnet 会话构建 Docker 镜像
此步骤将已发布的(部署的)文件和已下载的镜像合并到一个新镜像中。将启动此新镜像,它是新应用程序,所以我们快完成了。步骤:
- 从您的 Windows 机器上运行 telnet <hostname>。
- 使用用户名和密码登录。请注意,密码和用户名都区分大小写。
- Telnet 命令
sudo -i cd /volume1/docker/helloworld docker build -t helloworld .
sudo -i 需要 root 级别的帐户。在我的设置中,第一次 sudo 登录尝试总是会失败。请在 helloword 和点号之间保留一个空格!否则,构建命令将失败。Docker 会构建新镜像,您可以在 telnet 终端和 NAS 上的 Docker 管理应用程序中检查结果。


启动并配置 Docker 镜像
所有繁重的工作现在都完成了。我们只需要启动镜像。在启动过程中,我们必须将端口 7500 映射到此镜像。
- 单击 Launch (启动)(参见上一张图片)。
- 单击 Advanced settings (高级设置) 并选择“Port Settings”(端口设置) 选项卡。
- 在 Local Port (本地端口) 中输入“7500”。 
- 完成向导。
容器菜单显示应用程序正在我们新创建的容器中运行!

在浏览器中启动应用程序,不要忘记 URL 中的端口号。

是的!一切都奏效了。
配置反向代理
现在一切都正常了。唯一的缺点是用户必须知道端口号。这可能会很麻烦,尤其是在托管多个站点时。使用反向代理,您可以将端口号重定向到子域名。群晖具有此功能,并且易于设置。
- 转到 Control Panel (控制面板)。
- 选择 Application Portal (应用程序门户)。
- 选择 Reverse Proxy (反向代理) 选项卡。
- Create New (创建新条目)。
- 设置值。 
启动浏览器并输入带有子域名的完整 URL。这证实了一切都按预期工作。

反向代理的恼人副作用
反向代理会带来一个恼人的副作用,这个副作用并不那么明显。应用程序的内部 IP 地址被映射到 172.x.x.x 网段。例如,如果您使用数据库连接(例如连接到 SQL 或 MySQL),就会出现这种情况。如果这些应用程序对传入 IP 地址有限制,您的应用程序将会失败!
结论
Dot Net Core 和 Docker 提供了在不同平台上部署应用程序的出色方式。您可以使用您当前的 C# 技能集构建应用程序。部署需要一些学习,但这是值得的。请在评论区留下您的想法。

