GVKun编程网logo

在 Linux 和 Windows 的 Docker 容器中运行 ASP.NET Core(linux docker windows应用)

14

在本文中,您将会了解到关于在Linux和Windows的Docker容器中运行ASP.NETCore的新资讯,同时我们还将为您解释linuxdockerwindows应用的相关在本文中,我们将带你探索

在本文中,您将会了解到关于在 Linux 和 Windows 的 Docker 容器中运行 ASP.NET Core的新资讯,同时我们还将为您解释linux docker windows应用的相关在本文中,我们将带你探索在 Linux 和 Windows 的 Docker 容器中运行 ASP.NET Core的奥秘,分析linux docker windows应用的特点,并给出一些关于.Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库、.net Core 中DateTime在Linux Docker中与Windows时间不一致、Docker for Windows (Linux Container) 使用代理、docker – Windows容器中的控制台应用程序或Windows服务?的实用技巧。

本文目录一览:

在 Linux 和 Windows 的 Docker 容器中运行 ASP.NET Core(linux docker windows应用)

在 Linux 和 Windows 的 Docker 容器中运行 ASP.NET Core(linux docker windows应用)

译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman 就捷足先登了。那么我就来翻译一下这篇文章,让更多的中文读者看到。当然 Scott 遇到的坑我也遇到了。


不过首先,对于不熟悉的朋友我还是来解释一下 Linux 容器和 Windows 容器的概念。


由于容器成为虚拟化和应用托管的一种不可避免的选项,Windows 也开始为公众提供容器功能(其实微软具备和使用容器技术很久了)。这样的容器功能在内部的引擎通过两种方式来实现,内核级别(仅 Windows Server 2016 支持)和 Hyper-v 级别(Windows 10 和 Windows Server 2016 支持)。但是对外的接口和标准又遵循 Docker 的,这样的好处是 Windows 容器生态可以和现有的 Linux 容器生态很好的结合。所以 Windows 容器称之为 Docker on Windows。Windows 容器的出现为传统的 Windows 服务端应用程序的容器化开启了新天地,比如把 Qlik Sense 的服务器放到容器中来即时编排集群。


而之前 Docker 公司也针对 Windows 10 推出过利用 Hyper-V 来跑一个 Linux 虚拟机作为容器宿主主机的发行版本。那个称之为 Docker for Windows。


所以在 Windows 10 上,你可以同时安装 Docker for Windows 和 Docker on Windows,只是不能同时运行两者。两者默认的安装目录不同,但是客户端(即 Docker.exe)是同名的,所以我把 on 版本的客户端执行文件改了个名字就可以两个一起用了。其实客户端虽然版本不同,但是基本的命令还是都是兼容的,用其中一个就够了。因为 Docker Deamon 在两者中都是同样的访问地址。


Scott Hanselman 的文章地址为:http://www.hanselman.com/blog/ExploringASPNETCoreWithDockerInBothLinuxAndWindowsContainers.aspx


== 我是译文正文开始的分隔符 ==


在去年 5 月的时候,使用 ASP.NET 和 Docker 来折腾一些事情还步履蹒跚。不过,伟大之处就是我们一直在进步。我曾经就写过一篇博客文章来展示如何把 ASP.NET 5(当时还称之为 5 呢,现在已经改名为 Core 1.0 了)应用发布到 Docker 中。后来,在 2015 年 11 月,类似 Docker Toolbox 和 Kitematic 这样的新工具让事情变得更加容易。在 2016 年 5 月 Docker for Windows Beta 继续让这件事情易如反掌。


那么来到 2016 年 10 月这个时候,我们来看看如何使用 ASP.NET Core、Docker 和 Windows 来进行开发。


我安装了如下东西:

  • Visual Studio Community 2015

    • Visual Studio 2015 Update 3

  • ASP.NET Core with .NET Core

    • .NET Core 1.0.1 - VS 2015 Tooling Preview 2

  • Docker for Windows (我使用 Beta 通道)

  • Visual Studio Tools for Docker


Docker for Windows 真的非常好,它可以自动为你配置好 Hyper-V,创建一个 Docker 宿主 OS,并启动好这个虚拟机。节约了大量的时间。


这是我的 Linux 宿主,我无需太多关心它的情况。我将会通过命令行或 Visual Studio 来完成所有事情。


首先通过 File | New Project 来创建一个运行在.NET Core 中的 ASP.NET Core 应用程序。


接着在项目名称上点击右键并选择 Add | Docker Support。这一菜单来自 Visual Studio Tools for Docker 扩展。这个步骤会添加基本的 Dockerfile 和其他 docker-compose 文件。通过这样的开箱即用的步骤,我就完成了所有的配置从而能够把 ASP.NET Core 应用程序部署到 Docker Linux 容器中。


ASP.NET Core 运行在 Docker Linux 容器中

从我这个 ASP.NET Core 应用当中,我们可以看到其使用的基础镜像(就是 Dockerfile 中的 FROM 语句)是 Linux 的 ASP.NET Core 镜像。

FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .


接下来,由于我不希望 Docker 编译我的应用程序,只想发布到本地。可以阅读 Steve Laske 的博客文章 "Building Optimized Docker Images with ASP.NET Core" 来了解如何在一个容器中构建应用程序而在其他容器中运行。这样做优化了服务器的使用率和资源。


我将通过如下命令行指令来发布、构建镜像并运行它。

>dotnet publish

>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux

>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonlinux latest dab2bff7e4a6 28 seconds ago 276.2 MB
microsoft/aspnetcore 1.0.1 2e781d03cb22 44 hours ago 266.7 MB

>docker run -it -d -p 85:80 aspnetcoreonlinux
1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413

>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfcc8e8e7d4 aspnetcoreonlinux "dotnet WebApplicatio" 2 seconds ago Up 1 seconds 0.0.0.0:85->80/tcp clever_archimedes


到此,我的 ASP.NET Core 应用就可以运行在 Docker 中了。我们现在已经尝试了一个 Docker 容器,它是托管在 Windows 中通过 Hyper-V 来运行的 Linux 宿主中。


我们还可以做点别的什么呢?


ASP.NET Core 运行在一个运行着 Windows Nano Server 的 Docker Windows 容器中

有这样一种 Windows Server,称之为 Windows Server Core,它删除了 UI 相关的东西;有这样一种 Windows Server,称之为 Windows Nano Server,它让 Windows 缩减到只有几百 M 而不是几 G。这意味着从所需功能和服务器使用率的角度看,这是一个非常好的选择,让你部署的空间占用尽可能的小。


让我来看一下我是否能把 ASP.NET Core 通过 Kestrel【译者注:ASP.NET Core 的跨平台 Web 服务器实现】运行到 Windows Nano Server 中。当然,由于 Nano 功能强大,我也能在这个容器中运行 IIS,这里有文档说明。


来自 Docker 公司的 Michael Friis 有一篇很棒的博客文章描述了在 Windows Server 容器中构建和运行 Docker 应用。在安装了最新版的 Docker for Windows 之后,你就可以通过上下文菜单来在 Linux 和 Windows 容器间切换。


那么现在我就来用用 Windows 容器的 Docker。你可能还不知道你已经拥有 Windows 容器了!它已经和 Windows 10 周年更版本一起发布了。你可以在 Windows 特性对话框中启用容器功能:


我将修改一下 Dockerfile 来使用 Windows Nano Server 镜像。我也可以在 Docker 内部通过环境变量和 Expose 命令来控制 ASP.NET 暴露的端口。

FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .


接着,我发布并构建……

>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano


然后,运行它,映射 Windows 外部端口到 Windows 容器内部!

注意:在 Windows 10 通过 “NAT”(网络地址转换)来和容器通讯的时候,有一个 Bug,你不能如你(我)所愿的那样,直接通过 http://localhost:82 来访问容器应用。你不得不通过容器本身的 IP 来访问。一旦听到这个 Bug 的更多消息和被修复的情况,我会及时公布在这里。它应该会通过 Windows Update 在几天内出现。从 Docker 得到容器的 IP 地址的方法为:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH


那么,我将通过如下命令在 Windows Nano Server 中运行我的 ASP.NET Core 应用(再次说明一下,它将运行在 Windows 10 的 Nano Server 容器内)。

>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215

>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197


现在,我可以通过 172.16.240.197:82 来访问这个站点。一旦上面的 Bug 被修复后,我们就能像其他容器那样访问它了。


Windows 容器的最美好的一面就是它非常快和轻量级。一旦镜像被下载下来,在机器上构建好,那么你通过 Docker 来启动和停止它们都是秒完成。


不过,你也可以通过如下命令来使用 Docker 隔离 Windows 容器:

docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano


如此一来,实例完全是通过 Hyper-v 本身来隔离运行的。你可以获得世界上最好的东西:速度、方便的部署加上可选且便捷的隔离。


ASP.NET Core 运行在一个运行着 Windows Server Core 的 Docker Windows 容器中

接下来,我把 Dockerfile 修改为使用完整的 Windows Server Core 镜像。在下载安装这个镜像后,其占用大约 8G 的空间,需要花一点时间来下载和解压,不过它确实是真正的 Windows。你也可以选择运行为一个容器或者隔离的 Hyper-V 容器。


这里,我通过修改 FROM 语句来使用包含了.NET Core 的 Windows Sever Core:

FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdk
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .

注意:我听说使用 Windows Sever Core 的.NET Core 镜像有可能会取消。因为让.NET Core 运行在 Windows Nano Server 或其他轻量级镜像中更有意义。你应该把 Sever Core 用于那些更加笨重的应用。如果你真的需要运行在 Sever Core 的.NET Core,你可以制作自己的 Dockerfile 来轻易构建你所要的镜像。


接下来,我将再次发布、构建和运行。

>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonnano latest 7e02d6800acf 24 minutes ago 1.113 GB
aspnetcoreonservercore latest a11d9a9ba0c2 28 minutes ago 7.751 GB


由于容器能够非常快的启动和停止,所以我可以利用跑在容器中的 Redis、一个 SQL 容器和包含其他部分的第三个容器来跑一个完整的 Web 集群。或者混合并配对。

>docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d32a981ceabb aspnetcoreonwindows "dotnet WebApplicatio" 0.0.0.0:87->82/tcp compassionate_blackwell
a179a48ca9f6 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:86->82/tcp determined_stallman
170a8afa1b8b aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:89->82/tcp agitated_northcutt
afafdbead8b0 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:88->82/tcp naughty_ramanujan
2cf45ea2f008 a7fa77b6f1d4 "dotnet WebApplicatio" 0.0.0.0:97->82/tcp sleepy_hodgkin


总结

再次,让我们阅读 Michae 的另外一篇文章,他使用 Docker Compose 来把 ASP.NET Music Store 示例跑在一个 Windows 容器中,而 SQL Express 跑在另外一个中,以及 Steve Lasker 的博客文章(实际上他的整篇文章都是金矿)中提到的为 ASP.NET Core 制作一个优化的 Docker 镜像。

IMAGE ID            RESPOSITORY                   TAG                 SIZE
0ec4274c5571 web optimized 276.2 MB
f9f196304c95 web single 583.8 MB
f450043e0a44 microsoft/aspnetcore 1.0.1 266.7 MB
706045865622 microsoft/aspnetcore-build 1.0.1 896.6 MB


Steve 提到了大量的技巧,让你可以解决 Docker 和 ASP.NET Core 在一起的大部分问题。


所有的一切意味着(IMHO),你可以把 ASP.NET Core 用在:

  • 在 Linux 中跑 ASP.NET Core

    • 在 Docker 容器里面

    • 在任何云平台中

  • 在 Windows,、Windows Server、Server Core 和 Nano Server 中跑 ASP.NET Core

    • 在 Docker 的 Windows 容器里面

    • 在 Docker 的 Hyper-V 隔离容器里面


这意味着你可以选择任意特性支持和为服务器使用率和便捷度优化过的尺寸大小。一旦所有的工具(Docker for Windows 和 Visual Studio Docker Tools)准备妥当,我们就能拥有良好的调试环境,和从开发到生产的工作流支持。


你在使用 Docker、容器和 ASP.NET Core 进行开发了吗?希望在评论中看到你们的声音。

本文分享自微信公众号 - dotNET 跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

.Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库

.Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库

 .Net  Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库  , 一直报下面的错误

ORA-00604: error occurred at recursive sql level 1

ORA-01882: timezone region not found  

 

解决方法是 :

docker-compose 

 的时候设置环境变量TZ 即可


environment:
TZ: "Asia/Shanghai"

 

 

另外, 防火墙关闭后, 必须重启docker服务, 容器内的应用才能访问服务器宿主同网段的其他IP地址

 

.net Core 中DateTime在Linux Docker中与Windows时间不一致

.net Core 中DateTime在Linux Docker中与Windows时间不一致

最近写了一个.net core项目,部署到CentOS并在docker上运行的时候,发现DateTime.Now获取的时间与Windows不一致(定时执行的任务,晚了8个小时),在Windows中可以正确的获得本地时间,而在Linxu CentOS 的Docker环境中获取的时间少了8个小时。通过Linxu命令查看本机时间,本地时间正确,但.net core在Docker运行获取时间依然是少8个小时。猜测可能是时区的问题,然后就找到了NodaTime的一个库进行获取统一时区的时间,这下在Linxu CentOS的Docker环境上获取的时间就与Windows中保持了一致。

新增一个DateTime扩展方法:

public class TimeUtil
    {
        public static DateTime GetCstDateTime() { Instant now = SystemClock.Instance.GetCurrentInstant(); var shanghaiZone = DateTimeZoneProviders.Tzdb["Asia/Shanghai"]; return now.InZone(shanghaiZone).ToDateTimeUnspecified(); } } public static class DateTimeExtentions { public static DateTime ToCstTime(this DateTime time) { return TimeUtil.GetCstDateTime(); } } 

  在程序中获取时间都通过如下方法,即可实现在Windows和Linux保持统一:

DateTime.Now.ToCstTime();  
 
除了以上方式之外,可以将Linxu时间和Docker容器进行同步。具体详情,请参考。docker容器与Linux主机环境获取时间不一致

原文链接:https://www.skyfinder.cc/2018/10/01/dotnetcoredatetimenotunified/

Docker for Windows (Linux Container) 使用代理

Docker for Windows (Linux Container) 使用代理

前提:

在国内环境,因为某种原因,使用 docker 下载 image 非常缓慢。因此,为了更好的下载效率,需要使用代理。

所需条件:

1. VPS(offshore)

2. ss

遇到的坑:

 

这样设置后,发现并没有生效。理由如下:

docker login
username: ***
password: ***

 提示连接被拒绝。

原因:

docker MobyLinuxVM 并不与本地 127.0.0.1 共享同一个 IP。

通过以上截图可以看到 docker 有内置的以太网适配器。

解决:

step1,任务栏右击 ss:

钩选红框部分。

step2,将 docker setting proxy 的代理 IP 地址重新设置下,使用 docker MobyLinuxVM 的子网地址(刚才截图的):

完成。

确认:

docker login
username: ***
password: ***

成功。

docker – Windows容器中的控制台应用程序或Windows服务?

docker – Windows容器中的控制台应用程序或Windows服务?

我正在尝试使用.net 4.5在Server 2016 CTP5上构建基于Windows容器的微服务.

在非容器世界中,我使用部署为Windows服务的控制台应用程序来订阅队列并完成其工作.

在一个容器中,我可以运行控制台应用程序,它似乎运行得很好.是否需要将其安装为Windows服务?

最佳答案
不,您不希望将其安装为服务.在容器中运行应用程序时,Docker会监视容器中的活动进程.如果活动进程停止,则容器退出.因此,您应该在前台运行您的应用程序,并让Docker将容器放在后台(通过使用docker run -d启动它).

一个例外是现有平台已经是Windows服务 – 例如microsoft/iis图像. IIS正在容器的后台运行,因此您需要启动另一个进程来保持容器运行 – 这就是为什么您看到IIS容器启动如下:

docker run -d -p 80:80 microsoft/iis ping -t localhost

ping命令使容器保持运行,而IIS服务实际响应请求.但这并不理想,Docker正在监视ping,因此如果IIS服务停止,容器会继续运行.

今天关于在 Linux 和 Windows 的 Docker 容器中运行 ASP.NET Corelinux docker windows应用的讲解已经结束,谢谢您的阅读,如果想了解更多关于.Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库、.net Core 中DateTime在Linux Docker中与Windows时间不一致、Docker for Windows (Linux Container) 使用代理、docker – Windows容器中的控制台应用程序或Windows服务?的相关知识,请在本站搜索。

本文标签:

上一篇两个VOLANS飞鱼星无线路由器连接教程(飞鱼星路由器双wan设置教程)

下一篇移动web开发调试工具AlloyLever介绍(移动web开发教程)