news 2026/5/26 11:45:23

.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/5/26 11:44:59

AudioPlaybackConnector:让Windows秒变智能蓝牙音箱

AudioPlaybackConnector:让Windows秒变智能蓝牙音箱 【免费下载链接】AudioPlaybackConnector Bluetooth audio playback (A2DP Sink) connector for Windows 10 2004 项目地址: https://gitcode.com/gh_mirrors/au/AudioPlaybackConnector 想让你的Windows电…

作者头像 李华
网站建设 2026/5/21 1:37:30

5分钟掌握DPlayer视频水印:新手也能轻松保护原创内容

5分钟掌握DPlayer视频水印:新手也能轻松保护原创内容 【免费下载链接】DPlayer :lollipop: Wow, such a lovely HTML5 danmaku video player 项目地址: https://gitcode.com/gh_mirrors/dpl/DPlayer 你是否遇到过这样的困扰:精心制作的视频作品被…

作者头像 李华
网站建设 2026/5/20 9:47:15

基于vh6501的busoff容错能力评估方法

如何用 vh6501 精准“搞瘫”CAN总线?——BusOff容错能力实战评估指南你有没有遇到过这样的场景:某款ECU在实验室通信正常,一上实车却频繁失联;售后反馈“偶发通信中断”,但台架复现不了;查了一圈软件逻辑没…

作者头像 李华
网站建设 2026/5/20 14:56:16

STM32F103RCT6原理图完整版获取 - 专业硬件设计参考指南

探索STM32F103RCT6微控制器的硬件设计精髓!本资源为您提供了一份详尽的STM32F103RCT6原理图,这是嵌入式开发者和硬件工程师不可或缺的技术参考资料。 【免费下载链接】STM32F103RCT6原理图资源下载 探索STM32F103RCT6的硬件设计奥秘,本资源为…

作者头像 李华
网站建设 2026/5/21 0:58:19

CSDN官网知识库问答机器人集成VoxCPM-1.5-TTS-WEB-UI语音回复

CSDN知识库问答机器人集成VoxCPM-1.5-TTS-WEB-UI实现语音回复 在移动优先、多模态交互日益普及的今天,用户对信息获取方式的期待早已不再局限于“看”。尤其是在技术社区如CSDN这样的知识平台,开发者可能正在调试代码、通勤途中查阅资料,甚至…

作者头像 李华
网站建设 2026/5/23 1:31:38

强力打造完美GitHub活跃度:fake-git-history终极指南

强力打造完美GitHub活跃度:fake-git-history终极指南 【免费下载链接】fake-git-history Generate Git commits. 项目地址: https://gitcode.com/gh_mirrors/fa/fake-git-history 想让你的GitHub个人主页看起来像资深开发者一样活跃吗?fake-git-h…

作者头像 李华