简简单单学docker在群晖nas中构建docker版aspnetcore网站

yaoyue68‘s blog / 2023-07-31 / 原文

琢磨了n天,掉了好多头发,终于可以了,踩坑无数!终于行了!

先来了解下:

1.net运行时runtime和sdk,简单来说就是sdk开发用的,runtime是用来运行的,所以构建dockerfile只用runtime就够了!

2.docker运行不需要打包操作系统如ubuntu等进入包内!特殊需要的可以!这个问题都必须了解!

正式开始

1.用vs2022完成aspnet网站的建设和测试,我用的是blazorserve框架,一样的,必须先发布才能打包,2种方式

  用vs发布到文件夹或者用

 

2.创建Dockerfile文件,最好放在项目文件夹外面.

用vs2022项目右键添加docker支持,创建的dockfile如下

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base          这是dotnet运行时,必须的
WORKDIR /app        相当于cd /app 进入目录,位置是相对dockerfile的位置来说的
EXPOSE 80             容器暴露哪个端口

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build              引入sdk,完全没有必要,开发在本地就可以了,下面的都没用,去掉一个from就是一个层,from多文件就大
WORKDIR /src
COPY ["BlazorApp1.csproj", "."]
RUN dotnet restore "./BlazorApp1.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "BlazorApp1.csproj" -c Release -o /app/build

FROM build AS publish                                                                              从上一步as build层中发布网站到publish目录
RUN dotnet publish "BlazorApp1.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final                     以运行时为基础打包
WORKDIR /app
COPY --from=publish /app/publish .      从publish环境中复制出来发布的文件到app目录
ENTRYPOINT ["dotnet", "BlazorApp1.dll"]      运行

太复杂了,很多用不到,一个from就是一个文件层,from多文件就庞大,
用下面这个精简版
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base    只引入运行时
WORKDIR /app       没有就创建
EXPOSE 80
COPY ./publish .     copy dockfile同级别的发布后的文件夹内容到app目录
ENTRYPOINT ["dotnet", "BlazorApp1.dll"]     运行

到这一步到拷贝dockerfile 和项目发布的文件夹publish到 群晖nas中随便一个文件夹,用putty工具连接群晖的22端口,sudo -i 进入管理员模式

用 命令 docker build 命令,一般用 docker build -t aspnetweb .  打包镜像到当前目录

docker build命令用于从Dockerfile构建镜像。

典型用法

docker build  -t ImageName:TagName dir

-t − 给镜像加一个Tag
ImageName − 给镜像起的名称
TagName − 给镜像的Tag名
Dir − Dockerfile所在目录

 等待pull镜像后构建成功,打开群晖的docker可以在镜像中看到,然后启动构建容器即可,构建容器的时候挂载到/app目录下,事先把项目app文件夹内容复制到所挂在的对应共享文件夹中,不然挂载后本地是空的,容器就没有内容报错,端口自己设置

这样就OK了!可以访问了