如何用Docker在Nginx上部署Angular6+ASP.NET Core+SQL Server应用(Windows)
嘿,我来一步步帮你搞定这个部署流程!你已经搭好了Docker和Nginx容器的基础,接下来咱们分模块把前端、后端、数据库都整合进去,用Docker Compose来管理会比单独操作容器省心太多~
一、先搞定前端Angular 6的打包
Nginx托管的是静态文件,所以第一步要把Angular项目编译成生产环境的静态资源:
- 打开命令行,进入你的Angular项目根目录,执行:
执行完后,项目根目录会生成一个ng build --proddist/文件夹,里面就是Nginx要用到的所有前端文件。 - 提前注意:如果你的前端需要调用后端API,记得修改
environment.prod.ts里的API地址为后端容器的服务名(后面Docker Compose会配置这个名称),比如apiUrl: "http://backend:5000/api/",这样容器内部可以直接通信,不用走宿主机IP。
二、后端ASP.NET Core应用的发布与镜像构建
接下来处理后端服务,先发布再制作Docker镜像:
- 发布后端项目:
进入后端ASP.NET Core项目根目录,执行命令生成发布包:
这会在项目根目录生成dotnet publish -c Release -o ./publishpublish/文件夹,包含所有运行后端需要的文件。 - 编写后端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:
六、启动所有服务
- 确认前面的步骤都完成:Angular已打包出
dist/,后端已发布出publish/,配置文件都准备好。 - 打开命令行,进入
docker-compose.yml所在的目录,执行:
这个命令会自动拉取所需镜像、构建后端镜像、启动所有容器。docker-compose up -d - 启动完成后,访问
http://localhost就能看到你的Angular应用,前端调用的API会自动通过Nginx反向代理到后端服务。
七、如果不想用Docker Compose,单独映射已有Nginx容器
如果你已经有一个Nginx容器,想直接挂载应用:
- 先停止现有容器:
docker stop your-nginx-container-name - 重新启动容器,挂载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 - 后端容器需要和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




