ASP.NET Core发布到Docker中(使用Dockerfile)

ASP.NET Core的常用命令

在使用VS 2019VSCodeRider这类IDE写完代码之后,在命令行进入项目目录,尝试使用以下命令来恢复编译发布运行项目

  • 恢复所有的NuGet
    dotnet restore [项目名.csproj]
    
    这里的项目文件可以省略,自己在命令行中执行可以省略,但是如果将命令写到文件中,为了方便理解,一般会将项目文件写上
  • 编译
    dotnet build [项目名.csproj] -c Release -o /app/build
    
    • 项目文件解释参照上面
    • -c 表示编译配置,这里指定编译配置为Release
    • -o 表示编译后文件输出到哪个目录,这里指定编译后输出目录为/app/build
  • 发布
    dotnet publish [项目名.csproj] -c Release -o /app/publish
    
    • 命令参数与编译的参数基本一致
  • 运行
    在生成发布文件的目录里运行
    dotnet [项目名称.dll]
    

Dockerfile中的命令

为了快速看到效果,这里只是列举了下面简单示例使用到的命令

FROM

指定运行是镜像,例如FROM mcr.microsoft.com/dotnet/core/aspnet:3.1,后面用AS命令可以在执行命令时给镜像起别名,例如FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base,即表示将mcr.microsoft.com/dotnet/core/aspnet:3.1这个镜像起别名为base

当需要多个镜像的时候,可多次使用这个命令

WORKDIR

设定工作目录,类似命令行中的cd命令,设定之后后续的命令相当于在工作目录中运行

COPY

拷贝文件,这个命令可以拷贝当前宿主机的文件,也可以拷贝上面那种引用多个镜像进行编译的文件到当前镜像

  • 拷贝宿主机文件
    COPY . ./
    
    表示拷贝当前文件夹的所有文件到镜像中的当前文件夹,一般在执行这个命令之前会设置好工作目录,表示将宿主机当前文件夹中的所有文件拷贝到镜像中的工作目录中
  • 拷贝其他镜像文件
    COPY --from=build /app/publish .
    
    使用--from=build表示从build的镜像中拷贝文件,这里的build是引入镜像时指定的别名,/app/publishbuild镜像的文件路径,最后一个.是指要拷贝到当前镜像来的目录,.表示当前路径,一般也是配合WORKDIR使用

RUN

执行命令,构建镜像的时候需要安装其他软件或者编译文件的命令在这里执行,多条命令可以用&&来连接,以发布ASP.NET Core项目为例,将代码拷贝到镜像之后,需要进行restorebuildpublish,就可以在这里使用,例如:

RUN dotnet restore "./Jiamiao.x.ServiceA.csproj" && dotnet build "./Jiamiao.x.ServiceA.csproj" -c Release -o /app/build && dotnet publish "./Jiamiao.x.ServiceA.csproj" -c Release -o /app/publish

ENTRYPOINT

一样是执行命令,但是这里是容器启动的时候要执行的命令,比如上面那些恢复、编译、发布的命令就不能在这里执行,因为容器启动的时候是不用做这些操作的,作为容器启动,只需要启动站点即可,所以这里使用的是运行命令,所以每个Dockerfile只有一个ENTRYPOINT,多个ENTRYPOINT后面会覆盖前面

ENTRYPOINT [ "dotnet","Jiamiao.x.ServiceA.dll" ]

上面的命令等于在命令行执行dotnet Jiamiao.x.ServiceA.dll这个命令

具体操作

创建项目

创建名字为Jiamiao.x.ServiceAASP.NET Core项目,类型为API,这里只是做发布测试,所以不需要动任何代码

创建Dockerfile文件

这里使用VSCode为例,在VSCode中安装Docker扩展,如下图

微信截图_20200409164449.png

Ctrl + Shift + P,打开控制面板,输入add docker,选择Docker:Add Docker Files To Workspace,如下图

微信截图_20200409164940.png

选择.NET:ASP.NET Core,如下图

微信截图_20200409165104.png

选择Linux,如下图

微信截图_20200409165115.png

选择No,如下图

微信截图_20200409165128.png

默认输入80, 443保持不变,回车即可生成Dockerfile文件
微信截图_20200409165140.png

好了!这里的文件内容不是我们想要的,直接删掉Dockerfile里的文件内容即可,我们主要是要自动生成一个.dockerignore文件

编写Dockerfile文件

确定以下思路,这里需要将代码拷贝进容器进行编译发布,然后再将发布好的文件拷贝到运行时的镜像中,容器运行时启动站点,具体代码如下:

# 指定运行是镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app

# 指定编译和发布镜像
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
# 设置工作目录为src
WORKDIR /src
# 拷贝所有文件到容器中的工作目录
COPY . ./
RUN dotnet restore "./Jiamiao.x.ServiceA.csproj" && dotnet build "./Jiamiao.x.ServiceA.csproj" -c Release -o /app/build && dotnet publish "./Jiamiao.x.ServiceA.csproj" -c Release -o /app/publish

FROM base as final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT [ "dotnet","Jiamiao.x.ServiceA.dll" ]

这里使用了两个镜像,一个是编译发布用的mcr.microsoft.com/dotnet/core/sdk:3.1简称为build,一个是运行时用的mcr.microsoft.com/dotnet/core/aspnet:3.1简称base

生成镜像

在项目根目录,即Dockerfile所在目录运行预下命令

docker build -t xiejiamiao/aspnetcore .

其中xiejiamiao/aspnetcore为镜像名字,后面的.表示使用当前目录的Dockerfile。如果生成成功,使用docker images应该就可以看到刚刚生成的镜像,执行以下命令启动容器

docker run -d -p 8080:80 xiejiamiao/aspnetcore --name ASPNETCore-X
  • -d表示后台运行容器
  • 8080:80是指将宿主机的8080端口映射到容器中的80端口
  • xiejiamiao/aspnetcore为镜像的名字
  • ASPNETCore-X为镜像运行起来的容器的名字
    容器启动成功后,访问http://127.0.0.1:8080/WeatherForecast应该就可以看到返回一些json
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值