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命令 |
六、常见问题解决
依赖恢复失败
# 清理缓存重新构建 docker build --no-cache -t bigdogserver:1.0 .
端口冲突错误
# 停止占用进程 sudo lsof -i :7790 # 或更换主机端口 docker run -d -p 7791:7789 ...
文件权限问题
# 临时进入容器排查 docker exec -it bigdog-app bash ls -l /app
未更新代码变更
# 重新构建并替换容器 docker build -t bigdogserver:1.0 . docker stop bigdog-app && docker rm bigdog-app docker run ... # 使用新参数重新运行
七、生产环境建议
添加健康检查(在Dockerfile末尾添加):
HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:7789/health || exit 1
配置内存限制:
docker run -d \ --memory=512m \ --cpus=1.5 \ ...
启用HTTPS:
# 在运行时镜像中添加 EXPOSE 443 ENV ASPNETCORE_URLS=https://+:443;http://+:80
日志收集:
docker run -d \ --log-driver=syslog \ --log-opt syslog-address=udp://logserver:514 \ ...