docker 一键部署前后端项目 ruoyi

使用 docker 一键部署前后端项目
这里我以开源项目ruoyi 的 vue 前后端为例,想要通过 docker 一键跑起来,需要对项目做部分调整。
修改 springboot yml 的配置
application.yml

 # redis 配置
redis:
    # 地址,host 是关键点,不能配置为 ip,应该配置的是docker 容器的服务名称,后面看
    # 对应本文下面的 docker-compose-yml 中,你就知道了!!!
	  host: redis
    # 端口,默认为6379
    port: 6379
    # 密码
    password: 123456
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池的最大数据库连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms

application-dev.yml mysql 的 url 配置

# 注意这里写的是 db,没有写 ip 地址,同样是服务名称,对应 docker-compose-yml 中
url: jdbc:mysql://db:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8

后端修改好了之后 就直接打 jar 包吧,下面看 修改前端的配置,对于 ruoyi 这个 vue-cli 项目来说,需要修改 vue.conf.js 中的 devSever 节点中的 target

devServer: {
    host: '0.0.0.0',
    port: port,
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
				# 这里需要注意,target 要配置为 后端容器的名称+端口 
				# 或者 docker-compose.yml 中 services下对于的服务名称+端口
				# target: `http://api:8080`, 或者
				# target: `http://ruoyi:8080`,
        // target: `http://localhost:8080`,
        target: `http://api:8080`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
        }
      }
    },
    disableHostCheck: true
  },

前端项目中不用修改其他了,vue.conf.js 修改好了之后,直接 npm run build:prod 打包

mysql 和 nginx 此处我都挂载运行了,redis 没有特殊处理,你也可以将 redis 的数据文件进行挂载。

准备部署的机器上创建好如下的文件夹

# nginx 
/home/nginx/html
/home/nginx/conf/nginx.conf
/home/nginx/logs
/home/nginx/conf.d

# mysql
/home/mysql/data:/var/lib/mysql
/home/mysql/conf:/etc/mysql
/home/mysql/log:/var/log/mysql

创建 Dockerfile 并写入以下内容

# 指定基础镜像
FROM java:8
# 维护者信息
MAINTAINER  author_name "xxx@qq.com"

RUN echo "-------------------- 后端 api 环境配置 --------------------"

COPY ruoyi.jar /app.jar

# 暴露8080端口
EXPOSE 8080
# 设置环境编码UTF-8
ENV LANG C.UTF-8

创建 docker-compose.yml 文件并写入以下内容

version: '3.6'
services:
  #指定服务名称
  db:
    #指定服务使用的镜像
    image: mysql:5.7
    #指定容器名称
    container_name: mysql
    restart: always
    #指定服务运行的端口
    ports:
      - "3307:3306"
    volumes:
      # 上面创建的文件夹,将启动的容器对应数据挂载在主机这些文件夹里
      - /home/mysql/data:/var/lib/mysql
      - /home/mysql/conf:/etc/mysql
      - /home/mysql/log:/var/log/mysql
    #指定容器的环境变量
    environment:
      #数据库密码
      - MYSQL_ROOT_PASSWORD=123456
      #创建的库
      - MYSQL_DATABASE=ruoyi
      #允许多IP连接数据库
      - MYSQL_ROOT_HOST=%

  redis:
    image: redis:6.2.2
    #指定容器名称
    container_name: redis1
    ports:
      - "6379:6379"
  api:
    container_name: ruoyi
    restart: always #
    build:
      context: ./
      dockerfile: ./Dockerfile
    #    working_dir: /app
    volumes:
      - ./logs/:/logs
    ports:
      - "8080:8080"
    #    command: mvn clean spring-boot:run -Dspring-boot-run.profiles=dev '-Dmaven.test.skip=true'
    command: java -jar app.jar
    depends_on:
      - db
      - redis

  nginx:
    image: nginx
    container_name: nginx1
    restart: always
    ports:
      - "80:80"
    volumes:
      - /home/dist:/usr/share/nginx/html
      - /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /home/nginx/logs:/var/log/nginx
      - /home/nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - api

/home/nginx/conf下创建好 nginx.conf 内容如下

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

创建 /hoem/nginx/conf.d/default.conf 文件,写入以下内容

server {  
    listen       80;  
    server_name  localhost;  
  
    #charset koi8-r;  
    #access_log  /var/log/nginx/log/host.access.log  main;  
  
    location / {
        root   /usr/share/nginx/html;
        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;
        # api需要和 docker-compose.yml 中 services 下的后端服务名称或者容器名称一致,
        proxy_pass http://api:8080/;
    }
  
    #error_page  404              /404.html;  
  
    # redirect server error pages to the static page /50x.html  
    #  
    error_page   500 502 503 504  /50x.html;  
    location = /50x.html {  
        root   /usr/share/nginx/html;  
    }  
  
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
    #  
    #location ~ \.php$ {  
    #    proxy_pass   http://127.0.0.1;  
    #}  
  
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
    #  
    #location ~ \.php$ {  
    #    root           html;  
    #    fastcgi_pass   127.0.0.1:9000;  
    #    fastcgi_index  index.php;  
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
    #    include        fastcgi_params;  
    #}  
  
    # deny access to .htaccess files, if Apache's document root  
    # concurs with nginx's one  
    #  
    #location ~ /\.ht {  
    #    deny  all;  
    #}  
}

另外 mysql 的配置需要修改一下,在/home/mysql/conf 下创建 my.cnf 添加如下内容

[mysqld]
character-set-server=utf8
# 让 mysql 忽略表的大小写,主要是因为ruoyi 这个项目里的定时任务表都是大写,linux 下 mysql 默认是对大小写敏感的。不修改会提示定时任务的几个表不存在
lower_case_table_names = 1

做好这些工作之后,让 Dockerfile,docker-compose.yml ruoyi.jar 在同一目录下,最后执行一条命令
docker-compose up -d 项目即可启动。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值