Docker + .NET Core 8 + Nginx + MySQL 项目部署实战指南
本文适用于希望将基于 .NET Core 8 构建的 Web 应用,通过 Docker 容器化部署,并使用 Nginx 作为反向代理、MySQL 作为数据库的开发者。我们将使用 Docker Compose 管理多容器应用,实现一键部署。
一、环境准备
确保你的服务器或本地开发环境已安装以下组件:
- Docker(版本 ≥ 20.10)
- Docker Compose(版本 ≥ v2.10)
- .NET 8 SDK(仅开发阶段需要)
可通过以下命令验证:
docker --version
docker compose version
二、项目结构
假设你的项目结构如下:
my-dotnet-app/
├── src/
│ └── MyApp.Web/ # .NET Core 8 Web API 项目
│ ├── Program.cs
│ └── appsettings.json
├── Dockerfile
├── docker-compose.yml
└── nginx/
└── nginx.conf
三、编写 .NET Core 8 应用(简要)
确保你的 appsettings.json 支持从环境变量读取数据库连接字符串:
{
"ConnectionStrings": {
"DefaultConnection": "Server=mysql;Port=3306;Database=mydb;User=root;Password=yourpassword;"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
注意:
Server=mysql是 Docker 网络中 MySQL 容器的服务名(见下文 docker-compose.yml)。
四、编写 Dockerfile
在项目根目录创建 Dockerfile:
# 使用官方 .NET 8 SDK 镜像构建
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# 复制项目文件
COPY src/MyApp.Web/*.csproj ./MyApp.Web/
RUN dotnet restore ./MyApp.Web/MyApp.Web.csproj
# 复制源码并发布
COPY src/MyApp.Web/ ./MyApp.Web/
WORKDIR /src/MyApp.Web
RUN dotnet publish -c Release -o /app/publish
# 使用运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
# 暴露端口(容器内部)
EXPOSE 80
# 启动应用
ENTRYPOINT ["dotnet", "MyApp.Web.dll"]
五、配置 Nginx
创建 nginx/nginx.conf:
events {
worker_connections 1024;
}
http {
upstream backend {
server web:80; # 对应 docker-compose 中的 web 服务
}
server {
listen 80;
location / {
proxy_pass http://backend;
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;
}
}
}
六、编写 docker-compose.yml
version: '3.8'
services:
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: mysql-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: yourpassword
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
# .NET Core Web 应用
web:
build: .
container_name: dotnet-app
restart: always
depends_on:
- mysql
environment:
- ASPNETCORE_ENVIRONMENT=Production
expose:
- "80"
networks:
- app-network
# Nginx 反向代理
nginx:
image: nginx:alpine
container_name: nginx-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
networks:
- app-network
volumes:
mysql_data:
networks:
app-network:
driver: bridge
七、部署步骤
- 构建并启动服务
docker compose up -d
- 查看日志(可选)
docker compose logs -f web
docker compose logs -f mysql
- 访问应用
浏览器访问 http://你的服务器IP,即可看到 .NET Core 应用响应。
八、注意事项
-
数据库连接:确保 .NET 应用启动时 MySQL 已就绪。可使用
wait-for-it.sh或healthcheck延迟启动 Web 服务。 -
生产环境安全:
- 不要将 MySQL 端口 3306 暴露到公网(除非必要)。
- 使用强密码,避免使用 root。
- 考虑启用 HTTPS(可通过 Nginx 配置 Let's Encrypt)。
-
持久化:MySQL 数据已通过 volume 持久化,重启容器不会丢失数据。
-
环境变量管理:建议使用
.env文件管理敏感信息(如密码),并在docker-compose.yml中引用。
九、扩展建议
- 添加 Redis 缓存服务
- 使用 Traefik 替代 Nginx 实现自动 HTTPS
- 集成 CI/CD(如 GitHub Actions + 阿里云容器镜像服务)
- 使用
docker-compose.prod.yml区分生产与开发配置
如有疑问,欢迎留言交流!