1.1、安装docker
# 安装
yum install docker
# 检验安装是否成功
[root@huchao /]# docker --version
Docker version 20.10.8, build 3967b7d
# 启动
systemctl start docker
1.2、安装docker compose
# 安装docker compose
1.从github上下载docker-compose二进制文件安装
sudocurl-L"https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)"-o /usr/local/bin/docker-compose
2.若是github访问太慢,可以用daocloud下载
sudocurl-Lhttps://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m`-o /usr/local/bin/docker-compose
# 赋予权限
sudochmod+x /usr/local/bin/docker-compose
# 检查是否安装成功
docker-compose --version
1.3、编写Dockerfile文件
因为我们的项目需要成为docker的镜像,所以我们必须先编写Dockerfile文件构建我们的项目镜像然后进行编排,Dockerfile文件可以帮助我们进行构建
打包后的jar包,如果要放到容器里面,就要借助dockerfile进行构建
文件中expose的作用:
- 只是说明docker容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明
- -P命令可以结合这个dockerfile文件中的EXPOSE暴露的端口。会将容器中的EXPOSE端口随机映射到宿主机的端口
- Dockerfile
FROM java:8
EXPOSE 8080
ADD websocket-0.0.1-SNAPSHOT.jar app.jar
RUN bash-c'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=pro"]
上面的几行命令其实很简单,首先依赖jdk8环境,对外暴露了8080端口,然后就是复制 websocket-0.0.1-SNAPSHOT.jar到docker容器中并命名为 app.jar ,最后是执行 java -jar /app.jar --spring.profiles.active=pro 使用的是我们编写的生产环境配置
1.4、编写docker-compose.yml文件
docker的编排配置文件
version: '3'# 指定docker-compose版本
services:
nginx: # 服务名称 用户自定义
image: nginx:latest # 镜像nginx的最新版本
ports:
- 80:80 # 暴露端口(宿主:容器),把容器80端口映射到宿主机的80端口
volumes: # 挂载(宿主:容器)
- /root/nginx/html:/usr/share/nginx/html
- /root/nginx/nginx.conf:/etc/nginx/nginx.conf
privileged: true # 这个必须要,解决nginx的文件调用的权限问题
mysql:
image: mysql:5.7.19
ports:
- 3306:3306
environment: # 指定 root 用户的密码
- MYSQL_ROOT_PASSWORD=12345
redis:
image: redis:latest
vue-springboot-blog:
image: vueblog:latest
build: . # 表示以当前目录下的Dockerfile开始构建镜像
ports:
- 8085:8085
depends_on: # 依赖于mysql、redis,其实可以不填,默认已经表示可以
- mysql
- redis
1.5、修改application-pro.yml
直接使用
mysql
替换掉MySQL的URL当我们访问时,
mysql
会自动转换成docker内部的IP地址
# DataSource Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/vueblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 10428376
shiro-redis:
enabled: true
redis-manager:
host: redis:6379
1.6、准备好nginx的挂载目录和配置
docker-compose.yml中已经提到,
- 宿主机的挂载目录: /root/nginx/html
- 挂载配置:/root/nginx/nginx.conf
所以我们在root目录下新建nginx目录,并进入nginx目录下新建html目录和一个nginx.conf配置文件。
然后读nginx.conf进行编写,具体配置如下:
- nginx.conf
#user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html last;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1.7、上传前端
前端打包之后先修改前端调用后端的接口
然后npm run build 打包得到dist文件夹,将其压缩,并上传到linux的 root/nginx/html目录下
- 解压:
upzip dist.zip
安装unzip:yum install unzip
- 将
mv dist/* .
- 去除dist文件夹和dist.zip:
rm -rf dist*
cd ..
vim nginx.conf
:wq
:保存退出
1.8、部署后端
打包后端项目:跳过测试
mvn clean package -Dmaven.test.skip=true
将打包好的jar包、Dockerfile、docker-compose.yml都上传到linux根目录下,
然后执行一下编排命令
# 开始编排
docker-compose up -d
其中-d表示后台服务形式启动, 然后稍等片刻,特别是Building vue-springboot-blog 的时候可能时间有点长,耐心等待即可!
# 查看日志
docker logs -f java项目的containerID
常见问题
- Unable to start docker Container from docker-compose “unknown flag: iidfile”
原因:compose
版本过高导致1.29.1
解决:降低compose
版本到1.26.2
rm -f /usr/local/bin/docker-compose
- 备注:因为降低了
compose
版本,compose
的yml文件需要降低版本到3.3 - 数据库连接报错:plugin caching_sha2_password could not be loaded
将MySQL版本由8降为了5.7 - 重新启动docker-compose重启但不更新:
- 全部:docker-compose restart
- 单个:docker-compose restart worker
- 重启并更新:
- 全部:docker-compose up --detach --build
- 单个:docker-compose up --detach --build websocket
- java.sql.SQLSyntaxErrorException: Table 'chatroom.USER' doesn't exist
Windows中的表名不区分大小写,而linux中区分 - Error parsing HTTP request header
我们在前后台交互的时候往往使用json格式的字段串参数,其中含有“{}”“[]”这些特舒符号,在高版本的tomcat中含有这些字符的请求会被拦截
添加如下配置类即可
@Configuration
publicclassTomcatConfig {
@Bean
publicTomcatServletWebServerFactorywebServerFactory() {
TomcatServletWebServerFactoryfactory=newTomcatServletWebServerFactory();
factory.addConnectorCustomizers((Connectorconnector) -> {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
});
returnfactory;
}
}
- 加了这个是本地可以正常运行,服务器是不报错了,但功能却没实现!
更改为在配置中:
#设置http参数限制
server.tomcat.max-http-header-size=3145728
- 已被springboot高级版本废除
server.max-http-header-size=8192
- 也不行;
docker-compose up --detach --build
后终于成功