Linux环境下使用Docker部署.Net8应用
🖥️ 环境准备
开发工具:VisualStudio2022
服务器:腾讯云 Ubuntu 22.04 LTS (GNU/Linux 5.15.0-91-generic x86_64)
默认服务器已有 Docker 环境
Install Docker Engine on Ubuntu
📁 项目准备
启用 Docker 支持,os 选择 Linux
项目列表自动添加一个 Dockerfile 文件,我们需要修改该文件
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base # 注释掉 USER app,这句话的意思是我们的docker镜像中要有用户名app, # 这样可以避免一些安全问题,但是需要额外添加用户app #USER app WORKDIR /app # 可有可无 EXPOSE 5000 # 下面注释掉是为了不拷贝整个解决方案,只拷贝项目发布后的文件 #FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build #ARG BUILD_CONFIGURATION=Release #WORKDIR /src #COPY ["WenYan.Service.Api/WenYan.Service.Api.csproj", "WenYan.Service.Api/"] #RUN dotnet restore "./WenYan.Service.Api/./WenYan.Service.Api.csproj" COPY . . #WORKDIR "/src/WenYan.Service.Api" #RUN dotnet build "./WenYan.Service.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build # #FROM build AS publish #ARG BUILD_CONFIGURATION=Release #RUN dotnet publish "./WenYan.Service.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false # #FROM base AS final #WORKDIR /app #COPY --from=publish /app/publish . # 添加时区环境变量,亚洲,上海 ENV TimeZone=Asia/Shanghai # 使用软连接,并且将时区配置覆盖/etc/timezone RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone ENTRYPOINT ["dotnet", "WenYan.Service.Api.dll"]
生成发布文件
将发布后的文件拷贝到服务器🧰 项目部署
构建 Docker 镜像
根据镜像构造容器
注意:ASPNETCORE_HTTP_PORTS 环境变量,设置映射端口 ,.Net8 默认 ASP.NET Core 端口已更改为 80 到 8080
中断性变更:默认 ASP.NET Core 端口已更改为 80 到 8080 - .NET
#创建docker镜像 sudo docker build -t dotnetapi . #运行启动镜像,使用的是5000端口,这里最好跟Dockerfile文件中的端口保持一致,不然会出现些莫名其妙的问题 sudo docker run --name dotnetapi -p 5000:5000 -d --restart=on-failure:3 dotnetapi
# 查看日志信息
docker logs --tail=1000 dotnetapi
# 查看运行的容器
docker ps
#已有的容器更新为自动重启
docker update --restart=always 容器ID(或者容器名)
#已更新已有的 nginx 容器为例
docker update --restart=always nginx
#已更新已有的 tomcat 容器为例
docker update --restart=always tomcat
关于 –restart 策略参数 说明如下:
--restart 策略 命令 作用备注 no 默认策略,在容器退出时不重启容器 on-failure 在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3 在容器非正常退出时重启容器,最多重启3次 always 在容器退出时总是重启容器 unless-stopped 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
查看容器日志
开放 8050 端口即可外部访问