前面,已经在Linxu上对.Net Core、Nginx、Docker分别简单的做了入门demo的练习,这篇文章是为的就是能把前面这些东西串起来运用,感受一下容器化应用从创建、发布、部署到用户访问的大体步骤,顺便复习一下步骤,巩固理解。
正文开始。
1. 新建一个解决方案
前面一篇体验.Net Core 应用的demo里面都是直接新建的项目,用过宇宙第一IDE VS的同学应该知道解决方案与项目关系,简单来说就是:一个解决方案可以包含多个项目。
新建一个目录dotnet-docker用来专门存放解决方案,进入后再新建一个解决方案目录dockermvc,最后进入解决方案目录,分别新建解决方案和mvc项目:
这里和Visual Studio有所区别,VS里新建一个解决方案会同时新建一个解决方案文件夹和一个解决方案文件,项目也是。但此处命令行 只会帮你新建文件,不会新建目录(Linux里习惯称文件夹为目录),所以需要自己建,不然目录结构混乱
$ mkdir dotnet-docker
$ cd dotnet-docker
$ mkdir dockermvc
$ cd dockermvc
$ dotnet new sln
$ dotnet new mvc
敲完之后,利用ls
命令查看一下目录内容:
ls
解决方案目录下分别是 解决方案文件 和 项目目录,项目目录下的文件内容与前面一文的Core mvc的demo一模一样
2. 添加Docker配置文件
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY dockermvc/*.csproj ./dockermvc/
RUN dotnet restore
# copy everything else and build app
COPY dockermvc/. ./dockermvc/
WORKDIR /app/dockermvc
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/dockermvc/out ./
ENTRYPOINT ["dotnet", "dockermvc.dll"]
3. 将.Net Core应用打包成Docker可以加载的镜像
-t mydockermvc:1.0
表示生成名为mydockermvc且标签为1.0的docker镜像,最后面有个 **.**
表示当前目录
docker build -t mydockermvc:1.0 .
构建镜像成功如下:
中间省略一部分程序集初始化...
4. 运行刚刚Core应用生成的docker镜像
没有启动docker时,Nginx服务虽然在监听80端口,但是没有服务响应内容,所以出现访问失败。
运行docker镜像mydockermvc:1.0 并命名运行镜像成功后的容器名为: mymvcdockerimgae
docker run -it --rm -p 5000:80 --name mymvcdockerimgae mydockermvc:1.0
-p 5000:80
是指定容器内部使用网络端口80 并且映射到我们使用主机上的5000端口,外网通过80端口的请求到了服务器主机。
所以整个请求流程是:外部访问默认80端口后,Nginx通过 读取我们的自定义配置文件 将80端口的请求转交到本主机的5000端口,请求到了5000端口,通过docker容器设置的映射关系,请求继续转交到映射到了5000端口的mymvcdockerimgae容器,容器再在内部让与5000端口映射对应的80端口服务程序响应。
运行镜像后外部访问Linux主机IP:
容器内部端口可自行指定,如10002-p 5000:10002
,但本例中 core程序默认跑的是80端口,所以代码得修改:
vi dotnet-docker/dockermvc/dockermvc/Program.cs
更新代码为:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace dockermvc
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://*:10002") //多一行指定端口的代码
.Build();
}
}
重新生成镜像:
$ docker build -t mydockermvc:2.0 .
运行新生成的镜像:
$ docker run -it --rm -p 5000:10002 --name mymvcdockerimgae mydockermvc:2.0
外网测试可以看到仍然可以访问。