Docker极简入门系列(四):布署一个ASP.NET Core项目

本系列为Docker的学习笔记,内容比较精简,主要用于快速复习和随时查询。计划分六个章节内容:

  • 安装、常用命令和基本概念理解
  • 常用应用程序的容器部署
  • 制作镜像的两种方式(容器转镜像和Dockerfile)
  • 布署一个ASP.NET Core项目
  • 服务编排Docker compose

 

 

一、解读一下VisualStudio为我们创建的Docker支持

1、创建ASP.NET Core项目时,勾选Docker支持。或者在项目编辑状态下,右击项目名称,在弹出窗口中选择【添加>Docker支持】

 

 

 

2、解读ASP.NET Core添加Docker支持后,自动生成的Dockerfile文件

复制代码
#本Dockfile使用了多 FROM 指令,完成了项目的编译、发布、创建镜像等多个过程
#每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建
#最后生成的镜像,是最后一个构建阶段的结果
#在多 FROM 指令中,前置阶段中产生的文件或镜像,可以在后置阶段中使用

#另外,需要注意宿主机和容器,当前目录的切换
#宿主机的当前目录,一直都在Dockerfile文件所在的目录下,称之为上下文目录
#容器的当前目录,通过WORKDIR指令切换





#构建阶段一:

#开始一个新的构建阶段,基于aspnet:6.0镜像,并将此构建阶段命名为【base】
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

#容器的当前目录,切换到/app
WORKDIR /app

#暴露端口号,使用默认的TCP协议,创建容器时,需要建立与宿主机端口的映射
EXPOSE 80
EXPOSE 443





#构建阶段二:编译项目

#开始一个新的构建阶段,基于sdk:6.0镜像,并将此构建阶段命名为【build】
#基于dotnet的SDK,我们才可以使用dotnet build等CLI命令
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build

#容器的当前目录,切换到/src
WORKDIR /src

#将宿主机的项目主文件,拷贝到容器的NETCoreDocker目录下
#注意,此时容器的当前目录为/src
#所以,csproj文件,实际被拷贝到/src/NETCoreDocker/目录下
COPY ["NETCoreDocker/NETCoreDocker.csproj", "NETCoreDocker/"]

#在容器中执行dotnet restore命令,下载项目的依赖包
RUN dotnet restore "NETCoreDocker/NETCoreDocker.csproj"

#将宿主机的当前目录文件,拷贝到容器的当前目录下(/src)
COPY . .

#容器的当前目录,切换到/src/NETCoreDocker
WORKDIR "/src/NETCoreDocker"

#在容器中执行 dotnet build 命令,编译项目,并将编译后的文件输出到容器的 app/build 目录下
RUN dotnet build "NETCoreDocker.csproj" -c Release -o /app/build





#构建阶段三:发布项目

#开始一个新的构建阶段,基于阶段二构建的build镜像,并将此构建阶段命名为【publish】
FROM build AS publish

#在容器中执行 dotnet publish 命令,发布项目,并将发布文件输出到容器的 app/publish 目录下
RUN dotnet publish "NETCoreDocker.csproj" -c Release -o /app/publish





#构建阶段四:创建最后输出的镜像

#开始一个新的构建阶段,基于阶段一构建的base镜像,并将此构建阶段命名为【final】
FROM base AS final

#容器的当前目录,切换到/app
WORKDIR /app

#将前置阶段构建的publish文件夹下的所有文件,都拷贝到publish文件夹下
#最后一个点,将app/publish目录,指定为Docker引擎的上下文目录
COPY --from=publish /app/publish .

#设置容器的入口命令,命令名称为dotnet,参数为NETCoreDocker.dll
ENTRYPOINT ["dotnet", "NETCoreDocker.dll"]
复制代码

 

 

 

二、个人认为发布ASP.NET Core项目的最佳实践

通过解读ASP.NET Core自动创建的Dockerfile,我们发现这个镜像做的工作比较多,又是编译、又是发布的,实际上并不需要这样,而且将源代码传到服务器上,也不安全。所以我们一般是先在本地发布,然后使用发布后的项目文件制作镜像,可能省却编译和发布的过程。基本的步骤如下:

 

1、在VisualStudio中,先编译预览一下项目,没有问题的话,直接发布。注意:项目不需要添加Docker支持,我们直接在Linux服务器上手写Dockerfile,更不需要安装Windows版的Docker Desktop

 

 

2、偷点懒,使用Xftp,直接将发布后的文件,上传到Linux服务器的项目文件夹下(文件夹位置和名称按自己的工作习惯来)

 

 

 

 

3、回到Linux服务器,进入项目文件所在目录,开始一顿猛如虎的操作

1)制作Dockerfile

#进入项目所在目录

cd ~/dotnetcore/weather/publish/

#创建Dockerfile

vim Dockerfile

========================================

#以下为Dockerfile文件内容

#开始一个新的构建阶段,基于aspnet:6.0镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

#拷贝宿主机的当前文件夹到镜像的app目录
COPY . /app

#容器的当前工作目录,切换到/app
WORKDIR /app

#对外暴露端口号为80
EXPOSE 80

#设置容器的入口命令
ENTRYPOINT ["dotnet", "Weather.dll"]

 

#保存退出

:wq

========================================

 

2)制作镜像

#保存退出VIM编辑器后,保持在项目文件所在目录下(~/dotnetcore/weather/publish/),开始制作镜像

docker build -f Dockerfile -t weather_image:1 .

#查看一下是否已经成功。weather_image:1镜像制作成功,依赖的运行时镜像asp.net:6也自动拉取下来了

docker images

 

 

 

3)创建容器

#开始创建容器,将虚拟机的8888端口和项目对外暴露的端口80,建立映射

docker run -id --name=weather_c1 -p 8888:80 weather_image:1

#查看一下是否成功

 

 

4)浏览项目

#激动人心的最后时刻终于到来,在浏览器中请求weather api,成功返回数据

 

 

三、最后划重点,Dockerfile的常用指令一定要弄明白

 

posted @   functionMC  阅读(433)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示