有这样一个需求,将一个SpringBoot的应用打包到Docker镜像中,并且这个SpringBoot的应用还需要用到MySQL、Redis等持久化工具,最好是能够在项目启动的时候自己执行SQL语句到数据库中。我们应该如何实现这个需求呢?
下面我们就来看看如何将一个Spring Boot应用与MySQL、Redis等持久化服务一起打包到Docker镜像中,然后运行并启动项目
编写Dockerfile
首先需要我们在SpringBoot项目根目录下创建一个Dockerfile的文件,用于定义Docker镜像的构建过程,示例内容如下所示。
# 使用基础镜像,这里以OpenJDK 11为例
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 复制编译好的Spring Boot JAR文件到镜像中
COPY target/my-application.jar /app
# 复制SQL脚本到镜像中
COPY db-scripts/initialize.sql /docker-entrypoint-initdb.d/
# 暴露应用端口
EXPOSE 8080
# 定义启动命令
CMD ["java", "-jar", "my-application.jar"]
在上面的例子中,我们将数据库SQL脚本复制到了镜像中,然后将其放在MySQL容器初始化脚本的/docker-entrypoint-initdb.d/ 中。这样,在MySQL容器启动时,会自动执行该SQL脚本,来进行数据库的初始化操作。
编写Docker Compose文件
接下来就可以使用Docker Compose来进行管理了,我们创建一个名为docker-compose.yml 的文件,用于定义Spring Boot应用、MySQL、Redis等服务的配置和链接关系,如下所示。
version: '3'
services:
my-application:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/my_database
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: password
SPRING_REDIS_HOST: redis
mysql:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: my_database
redis:
image: redis:latest
ports:
- "6379:6379"
在这个文件中宏,我们定义了应用服务、数据库服务、Redis缓存服务三个服务,my-application、mysql和redis。其中,my-application服务是用了上一步中构建的Docker镜像服务,而是指定了依赖于mysql和redis服务,并设置了Spring Boot应用与MySQL、Redis的连接参数。
编写SQL脚本
由于我们需要对数据库进行初始化操作,所以需要在Spring Boot项目的根目录下创建一个名为 db-scripts 的目录,并在其中编写初始化数据库的SQL脚本,例如 initialize.sql。
构建并运行Docker容器
接下来我们就可以通过Docker Compose命令行工具来构建并且运行Docker容器了,如下所示。
docker-compose up --build
通过上面的这些操作,我们就可以完成构建和启动包含Spring Boot应用、MySQL、Redis等服务的Docker容器,并在MySQL容器启动时自动执行初始化脚本。
接下来我们可以继续完善Docker Compose文件,为其添加上MySQL和Redis的持久化配置以及SpringBoot应用与MySQL和Redis的连接信息等,如下所示。
version: '3'
services:
my-application:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/my_database
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: password
SPRING_REDIS_HOST: redis
mysql:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: my_database
volumes:
- mysql-data:/var/lib/mysql
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- redis-data:/data
volumes:
mysql-data:
redis-data:
在更新之后,我们在Docker Compose中添加了两个卷(volumes),分别用于持久化存储MySQL和Redis的数据。这样,即使Docker容器被停止或删除,数据仍然会保留在宿主机的卷中,从而实现数据的持久化。
此外,我们也修改了Spring Boot应用的连接配置,使其能够正确连接到MySQL和Redis容器,以及设置了MySQL的初始化脚本。
通过上面的步骤,我们就可以完成SpringBoot整合MySQL、Redis等的容器化部署了,相比较于我们通过传统的安装MySQL、Redis的服务这种操作的话,容器化部署更加方便快捷,可以快速实现环境切换等。