虚拟机是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.xml文件
Docker Compose官方文档(version2):https://docs.docker.com/compose/compose-file/compose-file-v2/#build
vim docker-compose.xml
写入以下内容:
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目录结构如下:



