服务器上使用docker部署项目

打印 上一主题 下一主题

主题 1715|帖子 1715|积分 5145

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
步骤说明

1、明确全部要安装的内容

  我的mysql版本为8.0,redis版本为7.4.2(要将redis数据迁徙的版本号必须兼容,不然dump.rdb无法加载)、jdk17和nginx1.24.0
2、准备一台服务器(我用的是阿里云的服务器)

3、修改设置文件信息:nginx.conf,application.yml,vue.config.js以及代码中有涉及到静态资源的地方:

解释:将localhost改为对应容器名指的是等等创建容器的时候需要将各个容器放在同一个网络下,容器之间的通讯可通过容器名访问(类似于域名剖析)
使用maven命令clean->package打包target文件夹,天生.jar文件
在前端项目根目录下使用npm run build命令打包dist文件夹

  Dockerfile:
  1. # 选择 JDK 17 官方镜像作为基础镜像
  2. FROM openjdk:17-jdk-slim AS build
  3. # 图形验证码需要额外安装库
  4. RUN apt-get update && apt-get install -y \
  5.     libfontconfig1 \
  6.     libx11-dev \
  7.     libxext6 \
  8.     libxrender1 \
  9.     libxtst6 \
  10.     xfonts-base \
  11.     xfonts-75dpi
  12. # 设置工作目录
  13. WORKDIR /app
  14. # 将项目的 jar 文件复制到容器中的 /app 目录(前面目录表示服务器目录,后面的目录表示容器中对应的目录)
  15. COPY springboot_game-0.0.1-SNAPSHOT.jar /app/springboot_game-0.0.1-SNAPSHOT.jar
  16. # 暴露应用运行的端口
  17. EXPOSE 8080
  18. # 设置环境变量
  19. ENV SPRING_PROFILES_ACTIVE=prod
  20. # 启动 Spring Boot 应用
  21. ENTRYPOINT ["java", "-jar", "/app/springboot_game-0.0.1-SNAPSHOT.jar"]
复制代码
nginx.conf:
  1. #user  nobody;
  2. worker_processes  1;
  3. events {
  4.     worker_connections  1024;
  5. }
  6. http {
  7.     include       mime.types;
  8.     default_type  application/octet-stream;
  9.     sendfile        on;
  10.     #tcp_nopush     on;
  11.     #keepalive_timeout  0;
  12.     keepalive_timeout  65;
  13.         # Nginx请求体最大大小
  14.     # 413 Request Entity Too Large
  15.     # 默认是1M大小
  16.     client_max_body_size 40m;
  17.     server {
  18.         listen       8090;
  19.         server_name  game; #对应项目的容器名
  20.         #charset koi8-r;
  21.         #access_log  logs/host.access.log  main;
  22.         location / {
  23.             root   /usr/share/nginx/html;  #对应nginx容器中html的具体存放位置(此位置为系统默认位置)
  24.             index  index.html index.htm;
  25.             #解决history模式下刷新404的问题
  26.             try_files $uri $uri/ /index.html;
  27.         }
  28.         location ^~ /api/ {
  29.                         rewrite ^/api/(.*)$ /$1 break;
  30.                         proxy_pass http://game:8080; #解析路径将localhost改成对应容器名
  31.         }
  32.         error_page   500 502 503 504  /50x.html;
  33.         location = /50x.html {
  34.             root   html;
  35.         }
  36.     }
  37. }
复制代码
application.yml:
  1. spring:
  2.   port: 8080
  3.   address: 0.0.0.0 #表示允许所有ip访问
  4.   data:
  5.     redis:
  6.       host: redis #对应redis的容器名
  7.       database: 5 #redis所使用的数据库
  8.       password: 123456 #对应等等容器创建的时候你自己设置的密码
  9.   jpa:
  10.     hibernate:
  11.       ddl-auto: none
  12.   datasource:
  13.     url: jdbc:mysql://mysql:3306/game?characterEncoding=UTF-8 #3306前的mysql为mysql容器名
  14.     username: root
  15.     password: 123456 #对应等等容器创建的时候你自己设置的密码
  16.     driver-class-name: com.mysql.jdbc.Driver
  17.   application:
  18.     name: springboot_game
  19.   #邮箱配置
  20.   mail:
  21.     host: smtp.qq.com
  22.     username: xxxxxxxx@qq.com
  23.     password: xxxxxxxxxx
  24.     protocol: smtp
  25.     default-encoding: UTF-8
  26.     properties:
  27.       mail:
  28.         smtp:
  29.           auth: true
  30.           starttls:
  31.             enable: true
  32.             required: true
  33.           ssl:
  34.             enable: true
  35. mybatis:
  36.   configuration:
  37.     map-underscore-to-camel-case: true
  38.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  39. my:
  40.   file_path: /home/vue/website #对应后端静态资源目录(在容器中的位置,可以自己定义位置)
复制代码
/public/config.jsongame对应项目容器名)
  1. {
  2.   "serverUrl": "http://game:8080"
  3. }
复制代码
vue.config.js:
  1. const { defineConfig } = require('@vue/cli-service')
  2. const serverUrl = this.$config?.serverUrl || 'http://game:8080'; //game对应项目容器名
  3. module.exports = defineConfig({
  4.   transpileDependencies: true,
  5.   devServer: {
  6.     port: 9090,
  7.     proxy: {
  8.       '/api': {
  9.         target: serverUrl, // 目标服务器地址
  10.         changeOrigin: true, // 是否改变源地址
  11.         pathRewrite: {
  12.           '^/api': '' // 重写路径,将/api替换为空
  13.         }
  14.       },
  15.     },
  16.   },
  17.   lintOnSave: false//关闭语法检查
  18. })
复制代码
代码中使用到了后端静态资源的部门:
  1.     @RestController
  2.     public class MusicController {
  3.     //    private static final String rootPath = "src/main/resources/static"; //原本的路径
  4.     private static String rootPath = "/home/vue/website"; // 对应application.yml里面的静态路径
  5.         @GetMapping("/music")
  6.         public ResponseEntity<Result> playMusic(){
  7.             //获取音乐文件夹中的所有.mp3文件
  8.             int size = 0;
  9.             File folder = new File(rootPath + "/music");
复制代码
4、检查版本号,迁徙数据

  确认版本号之后将sql文件导出(假如redis也要数据迁徙的话需要dump.rdb文件,位置需要自己去找)
5、在服务器上安装好docker并且认识docker命令(阿里云镜像源:

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
  安装教程:https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker?spm=5176.21213303.J_qCOwPWspKEuWcmp8qiZNQ.1.656e2f3dF0XH8e&scm=20140722.S_help@@文档@@51853._.ID_help@@文档@@51853-RL_docker安装-LOC_llm-OR_ser-PAR1_215044de17388115664018613e6320-V_4-RE_new5-P0_0-P1_0
6、将项目资源上传到服务器对应目录(使用Xftp8)

  我的目录放在/home/vue下:
website文件夹(放后端静态资源)、Dockerfile、springboot_game-0.0.1-SNAPSHOT.jar(对应自己的jar文件名)
在额外创建2个文件夹nginx和redis文件夹(用于docker的目录挂载:将容器中的对应目录映射到宿主机中的对应目录)
  nginx文件夹里面创建2个文件夹:conf(将nginx.conf文件放入),html(将dist里面的文件全部放入)
  redis文件夹里面放入dump.rdb文件和redis.conf文件(用于redis数据迁徙)
7、安装mysql和redis(注:redis要长期化需要设置redis.conf文件)

redis.conf:
  1. ################################ SNAPSHOTTING  ################################
  2. # 持久化保存策略配置
  3. # 在900s内,如果至少有1个key进行了修改,就进行持久化操作
  4. save 900 1
  5. # 在300s内,如果至少有10个key进行了修改,就进行持久化操作
  6. save 300 10
  7. # 在60s内,如果至少有10000个key进行了修改,就进行持久化操作
  8. save 60 10000
  9. # 配置如果持久化出错,Redis是否禁止写入命令 yes:禁止写入命令,no:允许写入命令(存在数据丢失风险)
  10. stop-writes-on-bgsave-error yes
  11. # 配置是否压缩rdb文件。[开启(yes)的话,会消耗一定的cpu资源]
  12. rdbcompression yes
  13. # 保存rdb文件的时候,进行错误的检查校验
  14. rdbchecksum yes
  15. # 默认持久化保存后的文件名
  16. dbfilename dump.rdb
  17. # rdb文件保存的目录
  18. dir /data
  19. # 设置访问、登录的密码,设置requirepass 您的密码
  20. requirepass wuxinye38
  21. ############################## APPEND ONLY MODE ###############################
  22. # 是否开启aof持久化模式,默认值:no,不开启。redis的默认持久化策略是edb模式
  23. appendonly yes
  24. # 持久化文件名称
  25. appendfilename "appendonly.aof"
  26. # 持久化策略设置
  27. # appendfsync always # 每次修改都进行持久化操作
  28. appendfsync everysec # 每秒执行一次持久化操作
  29. # appendfsync no     # 不执行持久化操作,相当于未开启aof持久化策略
  30. # 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes
  31. no-appendfsync-on-rewrite yes
  32. # AOF自动重写配置,默认值为100
  33. auto-aof-rewrite-percentage 100
  34. auto-aof-rewrite-min-size 64mb
  35. # Redis在以AOF方式恢复数据时,对最后一条可能出问题的指令的处理方式,默认值yes
  36. aof-load-truncated yes
  37. # 当重写AOF文件时,Redis能够在AOF文件中使用RDB前导码,以便更快地重写和恢复,启用此选项时,重写的AOF文件由两个不同的节组成:[RDB file][AOF tail],当加载AOF文件时,Redis通过以 “REDIS” 字符串开头的AOF文件识别出此文件是由RDB和AOF组合而成的,Redis会先加载RDB部分,然后再加载AOF部分,默认值yes
  38. aof-use-rdb-preamble yes
  39. ################################### CLIENTS ####################################
  40. # 设置客户端最大连接数,该配置一般无需修改,使用默认值即可
  41. # maxclients 10000
  42. ############################## MEMORY MANAGEMENT ################################
  43. # redis最大内存容量
  44. maxmemory 1gb
  45. # 内存策略
  46. maxmemory-policy volatile-lru
复制代码
注意:安装多个容器需要创建一个网络用语容器间通讯(名字自定):docker network create mynet
  1. docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=game -p 3306:3306 -d --network mynet mysql:8.0
  2. docker run --name redis -d -e REDIS_PASSWORD=123456 --privileged=true -p 6379:6379 -v /home/vue/redis:/data -v /home/vue/redis/redis.conf:/usr/local/etc/redis/redis.conf --network mynet redis:7.4.2
复制代码
通过docker ps命令检查容器是否启动成功
mysql启动成功跋文得在主机上毗连上并且运行sql文件
注意:假如mysql使用老版本的navicat,使用navicat毗连会报错,需要进入容器内部的mysql修改暗码:
  1. docker exec -it mysql bash
  2. mysql -u root -p
  3. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'
复制代码
修改成功后输入两次exit退出mysql之后在退出容器内部
8、编译Dockerfile文件,启动项目

  进入到存放Dockerfile文件的目录下,运行命令docker build -t game .
  启动项目,运行命令docker run -d --name game -p 8080:8080 -v /home/vue/website:/home/vue/website --network mynet game
9、安装并启动nginx

docker run -d -p 8090:8090 --name nginx -v /home/vue/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/vue/nginx/html:/usr/share/nginx/html --network mynet nginx:1.24.0
10、通过ip:端口号访问项目网站

  使用docker ps查看全部容器是否启动成功
  假如有容器启动失败使用docker logs 容器名查看错误日记
  访问网站,部署成功
每次重启服务器的时候通过docker start 容器名启动项目,通过docker stop 容器名关闭容器
下篇链接:
服务器使用docker-compose一键部署项目

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表