ASP.NET Core部署Docker教程

以下是从零开始创建 BigDogServer 项目并部署到 Docker 的完整指南:


一、创建解决方案和项目

1. 创建解决方案目录结构
mkdir BigDogSolution
cd BigDogSolution
dotnet new sln -n BigDogServer
2. 创建核心类库项目
# 创建类库目录
mkdir -p src/BigDogServer.Core
cd src/BigDogServer.Core
dotnet new classlib -f net8.0 -n BigDogServer.Core
3. 创建主WebAPI项目
# 返回解决方案根目录
cd ../..
mkdir -p src/BigDogServer
cd src/BigDogServer
dotnet new webapi -f net8.0 -n BigDogServer
4. 添加项目到解决方案
cd ../..
dotnet sln add src/BigDogServer.Core/BigDogServer.Core.csproj
dotnet sln add src/BigDogServer/BigDogServer.csproj
5. 添加项目引用
cd src/BigDogServer
dotnet add reference ../BigDogServer.Core/BigDogServer.Core.csproj

二、配置端口和示例代码

1. 修改 Program.cs
var builder = WebApplication.CreateBuilder(args);

// 添加服务配置
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// 配置中间件
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();
app.MapControllers();

// 动态端口配置(优先使用环境变量)
var port = Environment.GetEnvironmentVariable("ASPNETCORE_PORT") ?? "7789";
app.Run($"http://0.0.0.0:{port}");
2. 在核心库中添加示例类
// src/BigDogServer.Core/ExampleService.cs
namespace BigDogServer.Core;

public class ExampleService
{
    public string GetWelcomeMessage() => "Welcome from Core Library!";
}
3. 在主项目中使用核心库
// 在 Program.cs 的 builder.Build() 前添加:
builder.Services.AddScoped<ExampleService>();

// 添加测试控制器
// src/BigDogServer/Controllers/CoreTestController.cs
using BigDogServer.Core;
using Microsoft.AspNetCore.Mvc;

namespace BigDogServer.Controllers;

[ApiController]
[Route("[controller]")]
public class CoreTestController : ControllerBase
{
    private readonly ExampleService _service;

    public CoreTestController(ExampleService service)
    {
        _service = service;
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(_service.GetWelcomeMessage());
    }
}

三、配置 Docker 环境

1. 创建 .dockerignore
**/.git
**/.vs
**/bin
**/obj
**/node_modules
Dockerfile
*.md
*.dockerignore
2. 编写 Dockerfile
# 第一阶段:构建
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build

# 设置工作目录
WORKDIR /src

# 复制解决方案和项目文件
COPY *.sln .
COPY src/BigDogServer/*.csproj ./src/BigDogServer/
COPY src/BigDogServer.Core/*.csproj ./src/BigDogServer.Core/

# 恢复依赖(利用缓存)
RUN dotnet restore "BigDogServer.sln"

# 复制所有源代码
COPY . .

# 构建发布版本
RUN dotnet publish "src/BigDogServer/BigDogServer.csproj" \
    -c Release \
    -o /app/publish \
    --no-restore

# 第二阶段:运行时
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app

# 设置时区(中国时区)
RUN apt-get update && \
    apt-get install -y tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 复制构建结果
COPY --from=build /app/publish .

# 配置安全上下文
RUN adduser --disabled-password --gecos '' appuser && \
    chown -R appuser:appuser /app
USER appuser

# 环境变量配置
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS=http://0.0.0.0:7789

# 暴露端口
EXPOSE 7790

# 启动命令
ENTRYPOINT ["dotnet", "BigDogServer.dll"]

四、构建和运行

1. 构建 Docker 镜像
docker build -t bigdogserver:1.0 .
2. 运行容器
docker run -d \
  -p 7790:7789 \
  --name bigdog-app \
  -e ASPNETCORE_ENVIRONMENT=Development \
  bigdogserver:1.0
3. 验证部署
# 查看容器日志
docker logs bigdog-app

# 测试核心库接口
curl http://localhost:7790/coretest
# 应返回:"Welcome from Core Library!"

# 检查健康状态
docker inspect --format='{{json .State.Health}}' bigdog-app

五、关键配置说明

配置项作用说明关联文件
多阶段构建分离构建环境与运行时环境,减小镜像体积Dockerfile
分层复制策略优先复制.csproj文件,优化Docker缓存利用率Dockerfile
动态端口配置支持通过环境变量覆盖默认端口Program.cs
非root用户运行提升容器安全性Dockerfile
时区配置保证容器内时间准确Dockerfile
环境变量分离区分开发与生产环境配置docker run命令

六、常见问题解决

  1. 依赖恢复失败

    # 清理缓存重新构建
    docker build --no-cache -t bigdogserver:1.0 .
    
  2. 端口冲突错误

    # 停止占用进程
    sudo lsof -i :7790
    # 或更换主机端口
    docker run -d -p 7791:7789 ...
    
  3. 文件权限问题

    # 临时进入容器排查
    docker exec -it bigdog-app bash
    ls -l /app
    
  4. 未更新代码变更

    # 重新构建并替换容器
    docker build -t bigdogserver:1.0 .
    docker stop bigdog-app && docker rm bigdog-app
    docker run ... # 使用新参数重新运行
    

七、生产环境建议

  1. 添加健康检查(在Dockerfile末尾添加):

    HEALTHCHECK --interval=30s --timeout=3s \
      CMD curl -f http://localhost:7789/health || exit 1
    
  2. 配置内存限制

    docker run -d \
      --memory=512m \
      --cpus=1.5 \
      ...
    
  3. 启用HTTPS

    # 在运行时镜像中添加
    EXPOSE 443
    ENV ASPNETCORE_URLS=https://+:443;http://+:80
    
  4. 日志收集

    docker run -d \
      --log-driver=syslog \
      --log-opt syslog-address=udp://logserver:514 \
      ...
    
### 如何在Word中对多个参考文献进行并列引用 在Microsoft Word中实现多个参考文献的并列引用可以通过多种方法完成,具体取决于用户的实际需求和使用的工具。以下是几种常见的方式: #### 使用交叉引用功能 当需要在同一位置引用多个参考文献时,可以借助Word中的“交叉引用”功能逐一插入每一条参考文献编号,并通过手动调整使其呈现为连续的形式[^1]。 例如,假设您已经在文档中标记好了若干条尾注或脚注形式的参考文献,则可以在正文适当的位置执行如下操作: 1. 将光标定位到希望显示这些参考文献的地方; 2. 转至菜单栏上的 **引用** → **交叉引用** ,打开对话框; 3. 设置 “引用类型” 为 `尾注` 或者 `脚注`, 同时确认选择了合适的选项如“尾注编号 (带格式)”; 4. 连续选取目标参考项后点击确定按钮依次添加它们。 最终得到的结果类似于 `[1], [2], 和 [3]` 的样式。 #### 自定义域代码方式 另一种更为灵活的技术涉及直接编辑域代码来控制输出表现。这种方法允许用户更加精细地定制所需外观而无需依赖图形界面交互步骤[^5]。 - 开始同样是从常规途径创建初始引用链接开始。 - 接着右击已存在的引用标记选择“切换域代码”查看内部结构。 - 修改其中参数,在原有`\h`标志之后追加额外内容以指定附加项目及其分隔符逻辑。 举个例子来说就是把原本简单的 `{ REF _RefXXXXX \h }` 变形成为类似下面这种复合表达式: ```plaintext {REF _Ref12345 \h}{, }{REF _Ref67890 \h} ``` 这里需要注意的是括号内的占位符应当替换成对应的实际对象ID值。 #### 利用第三方插件或者专用软件辅助管理 除了上述基于原生特性的解决办法之外,还有不少专门针对学术写作场景设计的应用程序能够极大地简化这一过程。比如[Citavi][^2]不仅提供了强大的资源管理和组织能力,同时也内置了丰富的模板库用于快速生成符合特定期刊要求的标准书目列表。另外像EndNote这类产品则可以直接集成进入Office套件当中从而无缝衔接整个创作流程[^4]。 无论采取哪种策略都需要考虑到团队协作环境下的兼容性和一致性维护问题,因此建议事先统一规范再贯彻实施下去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若汝棋茗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值