如何将自己的项目用docker部署到服务器(springboot+vue)

目录

首先说一下我的端口配置

1.购买服务器:

2.安装远程操作服务器工具:

3.打包

4.编写Dockerfile

5.编写dockercompose.yml

6.构建前端

7.配置redis


首先安装docker和docker-compose,安装方法请参照我前面的一篇文章Docker学习。

首先说一下我的端口配置

前端:8080,后端:8081,redis:6379,mysql:3306

1.购买服务器:

我这里买的是阿里云云服务器ECS,我照着最便宜买的,重点就是我选择的centos系统,没选对的后续停掉服务器也可以改,点击实例操作系统就可以改,改的时候记得设置一下服务器密码。

然后需要开放端口,不然部署好了也无法访问

安全组最后一栏有个配置规则,点进去进行端口配置

点击手动添加添加目的和源,源为0.0.0.0/0表示都能访问

如果服务器有防火墙,这里附上防火墙命令

//启动防火墙
systemctl start firewalld
//查看防火墙状态
systemctl status firewalld
//关闭防火墙
systemctl stop firewalld
//开放端口
firewall-cmd --permanent --add-port=3306/tcp

防火墙操作之后记得重启docker服务

2.安装远程操作服务器工具:

如果直接使用命令行进行部署的话有很多命令操作而且文件操作也是很麻烦的,所以需要远程操作工具,这里我用的是xhell和xftp,xhell操作命令行,xftp操作文件。官网提供了社区版免费下载,输入一个邮箱和姓名后会给你的邮箱发送一个下载链接,这里我去试过,不仅速度只有几kb而且一会网络又出问题了(因为是外国网站很正常),我当初下xshell下了一天,所以给你们提供一个下载链接:

xshell和xftp下载

下载好之后进行安装,安装没什么好说的,别安C盘就行,安装好之后配置自己的服务器,先新建一个会话

在主机那一栏填好服务器ip之后点击用户登录认证输入自己的服务器账号密码就可以进行连接了,很简单。

3.打包

后端打包:

后端使用maven打包,打包的时候记得点击蓝色闪电标志不打包测试类,不然容易出问题,毕竟服务器也用不上测试类

点了闪电之后点package,打包完成后会在项目的target目录生成一个jar包,这就是打包好的后端项目,打包好可以在jar包的同级目录下打开命令行(在目录输入cmd回车)输入

java -jar jar包名称.jar

测试一下是否能跑起来

前端打包:

这里使用npm的build命令

serve是启动命令,build是打包命令,打包好之后会在前端项目目录下生成一个dist文件就是你前端的包。

4.编写Dockerfile

首先在服务器的root目录下创建一个文件夹来存放你的项目,我这里叫love,之后在项目目录下创建一个叫spring_dockerfile的文件夹,用来放后端jar包和Dockerfile,注意这里文件名必须叫Dockerfile,并且没有格式,直接创建一个文件就行,然后在里面写

FROM openjdk:8-jdk //注意这里要看你本地所用的jdk版本,如果是用的java11则要将版本改为11,不然运行会报错,我踩了好久的坑,即使本地换了jdk打包都不行,报错为使用11编译过的程序都不能运行,所以我还是选择了直接给11版本
EXPOSE 8081 //暴露一个端口用于映射
WORKDIR /java/app //分配工作目录
COPY love-0.0.1-SNAPSHOT.jar love_java.jar  //映射jar包为love_java.jar
CMD ["java","-jar","love_java.jar"] //jar包启动命令

这里的后端相当于一个自定义镜像。

5.编写dockercompose.yml

在love目录下创建一个文件叫docker-compose.yml,用来配置mysql,redis,nginx,springboot,这里你没有下的镜像都会在编排时给你下载:

version: "3.7"
services:
  love-vue-springboot:
    build: # 通过Docker 构建镜像和容器
      context: ./springboot_dockerfile
      dockerfile: Dockerfile
    container_name: love-vue-springboot
    ports:
      - "8081:8081"
    depends_on:
      - mysql
      - redis
      - nginx
    networks:
      - love_vue
  mysql:
    image: mysql:8
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=xxxx # 设置 MySQL 密码
    volumes:
      - mysql_datadir:/var/lib/mysql # 映射 mysql 存储数据的目录
    networks:
      - love_vue
​
  redis:
    image: redis:5.0.10
    container_name: redis
    ports:
      - "6379:6379"
    command: "redis-server /usr/local/etc/redis/redis.conf --appendonly yes" # 开启持久化和加载自定义配置文件
    volumes:
      - redis_data:/data # redis 持久化目录
      - redis_conf:/usr/local/etc/redis # redis 配置文件目录
    networks:
      - love_vue
  # nginx 服务
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - nginx_content:/usr/share/nginx/html # 映射静态资源目录
      - nginx_conf:/etc/nginx # 映射配置文件目录
    networks:
      - love_vue
​
#声明 数据卷
volumes:
  mysql_datadir:
  nginx_content:
  nginx_conf:
  redis_data:
  redis_conf:
​
# 声明网桥
networks:
  love_vue:

编写好之后在docker-compose.yml同级目录下运行命令docker-compose up -d --build,-d表示在后台运行,--build在初次编排时因为需要生成自定义镜像所以加上,当然如果在后续改动了Dockerfile也需要加上--build才能重新加载自定义镜像(这里也是我踩坑的地方,明明改了配置文件jdk却一直没变,各位注意),这里我建议使用docker-compose up --build,因为这样跑起来你可以看到运行时的日志,如果有问题可以看报错解决,如果在后台运行有问题的话容器就不会启动,你也不知道,第二次启动使用docker-compose up就行。

编排好之后会在服务器var/lib/docker/volumes目录下生成相应的数据卷,数据卷的功能如果不清楚的话建议看看我的上一篇文章。

6.构建前端

首先将前端打包的dist文件传到/var/lib/docker/volumes/love_nginx_content/_data/目录下,因为这里映射的是nginx容器的项目文件目录。

上传好之后进行nginx的vue项目的配置,在/var/lib/docker/volumes/love_nginx_conf/_data/conf.d/目录下有一个default.conf文件,我们往其中加入对应内容,有两种解决方式,自行选择,注意最后一行的ip要改为自己的服务器ip:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
​
    # 方式一
    location / {
        try_files $uri $uri/ @router; #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
        root   /usr/share/nginx/html/dist; # 静态资源路径
        index  index.html index.htm;
    }
    #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
    #因此需要rewrite到index.html中,然后交给路由在处理请求资源
    location @router {
        rewrite ^.*$ /index.html last;
    }
    # 方式一
    
    #  方式二
    location / {
      root   /usr/share/nginx/html/mkhb/dist;
      try_files $uri $uri/ /index.html;
      index  index.html index.htm;
    }
     #  方式二 
    
    location /prod-api/{
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://ip:8080/;
    }
​
}

7.配置redis

因为使用docker拉取的redis镜像不自带redis配置文件,所以需要自行去下载,由于配置文件下载地址也在外国网站,所以我的建议是去下一个版本对应的redis文件然后将配置文件的band那一列改为bind 0.0.0.0,并复制粘贴到/var/lib/docker/volumes/love_redis_conf/_data/

图中的redis.conf,如果懒得下我这里提供5.0.10版本的配置文件:

redis5.0.10配置文件

### 部署包含Spring Boot、Redis、Nginx和Vue3项目的指南 #### 使用Docker部署综合项目结构 为了成功地使用Docker部署一个由Spring Boot后端、Redis缓存服务、Nginx作为反向代理以及Vue.js前端组成的复杂Web应用程序,通常需要创建多个容器来分别处理各个组件的服务。这可以通过定义`docker-compose.yml`文件实现多容器编排。 对于具体的配置细节,在`docker-compose.yml`中可以指定不同服务之间的依赖关系和服务本身的属性,比如暴露的端口号、挂载的数据卷等[^4]。 #### 构建前后端分离的应用架构 - **后端部分**:基于Spring Boot框架开发API接口,并通过Maven或Gradle工具构建可执行JAR包。在对应的Dockerfile中应指明基础镜像(如采用官方OpenJDK镜像),复制打包好的jar文件至目标位置并设置入口点命令启动Java应用;同时利用环境变量传递必要的配置项给应用程序实例,例如数据库连接字符串或者密钥等敏感信息[^3]。 如果遇到类似`ADD failed: file not found in build context or excluded by .dockerignore`这样的错误,则可能是由于`.dockerignore`文件排除了所需的资源或者是当前工作目录下的相对路径不正确所引起的。确保项目根目录存在有效的输出制品并且未被忽略规则匹配上是解决问题的关键所在[^2]。 - **前端部分**:以Vue CLI脚手架为基础建立单页面应用(SPA),经过npm run build指令产出静态网页资产放置于特定文件夹内供后续集成调优阶段引用。针对Vue Router的历史模式(History Mode)特性做适配调整时,需配合Nginx服务器设定恰当的位置路由规则以便正确解析URL地址映射到实际存在的HTML文档片段之上[^1]。 ```yaml version: '3' services: backend: image: springboot-app ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydatabase?useSSL=false&serverTimezone=UTC SPRING_REDIS_HOST: redis depends_on: - db - redis frontend: image: nginx volumes: - ./frontend/dist:/usr/share/nginx/html ports: - "80:80" db: image: mysql/mysql-server:latest environment: MYSQL_ROOT_PASSWORD: jeecg123456 volumes: - db_data:/var/lib/mysql redis: image: redis:alpine volumes: db_data: ``` 上述YAML片断展示了如何组合各独立部件形成统一的整体解决方案。其中特别强调了关于MySQL密码默认值的信息[^5]。 #### 注意事项 确保所有涉及的安全凭证都妥善保管起来,不要硬编码进源代码或是公开版本控制系统里面去。另外考虑到生产环境中可能涉及到更复杂的网络策略与安全组规则等因素的影响,建议提前做好充分测试验证再正式上线发布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值