Docker Compose部署SpringBoot项目
虚拟机是CentOS8-arm64
外部机是Mac(m1芯片)
1. 制作SpringBoot项目镜像
(1) 将SpringBoot项目打为jar包
将jar包复制到虚拟机中(可以在虚拟机新建好一个文件夹存放,放到其他文件夹下可能没有权限),我使用的是ForkLift,在AppStore可以免费下载
(2) 准备工作
创建一个文件夹存放dockerfile,并进入
mkdir ~/dockerfile
cd ~/dockerfile
将刚刚的jar包移动到docker-files目录中,并修改名字
mv /mysoft/bill-manager-1.0-SNAPSHOT.jar bill-manager.jar
(3) 编写dockerfile文件
vim bill-dockerfile
dockerfile官方文档:https://docs.docker.com/engine/reference/builder/
需要注意:我的springboot项目是基于jdk1.8开发的,因此需要定义父镜像为java8,普通的amd64的CentOS定义如下:
FROM java:8
由于我的电脑里安装的是arm64架构的CentOS,普通的java:8不支持,因此重新在docker hub上找了一个支持arm64的jdk8:
FROM openjdk:8u322-jre
完整dockerfile文件:
FROM openjdk:8u322-jre
MAINTAINER xx xx@163.com # 作者信息,可以不定义
ADD bill-manager.jar bill.jar # 将当前目录下的jar包添加到容器,并改名为bill.jar
CMD ["java", "-jar", "bill.jar"] # 定义容器启动执行的命令
(4) 生成镜像
docker build -f ./bill-dockerfile -t bill .
- -f 指定dockerfile所在的路径
- -t 可以指定镜像名称和版本,格式:imagename:version;版本可以省略不写,默认为latest
(5) 查看镜像
docker images
可以看到刚刚制作的镜像:
2. 使用Docker Compose编排Mysql+SpringBoot
(1) 安装Docker Compose
参考:https://zhuanlan.zhihu.com/p/390868743
(2) 拉取Mysql镜像
由于我的是arm64架构的CentOS8,因此在dockerhub 找了一个支持arm64架构的mysql镜像:
docker pull mysql:oracle # 支持arm64架构
(3) 创建并进入docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
(4) 编写docker-compose.yml文件
Docker Compose官方文档(version2):https://docs.docker.com/compose/compose-file/compose-file-v2/#build
vim docker-compose.yml
写入以下内容:
version: "1" # 版本
services:
mysql: # 自定义服务名称
image: mysql:oracle # mysql镜像
container_name: mysql # 指定容器名称,不指定会默认为docker-compose-服务名称-1
port:
- "3306:3306" # 映射端口
environment:
MYSQL_ROOT_PASSWORD: 123456 # 设置数据库root账户的密码
volumes: # 配置数据卷
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
bill: # 自定义服务名称
image: bill # 这里用的就是刚刚创建好的镜像
container_name: bill
ports:
- "9001:9001"
links:
# 将bill容器与mysql容器连接起来,格式:service:alias 可以不写alias。
# 这样在springboot项目配置文件中的数据库连接地址的ip地址部分就可以使用数据库的服务名称代替
# 如:url: jdbc:mysql://mysql:3306/database
- mysql
# depends_on能设置启动顺序,但注意:
# 当这里配置了别的springboot服务时,只能保证启动顺序,不能保证等该服务启动完成才启动当前服务
# 针对这种情况官方推荐使用wait-for.sh脚本来控制服务间的启动顺序。
depends_on:
- mysql # 这里表示mysql容器先启动,然后再启动bill容器。
(5) 使用docker-compose启动容器
docker-compose up -d # -d表示以守护模式启动,会一直运行在后台
查看docker容器
docker ps
可以看到两个正在运行的容器,一个mysql,一个bill:
(6) 远程连接Mysql导入sql文件数据
进入容器并设置mysql允许远程连接,请参考:https://blog.csdn.net/jat0824/article/details/123499442?spm=1001.2014.3001.5502
使用Sequel Ace连接虚拟机上的mysql容器,使用root用户,和刚刚在docker-compose.xml中定义的root用户的密码进行登录:
然后导入sql文件。
(7) 测试访问
在浏览器访问:http://虚拟机ip:你映射的端口号/项目api,即可看到自己的项目页面
针对thymeleaf模板在docker中不生效的问题:
原本在Controller中返回页面可以直接返回字符串,thymeleaf会自动将其拼接上前缀:classpath:/templates/
和后缀:.html
来找到对应的页面并返回。
但是在docker中无法正确解析,需要返回一个ModelAndView才能正常解析,因此修改Controller:
重定向的内容也是一样:
然后重新打包,生成镜像(先删除原来的镜像),部署。
docker-compose.yml优化
修改了如果修改了代码,按照上面的流程就会需要重新制作镜像,比较麻烦,docker-compose文件中可以直接build镜像,不需要手动build。
修改bill-dockerfile文件
注意需要把文件名改为Dockerfile!!!!
FROM openjdk:8u322-jre
MAINTAINER xx xx@163.com # 作者信息,可以不定义
ADD bill-manager.jar bill.jar # 将当前目录下的jar包添加到容器,并改名为bill.jar
ENTRYPOINT ["nohup", "java", "-jar", "bill.jar", "&"] # 配置容器启动后执行的命令,注意CMD和ENTRYPOINT的区别。nohup command & 表示让当前程序在后台运行。
修改docker-compose.yml
官方文档:https://docs.docker.com/compose/compose-file/compose-file-v2/#build
version: "1"
services:
mysql:
image: mysql:oracle
container_name: mysql
port:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
bill:
# image: bill
build: ../dockerfile # 这里是要制作镜像的dockerfile所在的目录路径
container_name: bill
ports:
- "9001:9001"
links:
- mysql
depends_on:
- mysql
dockerfile目录结构如下: