在docker环境中部署前后端分离项目
本文记录下docker环境下部署前后端分离项目的主要步骤,其中后端.net6 webapi,前端ant deisgn pro v5,代理nginx,数据库postgresql。
1.安装docker
当前笔者使用的docker for windows。安装文件可以到官网下载,至于安装步骤windows系统主要需要在bios中开启cpu虚拟化,以及控制面板程序中开启hype-v,参照教程这边不作记录。
2.安装docker-compose
前后端应用需要部署的应用不止一个应用,而是多个相互依赖的应用。所以需要docker-compose将多个应用打包运行起来。docker for windows默认安装了docker-compose, 其他需要自行安装。
3.整理所需服务的结构
当前项目需要我们三个运行服务:数据库postgresql,.net6 webapi,nginx。
其中.net6 webapi依赖数据库postgresql,nginx反向代理.net6 webapi运行的内网端口,并且nginx的html路径下挂载ant deisgn pro v5前端文件。
4.创建所需的镜像
三个服务对应着三个镜像。其中,数据库postgresql和nginx可以直接在compose文件里直接配置拉取,而.net6 webapi需要我们本地编译打包成镜像,这就需要我们编写Dockerfile文件,再在compose文件中指定编写的Dockerfile文件去打包运行我们的镜像。
5.编写Dockerfile文件
vs2022可以自动生成Dockerfile文件,但是先要配置好launchSettings.json文件中docker的启动配置,相关说明请查看官网资料-容器工具启动设置,笔者docker启动配置如下图所示。
配置好后,右击解决方案资源管理器中的启动项目->添加->Docker支持,选择Linux平台,即可自动生成Dockerfile文件。
生成的Dockerfile文件如下图所示,这边改了个端口。这个文件主要就是编译打包成镜像。
6.编写docker-compose.yml文件
同样vs2022也可以自动生成docker-compose.yml文件,右键项目-添加-容器业务流程协调程序支持,如下图所示。
添加后会生成docker-compose相关文件,其中docker-compose.override.yml看名字就知道是重写文件,如果两个文件都写了,以override的为准,override里写了端口号,所以这边修改了默认80端口为8888。
主要的是docker-compose.yml文件需要根据项目情况修改一下,贴下当前配置代码。
version: '3.4'
services:
nginx:
image: nginx:latest
ports:
- 8000:80
volumes:
- E:\MyProject\dnf\nginx\html:/usr/share/nginx/html
- E:\MyProject\dnf\nginx\nginx.conf:/etc/nginx/nginx.conf
privileged: true
networks:
- my-net
wood.api:
image: ${DOCKER_REGISTRY-}woodapi
container_name: woodapi
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:8888
build:
context: .
dockerfile: Wood.API/Dockerfile
ports:
- 8888:8888
volumes:
- E:\MyProject\dnf\upload:/app/upload
networks:
- my-net
depends_on:
- postgresql
postgresql:
image: postgres:12-alpine
container_name: postgresql
environment:
POSTGRES_DB: WoodDb
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "111111"
ports:
- 5433:5432
volumes:
- E:\MyProject\dnf\postgresqlData:/var/lib/postgresql/data
networks:
- my-net
networks:
my-net:
driver: bridge
7.目录挂载
有时候docker里面的数据或者配置文件,在本地计算机上,就需要将对应目录挂载到本地目录。所以此docker-compose.yml文件中做了几处目录挂载,冒号前面的是本机的地址,冒号后面的是docker容器里面的地址,这边做下简短说明。
nginx服务第一个挂载,将ant design pro的文件拷贝到本机nginx的html文件夹中,然后将容器nginx中的html路径挂载到此目录。
nginx服务第二个挂载,将nginx的配置文件做一个本地挂载
wood.api服务里面的挂载,是将接口中上传文件的保存地址挂载到本地。
postgresql服务里面的挂载,是将数据库保存数据的地址挂载到本地。
8.打包镜像运行容器
打开PowerShell,进入到docker-compose.yml文件目录下,执行命令
docker-compose up -d --build
还有些配置需要容器跑起来来调整下。
9.nginx配置
ngixn配置主要配置的是nginx文件,配置文件如下图所示。主要配置了反向代理webapi以及websocket。其中http://172.21.0.4:8888是wenapi的内网地址和内网端口,可以通过docker inspect命令获取,相关容器的相关信息,包括内网地址。配置完成后重启下nginx容器。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
# gzip config
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
root /usr/share/nginx/html;
location / {
# 用于配合 browserHistory使用
try_files $uri $uri/index.html /index.html;
# 如果有资源,建议使用 https + http2,配合按需加载可以获得更好的体验
# rewrite ^/(.*)$ https://preview.pro.ant.design/$1 permanent;
}
location /api {
proxy_pass http://172.21.0.4:8888/api;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
location /Hubs {
proxy_http_version 1.1;
# 最重要的就是下面两行,这两行将请求服务器升级协议为WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# 连接成功后,后端服务器响应时间,如不配置proxy_read_timeout,默认是60s
proxy_read_timeout 500s;
proxy_pass http://172.21.0.4:8888/Hubs;
}
}
}
10.postgresql的备份与还原
我们如何将本地的postgresql数据库备份出来,然后还原到docker里?
打开cmd,备份命令
pg_dump -h localhost -U postgres WoodDb > D:\postgres.bak
将备份文件postgres.bak拷贝到compose文件的目录,然后通过docker的拷贝命令拷贝到容器里。
docker cp postgres.bak postgresql:/home/
然后进入postgresql容器。
docker exec -it postgresql bash
最后还原备份文件。
psql -U postgres -d WoodDb < home/postgchongqres.bak;
11.结语
这就是笔者实践的在docker环境中部署前后端分离项目,如有不对的还请斧正,共同学习。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)