目录

首先说一下我的端口配置

1.购买服务器:

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

3.打包

4.编写Dockerfile

5.编写dockercompose.yml

6.构建前端

7.配置redis


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

首先说一下我的端口配置

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

1.购买服务器:

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

docker storm部署 docker部署项目教程_redis

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

docker storm部署 docker部署项目教程_服务器_02

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

docker storm部署 docker部署项目教程_docker_03

点击手动添加添加目的和源,源为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盘就行,安装好之后配置自己的服务器,先新建一个会话

docker storm部署 docker部署项目教程_docker storm部署_04

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

3.打包

后端打包:

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

docker storm部署 docker部署项目教程_redis_05

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

java -jar jar包名称.jar

测试一下是否能跑起来

前端打包:

这里使用npm的build命令

docker storm部署 docker部署项目教程_docker_06

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/

docker storm部署 docker部署项目教程_服务器_07

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

redis5.0.10配置文件