当前位置:   article > 正文

Docker部署前后端分离项目

Docker部署前后端分离项目

一、下载Docker

选择自带Docker的云服务器

二、创建容器网络

将所有容器加入自定义网络,这样可以互相通过容器名访问

  1. # 创建自定义网络,sys-net为自定义名称
  2. docker network create sys-net

三、部署MySQL

  1. # -d表示后台运行 -e表示环境,设置mysql密码 -v表示数据卷挂载 --network 加入自定义网络
  2. docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/init:/docker-entrypoint-initdb.d --network sys-net mysql
  3. # 最后的mysql为Docker镜像名,不写版本号默认为mysql:latest最新版本

四、部署Redis

  1. # -d表示后台运行 -e表示环境,设置redis密码 -v表示数据卷挂载 --network 加入自定义网络
  2. docker run -d --name redis -p 6379:6379 -e TZ=Asia/Shanghai -e REDIS_PASSWORD=123 -v /usr/local/redis/config:/usr/local/etc/redis/redis.conf -v /usr/local/redis/data:/data --network sys-net redis
  3. # 最后的redis为Docker镜像名,不写版本号默认为redis:latest最新版本

五、部署后端

1.修改本地项目host

因为我们将所有容器都加入了自定义网络,所以在Docker中,不需要指定真正的地址,只需要修改为容器名称即可。

将mysql的host改为mysql,redis的host改为redis

  1. druid:
  2. # 主库数据源
  3. master:
  4. url: jdbc:mysql://mysql:3306/
  1. redis:
  2. host: redis
  3. port: 6379

2.将项目打包成jar包

点击右边的Maven,点击Lifecycle下的package打包成jar包

打包完会在项目下的target目录生成jar包

如果项目是有多个模块的,那么在每个模块的target目录都会生成一个jar包,我们只需要找有Application启动类的那一个模块下的jar包即可

3.创建Dockerfile

建一个Dockerfile文件,写如下内容

  1. FROM openjdk:11.0-jre-buster
  2. ENV TZ=Asia/Shanghai
  3. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  4. COPY slacking-cat-sys.jar /app.jar
  5. ENTRYPOINT ["java", "-jar", "/app.jar"]

slacking-cat-sys.jar为打包好的jar包名字

4.自定义镜像

将打包好的jar包和Dockerfile文件上传到云服务器,选择同一个目录下,例如放在/usr/local下,然后cd /usr/local

  1. # 构建镜像,-t表示给构建的镜像取名,.表示在当前目录下构建
  2. docker build -t slacking-cat-sys .

可以查看是否完成镜像构建

5.创建并运行项目

  1. # -d表示后台运行 -p 后端端口号 --network 加入自定义网络
  2. docker run -d --name slacking-cat-sys -p 8080:8080 --network sys-net slacking-cat-sys
  3. # 最后的slacking-cat-sys为Docker镜像名

六、打包前端

1.修改本地项目host

查找到localhost替换为后端项目的容器名

  1. server: {
  2. port: 80,
  3. host: true,
  4. open: true,
  5. proxy: {
  6. // https://cn.vitejs.dev/config/#server-proxy
  7. '/dev-api': {
  8. target: 'http://slacking-cat-sys:8080',
  9. changeOrigin: true,
  10. rewrite: (p) => p.replace(/^\/dev-api/, '')
  11. }
  12. },

2.打包

运行npm run build:prod命令进行打包,在项目下会生成dist文件。

七、部署nginx

1.配置nginx.conf

  1. #keepalive_timeout 0;
  2. # 设置nginx连接超时
  3. keepalive_timeout 300;
  4. proxy_connect_timeout 300; #单位秒 默认60
  5. proxy_send_timeout 300; #单位秒 默认60
  6. proxy_read_timeout 300; #单位秒 默认60
  7. server {
  8. listen 8081; # 前端指定的端口
  9. server_name nginx;
  10. location / {
  11. # 容器中的挂载路径,dist文件为前端打包的静态页面
  12. root /usr/share/nginx/html/dist;
  13. index index.html index.htm;
  14. try_files $uri $uri/ /index.html; # 处理前端路由刷新问题
  15. }
  16. location /prod-api { # 这里的 /prod_api/ 是你想要代理的后端api路径开头
  17. rewrite /prod-api/(.*) /$1 break;
  18. proxy_pass http://slacking-cat-sys:8080; # 这里的host改为后端项目的容器名
  19. }

2.nginx数据卷挂载

在云服务器中创建一个nginx目录,例如在/usr/local/nginx,将nginx.conf配置文件上传到此处,再创建/usr/local/nginx/html文件,将前端打包好的dist文件上传到此处

文件目录结构如下:

3.创建并运行nginx

  1. # -d表示后台运行 -p表示前端设置的端口 -v表示数据卷挂载 --network 加入自定义网络
  2. docker run -d --name nginx -p 8081:8081 -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/html:/usr/share/nginx/html --network sys-net nginx
  3. # 最后的nginx为Docker镜像名,不写版本号默认为nginx:latest最新版本

八、第二种方法:使用DockerCompose部署

DockerCompose相当于可以把一个一个分开部署的容器集合起来一起部署。

1.docker-compose.yml文件

通过一个docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个互关联的Docker容器的快速部署。docker-compose.yml文件相当于我们写的docker run命令:

  1. version: "3.8"
  2. services:
  3. redis:
  4. image: redis
  5. container_name: redis
  6. ports:
  7. - "6379:6379"
  8. environment:
  9. TZ: Asia/Shanghai
  10. REDIS_PASSWORD: 123
  11. volumes:
  12. - "/usr/local/redis/config:/usr/local/etc/redis/redis.conf"
  13. - "/usr/local/redis/data:/data"
  14. networks:
  15. - sys-net
  16. mysql:
  17. image: mysql:8.0
  18. container_name: mysql
  19. ports:
  20. - "3306:3306"
  21. environment:
  22. TZ: Asia/Shanghai
  23. MYSQL_ROOT_PASSWORD: 123
  24. command: --default-authentication-plugin=mysql_native_password
  25. volumes:
  26. - "/usr/local/mysql/conf:/etc/mysql/conf.d"
  27. - "/usr/local/mysql/data:/var/lib/mysql"
  28. - "/usr/local/mysql/init:/docker-entrypoint-initdb.d"
  29. networks:
  30. - sys-net
  31. nginx:
  32. image: nginx
  33. container_name: nginx
  34. ports:
  35. - "8081:8081"
  36. volumes:
  37. - "/usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf"
  38. - "/usr/local/nginx/html:/usr/share/nginx/html"
  39. depends_on:
  40. - slacking-cat-sys
  41. networks:
  42. - sys-net
  43. slacking-cat-sys:
  44. build:
  45. context: .
  46. dockerfile: Dockerfile
  47. container_name: slacking-cat-sys
  48. ports:
  49. - "8080:8080"
  50. networks:
  51. - sys-net
  52. depends_on:
  53. - redis
  54. - mysql
  55. networks:
  56. sys-net:
  57. name: sys-net

2.准备工作

①nginx.conf配置好,前端打包的dist文件放到html目录下。(参考六打包前端、七部署nginx)

②后端打包成jar包

③Dockerfile配置好(参考五.3.创建Dockerfile)

将jar包、Dockerfile、docker-compose.yml上传到云服务器的同一目录下,例如/usr/local

3.DockerCompose一键部署

进入/usr/local目录

  1. # up表示创建并启动所有容器 -d 后台运行,其他可选参数 -p 取项目名 -f 指定路径,此处为当前目录下,所以直接省略
  2. docker compose up -d

九、其他

1.Docker常用命令

  1. # docker拉取镜像,不写版本号默认拉取最新版本
  2. docker pull mysql:8.0
  3. # 查看docker镜像
  4. docker images
  5. # 强制删除docker镜像
  6. docker rmi -f 镜像ID
  7. # 创建并运行容器
  8. # -d表示后台运行,--name表示取名,-p映射端口号,-v数据卷挂载 最后写上镜像名称需要加上版本号
  9. docker run -d --name mysql -p 3306:3306 -v /usr/mysql/logs:/logs mysql:8.0
  10. # 查看所有docker容器
  11. docker ps
  12. # 强制删除docker容器
  13. docker rm -f 容器ID
  14. # 删除所有容器
  15. docker rm $(docker ps -q)
  16. # 进入docker容器内部
  17. docker exec -it mysql bash
  18. # 创建容器网络
  19. docker network create
  20. # 查看所有network网络
  21. docker network ls
  22. # 删除网络
  23. docker network rm 网络名称
  24. # 构建镜像,.表示在当前目录构建
  25. docker build -t 取名 .
  26. # 创建并启动所有service容器
  27. docker compose up
  28. # 重新启动所有service容器
  29. docker compose restart
  30. # 关闭并删除所有service容器
  31. docker compose down
  32. # 查看所有service容器
  33. docker compose ps
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/991264
推荐阅读
相关标签
  

闽ICP备14008679号