部署dotnet core项目(linux、supervisor、docker)

后台运行项目

安装dotnet core sdk

https://dotnet.microsoft.com/en-us/download/dotnet/6.0

创建项目

dotnet new mvc -o ./app1
cd app1
# 发布项目
dotnet publish -o ../app1_publish -c Release
# 运行测试
nohup dotnet ../app1_publish/app1.dll --urls="http://*:5001" &

nohup [command] &命令可后台运行程序,注意后面的&必须加

通过supervisor运行项目

服务器重启或项目挂了,项目可自启动

安装supervisor

yum install supervisor
systemctl start supervisord.service 

如果supervisor启动异常,查看日志:

tail -f /var/log/messages

创建配置文件、重启supervisor服务

touch /etc/supervisord.d/app1.ini	--添加一个项目的配置文件
systemctl restart supervisord.service

app1.init中添加如下内容:

[program:app1]
directory=/root/dotnetdemo/app1_publish
command=/root/dotnet/dotnet app1.dll --urls "http://*:5000"
autostart=true
autorestart=true
stdout_logfile=/root/dotnetdemo/app1_publish/logs/out.log
stderr_logfile=/root/dotnetdemo/app1_publish/logs/err.log

创建日志文件:
如果不创建日志文件,启动会报错

mkdir /root/dotnetdemo/app1_publish/logs
touch /root/dotnetdemo/app1_publish/logs/out.log
touch /root/dotnetdemo/app1_publish/logs/err.log

设置supervisor服务开机自启动

# 查看是否开机自启动
systemctl list-unit-files | grep supervisord
# 设置开机自启动
systemctl enable supervisord.service

通过docker部署

在 Docker 中部署网站有两种方式:
发布后构建:此方式是先发布网站后在再构建镜像,这样可以减少不必要的构建层,而且还能缩减镜像大小。
编译+构建+发布:也就是说在 Dockerfile 中配置网站从构建到发布的完整过程,此方式会速度慢。

微软提供的基础镜像:
SDK:mcr.microsoft.com/dotnet/sdk:6.0
ASPNetCore Runtime:mcr.microsoft.com/dotnet/aspnet:6.0
DotNetCore Runtime:mcr.microsoft.com/dotnet/runtime:6.0
参考:https://www.jianshu.com/p/e7153e58107d

创建console项目

dotnet new console -o ./ConsoleDockerDemo

修改program.cs

while (true)
{
    Console.WriteLine("Hello, World!");
    await Task.Delay(1000);
}

新建Dockerfile文件

touch Dockerfile
vim Dockerfile

Dockerfile内容:

# 最简单的制作镜像的方式,缺点是直接使用sdk镜像,镜像过大,有700多兆。推荐使用sdk+runtime镜像运行项目,看Dockerfile2
FROM mcr.microsoft.com/dotnet/sdk:6.0
WORKDIR /app
COPY . /app
CMD ["dotnet","run"]

创建镜像

docker build -t fan/console1 .

创建、启动容器

docker run -d --name myconsole1 --restart always fan/console1
#查看容器日志
docker logs myconsole1
#进入容器查看
docker exec -it myconsole1 /bin/bash

多阶段构建

以上方式创建的镜像过大,因为我们使用的dotnet/sdk作为镜像基础来打包的,实际上我们在开发环境只需要运行时环境和相应的dll就可以了.

创建Dockerfile2:

FROM mcr.microsoft.com/dotnet/sdk:6.0 as build-env
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/runtime:6.0
WORKDIR /app
COPY  --from=build-env /src/out /app
CMD ["dotnet","ConsoleDockerDemo.dll"]

创建镜像:

docker build -t fan/console2 -f Dockerfile2 .

默认不需要指定Dockerfile文件名,但是如果使用其他文件名,必须使用-f指定文件名
创建、启动容器:

docker run -d --restart always --name myconsole2 fan/console2
docker logs myconsole2

通过docker部署aspnet core项目

这个应用包括两个项目ASPNetCoreDockerDemoDockerCommonDockerCommon是个类库

Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:6.0 as build
WORKDIR /src
COPY . .
RUN dotnet publish  "ASPNetCoreDockerDemo/ASPNetCoreDockerDemo.csproj" -c Release -o /src/out

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
EXPOSE 80
COPY  --from=build /src/out /app
CMD ["dotnet","ASPNetCoreDockerDemo.dll"]

创建镜像

docker build -t fan/aspnetcore .

创建、启动容器

docker run -d --name myaspnetcore1 -p 5003:80 --restart always fan/aspnetcore

还有一种方案是在本地发布项目
dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY bin/linux64/release .
ENTRYPOINT ["dotnet", "AspNetDemo.dll"]

posted @ 2022-08-28 23:44  .Neterr  阅读(249)  评论(0编辑  收藏  举报