翻译-在10行代码以内建立容器化的.net core应用

本文翻译自Hans Kilian的文章linux

Creating a containerized .NET core application in less than 10 lines of codegit

https://medium.com/@hkkilian/creating-a-containerized-net-core-application-in-less-than-10-lines-of-code-567f4572ef01docker

Docker的一个优点是你能够在别人的容器之上建立你本身的容器。在这片文章我将向你展现怎么快速得建立一个包含.net core应用的docker容器。数据库

咱们须要的仅仅只是一台安装了docker的机器,而且能链接上internet。c#

建立一个目录而且在该目录中建立一个文件“Dockerfile”。打开那个文件,粘贴一下的代码行,而且保存。浏览器

FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /app
RUN dotnet new razor
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["dotnet", "app.dll"]

在终端中执行命令 “docker build -t myapp .”app

这行命令从当前目录的Dockerfile文件建立了一个docker镜像而且给这个镜像取了一个名字叫作“myapp”的标签。asp.net

而后咱们就能够经过输入命令“docker run -d -p 80:80 myapp”运行这个容器化的应用了。less

而后当你打开你的浏览器而且导航到http://localhost/你将看到下面显示的屏幕:工具

这是怎么运行的呢?

上边的那个Dockerfile指定了多级构建,包含有两个部分,每一个部分四行。第一部分为要运行的应用生成并编译了源码,第二部分把编译好的应用打包进一个咱们能运行的容器中。多级构建在docker17.05中才开始有介绍,所以若是你要使用该特性的话你须要17.05或者更新的docker版本。

  • 第一行指出了咱们将基于微软提供的.NET core 2.1 SDK来构建咱们想要的docker镜像。咱们给.NET core 2.1 SDK取个别名“build-env”,这在后边会用到。
  • 第二行中咱们建立了一个工做目录“/app”。
  • 第三行中咱们在上边建立的目录中执行命令“dotnet new razor”,这行命令使用Razor pages建立了一个基本的asp.net应用程序所须要的全部的源代码。
  • 第四行中咱们发布上边的应用到“out”目录。全路径是“/app/out”。“publish”命令足够智能,它能够在发布以前自动还原所须要的Nuget包而且进行编译。

Dockerfile中的最后四行将发布了的应用程序打包进一个只包含.net core运行时环境的docker镜像中。当咱们运行这个应用的时候彻底没有必要包含整个的sdk。咱们想要运行的镜像越小越好。

第一行咱们首先指定咱们想要开始构建一个跟上一个不同的docker镜像。此次咱们将会使用基于包含了ASP.NET core运行时环境的Alpine linux分支开始构建。Alpine是一个很是小的linux发行版本,而且被普遍地使用与docker基础镜像中。

而后咱们再次建立了一个工做目录“/app”,这跟第一次建立的“/app”不是同一个目录,由于咱们如今正在构建一个新的docker镜像。

而后咱们从第一个建立的镜像中复制应用的文件。“--from=build-env”选项指定了咱们想要的是从第一个建立的镜像中复制。咱们从第一个建立的镜像中复制了全部的“/app/out”目录下的文件到当前的目录/app

而后咱们指定了容器的运行入口是dotnet 命令而且还要跟上参数“app.dll”。

当咱们运行这个镜像的时候,咱们指定了几个运行参数。第一个参数“-d”指定了该镜像应该在后台运行。第二个参数“-p 80:80”指定了容器中的80端口应该被映射到运行容器的机器的80端口上。若是你机器上的80端口被占用了,你可使用其余端口进行映射。好比你想映射到运行docker的机器的8080端口,你可使用“-p 8080:80”,而后你能够经过“http://localhost:8080/”访问该应用。无论你映射到机器上的哪一个端口,应用程序表现出来的是不变的,就像它一直使用的是80端口同样。

你可使用docker命令“docker ps”查看当前运行的docker镜像。

你也可使用“docker kill <name>”中止容器。

从这里咱们将要进一步学习些什么?

固然了这不是一个有用的示例。为了让示例更加接近实际,你能够很容易地改变这个例子去容器化一个自定义的c#工程项目。假设你有一个子目录“code”,其中含有你的项目源码,你能够替换“RUN dotnet new razor” 为“COPY ./code/ ./”,仅仅就改变这一行,你就能够构建你自定义的项目。或者你还能够从使用“git clone”命令从git上拉取项目。

在docker容器中构建你的解决方案的另一个好处是你不须要担忧你电脑上安装的sdk的版本冲突。若是你想尝试NET core 2.2 preview,你能够很简单地使用下边的代码来使用2.2 的SDK和2.2的 ASP.NET 运行时环境:

FROM microsoft/dotnet:2.2.100-preview3-sdk AS build-env
WORKDIR /app
RUN dotnet new razor
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.2.0-preview3-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT [“dotnet”, “app.dll”]

若是你不喜欢这样的结果(2.2 preview如今彷佛没有2.1好用),你不须要卸载任何的2.2的preview SDK,由于你的机器上历来没有安装过它。2.2 SDK仅仅只是安装在docker镜像之中的,仅仅只是下载下来并无运行,除非你要求运行该镜像的时候。

若是你想查看其余的合适的.NET Docker镜像,你能够从这里开始https://hub.docker.com/r/microsoft/dotnet/

我但愿这篇文章能够鼓励你尝试使用docker或者.NET core,若是你历来没有尝试过的话。添加一个相似PostgreSQL 数据库将会很是简单,由于这里已经有构建好的合适的docker镜像可使用,你根本不须要任何的定制化。当你有多个须要相互之间进行通讯的容器的时候,docker-compose是一个很棒的工具,它可使用一个简单的命令加速并接管控制多个容器。

相关文章
相关标签/搜索