news 2026/6/15 11:44:19

.NET 8 API +Angular 16 + Mysql利用docker compose发布

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET 8 API +Angular 16 + Mysql利用docker compose发布

下面是一个完整的基于.NET 8 Web API + Angular 16 + MySQL的项目结构,提供用于Docker 发布的Dockerfiledocker-compose.yml文件。该配置适用于生产环境部署。


🧱 项目结构(建议)

my-fullstack-app/ │ ├── backend/ # .NET 8 API 项目 │ ├── MyApi.csproj │ ├── Program.cs │ └── ... │ ├── frontend/ # Angular 16 项目 │ ├── angular.json │ ├── package.json │ └── ... │ ├── docker-compose.yml # 主要编排文件 └── .env # 环境变量文件(可选)

✅ 第一步:后端 (.NET 8 API) Dockerfile

backend/Dockerfile

# 使用 .NET 8 SDK 构建镜像 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env WORKDIR /app # 复制项目文件并还原 NuGet 包 COPY MyApi.csproj ./ RUN dotnet restore # 复制源码并发布 COPY . ./ RUN dotnet publish -c Release -o out --no-restore # 运行时镜像 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app COPY --from=build-env /app/out . # 暴露端口(默认 ASP.NET 使用 80) EXPOSE 80 # 启动应用 ENTRYPOINT ["dotnet", "MyApi.dll"]

🔁 替换MyApi.csprojMyApi.dll为你的实际项目名。


✅ 第二步:前端 (Angular 16) Dockerfile

frontend/Dockerfile

# 使用 Node.js 构建镜像 FROM node:18-alpine AS build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build -- --configuration=production # 使用 Nginx 提供静态文件服务 FROM nginx:alpine COPY --from=build-stage /app/dist/frontend /usr/share/nginx/html COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]

⚠️ 假设 Angular 构建输出目录是dist/frontend,如果不是,请根据angular.json中的outputPath修改。


✅ 第三步:Nginx 配置(用于反向代理 API)

frontend/nginx.conf

events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; # 静态文件服务 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } # 反向代理 API 请求到 .NET 后端 location /api/ { proxy_pass http://backend:80/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 其他可能需要代理的路径(如 SignalR) location /signalr/ { proxy_pass http://backend:80/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }

✅ 第四步:Docker Compose 编排文件

docker-compose.yml

version:'3.8'services:db:image:mysql:8.0container_name:app-mysqlrestart:unless-stoppedenvironment:MYSQL_ROOT_PASSWORD:your_root_password_hereMYSQL_DATABASE:MyAppDbMYSQL_USER:appuserMYSQL_PASSWORD:apppassports:-"3306:3306"volumes:-mysql_data:/var/lib/mysql-./init-sql:/docker-entrypoint-initdb.d# 可选:初始化 SQL 脚本command:--default-authentication-plugin=mysql_native_passwordbackend:build:context:./backenddockerfile:Dockerfilecontainer_name:app-backendrestart:unless-stoppedenvironment:-ASPNETCORE_ENVIRONMENT=Production-ConnectionStrings__DefaultConnection=Server=db;Port=3306;Database=MyAppDb;User=appuser;Password=apppass;depends_on:-dbexpose:-80frontend:build:context:./frontenddockerfile:Dockerfilecontainer_name:app-frontendrestart:unless-stoppedports:-"80:80"depends_on:-backendvolumes:mysql_data:# networks: # 如果需要自定义网络可启用# default:# driver: bridge

💡 注意:

  • ConnectionStrings__DefaultConnection使用双下划线__表示嵌套配置。
  • 确保后端代码中正确读取此连接字符串。
  • 若你使用 HTTPS,建议在前端和 Nginx 添加 SSL 支持(可用 Let’s Encrypt 或 Traefik)。

✅ 第五步:启动项目

在项目根目录运行:

docker-composeup--build-d

访问:

  • 前端:http://localhost
  • 后端 API:http://localhost/api/weatherforecast(示例)
  • 数据库:localhost:3306(可使用客户端连接调试)

✅ 可选:数据库初始化脚本

创建init-sql/init.sql初始化表结构(可选):

-- init-sql/init.sqlCREATETABLEIFNOTEXISTSUsers(IdINTAUTO_INCREMENTPRIMARYKEY,NameVARCHAR(100),EmailVARCHAR(100));

✅ 安全建议(生产环境)

项目建议
MySQL 密码不硬编码,使用.env文件或 Secrets
ASP.NET JWT 密钥使用环境变量或 Azure Key Vault
HTTPS使用 Nginx + SSL 证书(Let’s Encrypt)
CORS生产环境中限制允许的 Origin

使用.env示例(推荐)

# .env MYSQL_ROOT_PASSWORD=StrongRootPass123! MYSQL_DATABASE=MyAppDb MYSQL_USER=appuser MYSQL_PASSWORD=SecureAppPass456!

然后在docker-compose.yml中引用:

environment:MYSQL_ROOT_PASSWORD:${MYSQL_ROOT_PASSWORD}MYSQL_DATABASE:${MYSQL_DATABASE}MYSQL_USER:${MYSQL_USER}MYSQL_PASSWORD:${MYSQL_PASSWORD}

并在docker-compose up时自动加载。


✅ 总结

这套方案实现了:

  • ✅ 前后端分离部署
  • ✅ 容器化构建与运行
  • ✅ 数据库持久化
  • ✅ API 反向代理
  • ✅ 自动依赖启动顺序(db → backend → frontend)
  • ✅ 适合 CI/CD 流程集成(GitHub Actions, GitLab CI 等)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 4:37:35

5大实战方案:Apache Arrow与PostgreSQL高效数据集成指南

5大实战方案:Apache Arrow与PostgreSQL高效数据集成指南 【免费下载链接】arrow Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing 项目地址: https://gitcode.com/gh_mirrors/arrow13/arrow Apache Ar…

作者头像 李华
网站建设 2026/6/13 2:08:04

AdminLTE实战:5步构建专业级后台管理系统界面

AdminLTE实战:5步构建专业级后台管理系统界面 【免费下载链接】AdminLTE ColorlibHQ/AdminLTE: AdminLTE 是一个基于Bootstrap 4/5构建的开源后台管理模板,提供了丰富的UI组件、布局样式以及响应式设计,用于快速搭建美观且功能齐全的Web管理界…

作者头像 李华
网站建设 2026/6/10 14:56:25

MAUI跨平台开发完整教程:从零构建全平台原生应用

MAUI跨平台开发完整教程:从零构建全平台原生应用 【免费下载链接】maui dotnet/maui: .NET MAUI (Multi-platform App UI) 是.NET生态下的一个统一跨平台应用程序开发框架,允许开发者使用C#和.NET编写原生移动和桌面应用,支持iOS、Android、W…

作者头像 李华
网站建设 2026/6/9 23:53:56

Homarr API完整指南:深入解析tRPC和OpenAPI集成原理

Homarr API完整指南:深入解析tRPC和OpenAPI集成原理 【免费下载链接】homarr Customizable browsers home page to interact with your homeservers Docker containers (e.g. Sonarr/Radarr) 项目地址: https://gitcode.com/gh_mirrors/ho/homarr 作为一名服…

作者头像 李华