You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Docker在Nginx上部署Angular6+ASP.NET Core+SQL Server应用(Windows)

嘿,我来一步步帮你搞定这个部署流程!你已经搭好了Docker和Nginx容器的基础,接下来咱们分模块把前端、后端、数据库都整合进去,用Docker Compose来管理会比单独操作容器省心太多~

一、先搞定前端Angular 6的打包

Nginx托管的是静态文件,所以第一步要把Angular项目编译成生产环境的静态资源:

  • 打开命令行,进入你的Angular项目根目录,执行:
    ng build --prod
    
    执行完后,项目根目录会生成一个dist/文件夹,里面就是Nginx要用到的所有前端文件。
  • 提前注意:如果你的前端需要调用后端API,记得修改environment.prod.ts里的API地址为后端容器的服务名(后面Docker Compose会配置这个名称),比如apiUrl: "http://backend:5000/api/",这样容器内部可以直接通信,不用走宿主机IP。
二、后端ASP.NET Core应用的发布与镜像构建

接下来处理后端服务,先发布再制作Docker镜像:

  1. 发布后端项目
    进入后端ASP.NET Core项目根目录,执行命令生成发布包:
    dotnet publish -c Release -o ./publish
    
    这会在项目根目录生成publish/文件夹,包含所有运行后端需要的文件。
  2. 编写后端Dockerfile
    在后端项目根目录新建一个名为Dockerfile的文件,内容如下(注意替换成你的.NET Core版本和项目dll名称):
    # 选择对应版本的.NET Core基础镜像,Windows系统下用windowsservercore镜像
    FROM mcr.microsoft.com/dotnet/aspnet:3.1-windowsservercore-ltsc2019
    WORKDIR /app
    # 把本地发布的文件复制到容器内
    COPY ./publish .
    # 暴露后端服务的端口
    EXPOSE 5000
    # 启动后端服务
    ENTRYPOINT ["dotnet", "YourBackendProject.dll"]
    
三、SQL Server容器的配置

不用自己构建SQL Server镜像,直接用官方的Windows容器镜像即可,注意Docker要分配至少4G内存(Docker设置->资源->内存调整):

  • 后面我们会用Docker Compose统一启动它,不用单独执行命令,只需要在配置文件里设置好密码和端口映射就行。
四、自定义Nginx配置(关键!)

你需要修改Nginx配置,让它同时托管前端静态文件和反向代理后端API:
新建一个nginx.conf文件,内容如下(如果用Windows容器,路径要改成Windows格式,比如把/usr/share/nginx/html换成C:/nginx/html):

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name localhost;

        # 托管Angular静态文件
        root /usr/share/nginx/html;
        index index.html index.htm;

        # Angular路由重写,解决刷新页面404的问题
        location / {
            try_files $uri $uri/ /index.html;
        }

        # 反向代理后端API请求
        location /api/ {
            proxy_pass http://backend:5000/api/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
五、用Docker Compose整合所有服务(最推荐的方式)

新建一个docker-compose.yml文件,放在所有项目的根目录(比如和你的frontend、backend文件夹同级),把前端、后端、数据库、Nginx都整合起来:

version: '3.8'

services:
  # SQL Server数据库服务
  db:
    image: mcr.microsoft.com/mssql/server:2019-latest
    container_name: sql-server-db
    environment:
      SA_PASSWORD: "YourStrong!Passw0rd" # 替换成符合要求的强密码
      ACCEPT_EULA: "Y"
    ports:
      - "1433:1433"
    volumes:
      - sql-data:/var/opt/mssql # 持久化数据库数据,容器删除后数据不丢失
    restart: unless-stopped

  # ASP.NET Core后端服务
  backend:
    build: ./backend # 指向你的后端项目根目录(里面有Dockerfile)
    container_name: aspnet-core-backend
    environment:
      # 配置数据库连接字符串,用容器名"db"代替IP
      - ConnectionStrings__DefaultConnection=Server=db;Database=YourDbName;User=sa;Password=YourStrong!Passw0rd;TrustServerCertificate=True
    ports:
      - "5000:5000"
    depends_on:
      - db
    restart: unless-stopped

  # Nginx服务
  nginx:
    image: nginx:latest # Windows容器用nginx:windowsservercore
    container_name: nginx-web-server
    ports:
      - "80:80"
    volumes:
      # 挂载Angular打包后的dist目录到Nginx静态文件目录
      - ./frontend/dist:/usr/share/nginx/html
      # 挂载自定义的Nginx配置文件
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - backend
    restart: unless-stopped

# 声明数据库持久化卷
volumes:
  sql-data:
六、启动所有服务
  1. 确认前面的步骤都完成:Angular已打包出dist/,后端已发布出publish/,配置文件都准备好。
  2. 打开命令行,进入docker-compose.yml所在的目录,执行:
    docker-compose up -d
    
    这个命令会自动拉取所需镜像、构建后端镜像、启动所有容器。
  3. 启动完成后,访问http://localhost就能看到你的Angular应用,前端调用的API会自动通过Nginx反向代理到后端服务。
七、如果不想用Docker Compose,单独映射已有Nginx容器

如果你已经有一个Nginx容器,想直接挂载应用:

  1. 先停止现有容器:
    docker stop your-nginx-container-name
    
  2. 重新启动容器,挂载Angular静态文件和自定义配置(以Linux容器为例):
    docker run -d -p 80:80 --name nginx-web-server \
      -v C:/path/to/your/angular/dist:/usr/share/nginx/html \
      -v C:/path/to/your/nginx.conf:/etc/nginx/nginx.conf \
      nginx:latest
    
  3. 后端容器需要和Nginx在同一个Docker网络里,才能用容器名访问:
    # 创建自定义网络
    docker network create my-web-network
    # 启动后端容器时加入网络
    docker run -d -p 5000:5000 --network my-web-network --name aspnet-core-backend your-backend-image-name
    # 重启Nginx容器时也加入这个网络
    docker run -d -p 80:80 --network my-web-network --name nginx-web-server ...
    

内容的提问来源于stack exchange,提问作者Bhushan Dhage

火山引擎 最新活动