1.4 Docker
有的.NET Core 开发人员可能没有使用过 Docker,但是应该听说过 Docker。Docker 是GitHub上最受欢迎的开源项目之一,有人认为Docker是所有云应用的基石,并且可以把互联网升级到下一代。Docker是DotCloud公司开源的一款产品,从其诞生那一刻算起,在短短的两三年内就已经成为开源社区最热门的项目之一。对于完全拥抱开源的.NET Core 来说,它自然应该对 Docker 提供完美的支持。下面的内容基于这样一个前提:读者对 Docker 有基本的了解,并且在计算机(Windows)上已经安装了Docker。
下面将演示如何创建一个ASP.NET Core程序并将其编译成Docker镜像,Docker环境针对该镜像创建一个容器来启动一个应用实例。简单起见,可以直接采用脚手架命令行的形式创建ASP.NET Core应用。如图 1-23所示,执行“dotnet new web”命令在“D:\projects\helloworld”目录下创建一个空的ASP.NET Core应用。
图1-23 执行“dotnet new web”命令创建一个空的ASP.NET Core应用
现在需要将 ASP.NET Core应用制作成一个 Docker镜像,为此我们需要在项目根目录下创建一个 Dockerfile 文件(文件名就是 Dockerfile,没有扩展名),并在该文件中定义如下内容。如果读者对Dockerfile具有基本的了解,对于这个文件的内容应该不难理解。
这个 Dockerfile文件采用一个中间层(build)暂存 ASP.NET Core MVC应用发布后的资源,其工作目录为“/app”。具体来说,这个层将“microsoft/aspnetcore-build:2”作为基础镜像,我们先将定义项目的.csproj 文件(helloworld.csproj)复制到当前工作目录,然后运行“dotnet restore”命令恢复所有注册在这个项目文件中的 NuGet 包。最后将当前项目的所有文件复制到当前工作目录,并执行“dotnet publish”命令对整个项目进行编译发布(针对 Release 模式),发布后的资源被保存到目录“/app/out”中。
真正编译生成 Docker 镜像时,通常采用“mcr.microsoft.com/dotnet/core/aspnet:3.0”作为基础镜像,由于应用在上面进行了预先发布,所以只需要将发布后的所有文件复制到当前工作目录即可。接下来我们通过环境变量设置了ASP.NET Core应用的监听地址“http://0.0.0.0:3721”。针对 ENTRYPOINT的定义(ENTRYPOINT ["dotnet","helloworld.dll"]),当容器被启动的时候,“dotnet helloworld.dll”命令会被执行以启动ASP.NET Core应用。
定义 Dockerfile 文件之后,可以打开 CMD 命令行并切换到项目所在根目录(也就是Dockerfile文件所在的目录),然后执行“docker build-t helloworldapp.”命令,该命令会利用这个 Dockerfile文件生成一个命名为 helloworldapp的 Docker镜像。图 1-24展示了执行“docker build”命令过程中的输出结果。
成功创建 Docker 镜像之后,只需要针对这个镜像创建对应的容器,最终的 ASP.NET Core应用的启动就可以直接通过启动该容器来完成。如图 1-25 所示,我们执行“docker run-d-p 8080:3721--name myapp helloworldapp”命令针对前面生成的Docker镜像(helloworldapp)创建并启动了一个命名为 myapp(--name myapp)的容器。由于我们从外面访问这个应用,所以通过端口映射(-p 8080:3721)可以将内部监听端口 3721映射为当前宿主机器的端口 8080,然后利用地址“http://localhost:8080”访问通过Docker容器承载的ASP.NET Core应用。
图1-24 执行“docker build”命令生成Docker镜像(一)
图1-25 执行“docker build”命令生成Docker镜像(二)
[1] 解释见附录A