news 2026/4/22 20:51:25

.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/4/22 10:19:09

Ultimate Vocal Remover 5.6:AI音频分离完整指南与实用技巧

Ultimate Vocal Remover 5.6:AI音频分离完整指南与实用技巧 【免费下载链接】ultimatevocalremovergui 使用深度神经网络的声音消除器的图形用户界面。 项目地址: https://gitcode.com/GitHub_Trending/ul/ultimatevocalremovergui 还在为提取纯净人声而烦恼…

作者头像 李华
网站建设 2026/4/23 10:49:01

Latest:macOS应用更新管理终极指南

Latest:macOS应用更新管理终极指南 【免费下载链接】Latest A small utility app for macOS that makes sure you know about all the latest updates to the apps you use. 项目地址: https://gitcode.com/gh_mirrors/la/Latest 你是否曾经为错过重要软件更…

作者头像 李华
网站建设 2026/4/23 13:30:03

Yealink Android 系统开发岗位深度面试指南:技术要点与高频问题解析

yealink Android系统开发 职位描述 Linux系统Android系统系统开发 岗位内容: 1、 分析Android系统框架,完成Android系统大版本升级 2、 与其他部门配合,完成Android在视频会议系统上的实现 3、根据需求完成Android平台下相关功能的定制开发 岗位要求: 1、 熟悉Android系统…

作者头像 李华
网站建设 2026/4/23 12:20:35

快递物流状态主动语音通知用户实现方案

快递物流状态主动语音通知用户实现方案 在快递包裹每天以亿计流动的今天,用户等通知的方式早已从“被动查看”走向“主动触达”。然而,即便App推送和短信提醒已经无处不在,仍有大量人群——比如正在开车的司机、不熟悉智能手机操作的老人&…

作者头像 李华
网站建设 2026/4/23 13:59:06

Dgraph深度解析:从架构设计到企业级实战指南

Dgraph深度解析:从架构设计到企业级实战指南 【免费下载链接】dgraph The high-performance database for modern applications 项目地址: https://gitcode.com/gh_mirrors/dg/dgraph 在当今数据驱动的时代,选择一款合适的图数据库对于构建现代应…

作者头像 李华
网站建设 2026/4/23 13:44:17

3步搭建EMQX+ClickHouse:构建亿级电商实时监控系统

3步搭建EMQXClickHouse:构建亿级电商实时监控系统 【免费下载链接】emqx The most scalable open-source MQTT broker for IoT, IIoT, and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 还在为电商大促期间的海量用户行为数据无法实…

作者头像 李华