使用 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
项目即可启动。