Docker + .NET Core 8 + Nginx + MySQL 项目部署实战指南

150 阅读2分钟

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

七、部署步骤

  1. 构建并启动服务
docker compose up -d
  1. 查看日志(可选)
docker compose logs -f web
docker compose logs -f mysql
  1. 访问应用

浏览器访问 http://你的服务器IP,即可看到 .NET Core 应用响应。


八、注意事项

  • 数据库连接:确保 .NET 应用启动时 MySQL 已就绪。可使用 wait-for-it.shhealthcheck 延迟启动 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 区分生产与开发配置

如有疑问,欢迎留言交流!