<p style="list-style: none; margin: 0px 0px 10px; padding: 0px 4px 0px 0px; border-width: 0px 0px 2px; border-top-style: initial; border-right-style: initial; border-bottom-style: solid; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-bottom-color: rgb(204, 204, 204); border-left-color: initial; border-image: initial; font-family: "Microsoft YaHei"; font-size: 32px;">.Net API Ubuntu 18.04.6 Docker发布</p><p> 虚拟环境就按上一节的基础上来。</p><p> 安装之前,确认下当前的环境,如下:<br/></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/a9cefe2b9827401382d5b523613ef95c.jpg?638586331209112444" title="QQ截图20240807131149.jpg" alt="QQ截图20240807131149.jpg"/></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 18px;">新建.net工程</span><br/></p><p>参考博客:<a href="https://blog.csdn.net/hyq106/article/details/129046618" target="_blank">https://blog.csdn.net/hyq106/article/details/129046618</a> </p><p><br/></p><p>打开Visual Studio 2022,创建一个新的webapi项目。</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/4be94434efc245298dabf4f6b3a33e40.jpg?638586359938944709" title="QQ截图20240807135945.jpg" alt="QQ截图20240807135945.jpg"/></p><p><br/></p><p>默认选项,一直下一步就ok。注意框架要使用.net6.0,不要选择.netframework(不支持跨平台)。</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/718c1fb780214f51b079e5b49691cadd.jpg?638586360484290257" title="QQ截图20240807140039.jpg" alt="QQ截图20240807140039.jpg"/></p><p><br/></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/8c91ded4d7684f78bf87fe1c67c1e524.jpg?638586361002835085" title="QQ截图20240807140133.jpg" alt="QQ截图20240807140133.jpg"/></p><p><br/></p><p>创建完后,已经生成完整的示例代码了,这个项目是可以直接运行的。这里我们在Program.cs文件中,稍作修改,在最后一行Run方法指定api的端口号,如下:</p><pre class="brush:c#;toolbar:false">var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run("http://*:1040");</pre><p><br/></p><p>运行起来</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/9555767c610749ff86105a97da6ab24f.jpg?638586362993374354" title="QQ截图20240807140451.jpg" alt="QQ截图20240807140451.jpg"/></p><p><br/></p><p>在浏览器输入地址“http://localhost:1040/WeatherForecast”,结果如下:</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/365f59bb7db54ffaa07d3c0d026de373.jpg?638586363530467877" title="QQ截图20240807140542.jpg" alt="QQ截图20240807140542.jpg"/></p><p><br/></p><p>项目运行没有问题。下一步要部署到linux上去。</p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 18px;">生成Dockerfile</span></p><p>右键项目,选择“添加”-“Docker支持”。</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/c1b5cb50ecd1472fb36cca914831da43.jpg?638586366000706785" title="QQ截图20240807140941.jpg" alt="QQ截图20240807140941.jpg"/></p><p><br/></p><p>选择“Linux”,确定。</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/e354ac52d1584f9eb480e2e45de58a24.jpg?638586366307703466" title="QQ截图20240807141023.jpg" alt="QQ截图20240807141023.jpg"/></p><p><br/></p><p>在项目下会生成一个Dockerfile(没有后缀名),修改暴露的端口,内容如下:</p><pre class="brush:js;toolbar:false">#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
WORKDIR /app
EXPOSE 1040
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplicationApi/WebApplicationApi.csproj", "WebApplicationApi/"]
RUN dotnet restore "WebApplicationApi/WebApplicationApi.csproj"
COPY . .
WORKDIR "/src/WebApplicationApi"
RUN dotnet build "WebApplicationApi.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplicationApi.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplicationApi.dll"]</pre><p><br/></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/cc8777d7c3c64326910e27d204ec2c0b.jpg?638586368120268789" title="QQ截图20240807141319.jpg" alt="QQ截图20240807141319.jpg"/></p><p><br/></p><p>将Dockerfile复制到上一级目录(即和解决方案.sln文件同一级目录)下。</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/d32fd3f666084420bb50806f519b335d.jpg?638586369590992826" title="QQ截图20240807141552.jpg" alt="QQ截图20240807141552.jpg"/></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 18px;">上传至Linux</span></p><p>将整个项目的源码上传至linux,博主因为使用的是虚拟机,所以这里使用挂载目录进行上传,当然你也可以使用FTP工具进行上传。</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/3bb70110cca245bb8ad33905844490a2.jpg?638586375138176177" title="QQ截图20240807142504.jpg" alt="QQ截图20240807142504.jpg"/></p><p><br/><strong>Docker部署</strong></p><p>使用以下命令,根据net目录下的Dockerfile文件,编译项目并创建docker镜像。</p><pre class="brush:bash;toolbar:false"># 一定不要忘记后面的点
docker build -t [起一个镜像名] .
# 博主这里直接取名为 testapi
docker build -t testapi .</pre><p><br/></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/ed2253067523437bb93a88b3175cd52c.jpg?638586380416129017" title="QQ截图20240807143352.jpg" alt="QQ截图20240807143352.jpg"/></p><p><br/></p><p>使用以下命令,创建和启动容器</p><pre class="brush:bash;toolbar:false">docker run -d -p 8888:80 --name [起一个容器名] [构建镜像时起的镜像名]
# 博主使用的是如下命令
docker run -d -p 1040:1040 --name netapi testapi</pre><p><br/></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/003ff4e36e14457bb0914d95109eaebd.jpg?638586381774012169" title="QQ截图20240807143607.jpg" alt="QQ截图20240807143607.jpg"/></p><p><br/></p><p>虚拟机外部访问:http://192.168.1.5:1040/WeatherForecast</p><p>虚拟机内部访问:http://127.0.0.1:1040/WeatherForecast</p><p><span style="color: rgb(255, 0, 0);">注意:这里无法访问swagger,貌似需要设置,默认是不允许访问的</span></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/41862d034c0f4d7aa27302527757fb82.jpg?638586383232277384" title="QQ截图20240807143829.jpg" alt="QQ截图20240807143829.jpg"/></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 18px;">补充内容1</span><br/></p><p>如果需要开启swagger访问,访问地址:“http://127.0.0.1:1040/swagger/index.html”</p><p>需要进行如下修改</p><p>参考博客:<a href="http://www.bilibili996.com/Course?id=98f6b6ce73994bf283294474c070e8e2" target="_blank" title="ASP.NET IIS发布">ASP.NET IIS发布</a></p><pre class="brush:c#;toolbar:false">var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
# region 旧配置
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
// app.UseSwagger();
// app.UseSwaggerUI();
//}
#endregion
# region 改成这样
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage(); // 配置异常中间件
}
app.UseSwagger();
app.UseSwaggerUI();
#endregion
app.UseAuthorization();
app.MapControllers();
app.Run("http://*:1040");</pre><p><br/></p><p>这样你就能访问swagger了</p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/0a75db5dbc474c8fb420cc66fe36cfaf.jpg?638587126658184535" title="QQ截图20240808111732.jpg" alt="QQ截图20240808111732.jpg"/></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 18px;">补充内容2</span></p><p>考虑到每次更新都要重新部署容器,博主自己写了一个脚本,格式如下</p><pre class="brush:bash;toolbar:false">#!/bin/bash
docker stop [docker ps中对应的NAMES名字]
docker rm [docker ps中对应的NAMES名字]
docker rmi [docker images中对应的REPOSITORY名字]
docker build -t [docker images中对应的REPOSITORY名字] .
docker run -d -p 1040:1040 --name [docker ps中对应的NAMES名字] [docker images中对应的REPOSITORY名字]
docker images
docker ps</pre><p><br/></p><p>当前工程,重新部署的脚本如下:</p><pre class="brush:bash;toolbar:false">#!/bin/bash
docker stop netapi
docker rm netapi
docker rmi testapi
docker build -t testapi .
docker run -d -p 1040:1040 --name netapi testapi
docker images
docker ps</pre><p><br/></p><p><img class="pimg" src="http://www.bilibili996.com/upload/image/57431bc177d043bdac0c9995ce69cc2c.jpg?638587130590629583" title="QQ截图20240808112043.jpg" alt="QQ截图20240808112043.jpg"/></p><p><br/></p><p><br/></p>
.Net API Ubuntu 18.04.6 Docker发布
虚拟环境就按上一节的基础上来。
安装之前,确认下当前的环境,如下:
新建.net工程
参考博客:https://blog.csdn.net/hyq106/article/details/129046618
打开Visual Studio 2022,创建一个新的webapi项目。
默认选项,一直下一步就ok。注意框架要使用.net6.0,不要选择.netframework(不支持跨平台)。
创建完后,已经生成完整的示例代码了,这个项目是可以直接运行的。这里我们在Program.cs文件中,稍作修改,在最后一行Run方法指定api的端口号,如下:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run("http://*:1040");
运行起来
在浏览器输入地址“http://localhost:1040/WeatherForecast”,结果如下:
项目运行没有问题。下一步要部署到linux上去。
生成Dockerfile
右键项目,选择“添加”-“Docker支持”。
选择“Linux”,确定。
在项目下会生成一个Dockerfile(没有后缀名),修改暴露的端口,内容如下:
#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
WORKDIR /app
EXPOSE 1040
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplicationApi/WebApplicationApi.csproj", "WebApplicationApi/"]
RUN dotnet restore "WebApplicationApi/WebApplicationApi.csproj"
COPY . .
WORKDIR "/src/WebApplicationApi"
RUN dotnet build "WebApplicationApi.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplicationApi.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplicationApi.dll"]
将Dockerfile复制到上一级目录(即和解决方案.sln文件同一级目录)下。
上传至Linux
将整个项目的源码上传至linux,博主因为使用的是虚拟机,所以这里使用挂载目录进行上传,当然你也可以使用FTP工具进行上传。
Docker部署
使用以下命令,根据net目录下的Dockerfile文件,编译项目并创建docker镜像。
# 一定不要忘记后面的点
docker build -t [起一个镜像名] .
# 博主这里直接取名为 testapi
docker build -t testapi .
使用以下命令,创建和启动容器
docker run -d -p 8888:80 --name [起一个容器名] [构建镜像时起的镜像名]
# 博主使用的是如下命令
docker run -d -p 1040:1040 --name netapi testapi
虚拟机外部访问:http://192.168.1.5:1040/WeatherForecast
虚拟机内部访问:http://127.0.0.1:1040/WeatherForecast
注意:这里无法访问swagger,貌似需要设置,默认是不允许访问的
补充内容1
如果需要开启swagger访问,访问地址:“http://127.0.0.1:1040/swagger/index.html”
需要进行如下修改
参考博客:ASP.NET IIS发布
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
# region 旧配置
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
// app.UseSwagger();
// app.UseSwaggerUI();
//}
#endregion
# region 改成这样
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage(); // 配置异常中间件
}
app.UseSwagger();
app.UseSwaggerUI();
#endregion
app.UseAuthorization();
app.MapControllers();
app.Run("http://*:1040");
这样你就能访问swagger了
补充内容2
考虑到每次更新都要重新部署容器,博主自己写了一个脚本,格式如下
#!/bin/bash
docker stop [docker ps中对应的NAMES名字]
docker rm [docker ps中对应的NAMES名字]
docker rmi [docker images中对应的REPOSITORY名字]
docker build -t [docker images中对应的REPOSITORY名字] .
docker run -d -p 1040:1040 --name [docker ps中对应的NAMES名字] [docker images中对应的REPOSITORY名字]
docker images
docker ps
当前工程,重新部署的脚本如下:
#!/bin/bash
docker stop netapi
docker rm netapi
docker rmi testapi
docker build -t testapi .
docker run -d -p 1040:1040 --name netapi testapi
docker images
docker ps