Docker Compose: Spring Boot +MySQL+MyBatis

4 篇文章 0 订阅
3 篇文章 0 订阅

如果spring boot项目中使用了数据库(MySQL),分别构建web和数据库的docker镜像时,数据库连接字符串中的IP地址可能会带来一些麻烦。因为web服务中的数据库连接地址依赖于数据库镜像的容器地址,所以考虑使用Docker Compose,把两者在构建镜像前先关联起来。具体步骤如下:

  • 首先在pom.xml中添加docker所需依赖
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
	<repository>docker/${project.artifactId}</repository>
	<buildArgs>
		<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
	</buildArgs>
</configuration>
</plugin>
  • 然后编辑docker-compose.yml
version: '3'
    services:
      mysql:
      container_name: mysql-container #给mysql容器起一个名字
      image: mysql-imagename #镜像名称来自已拉取的mysql,可以用pull拉取,docker images 查看镜像名称
      environment:
        MYSQL_DATABASE: database-name #对于拉取后的mysql,此名称用来创建一个空数据库,之后可导入数据
        MYSQL_ROOT_PASSWORD: 123456 #数据库密码
        MYSQL_ROOT_HOST: '%'
        TZ: Asia/Shanghai #时区
      ports:
        - "3306:3306"#端口映射 把宿主机的端口3306(第一个)映射到容器的端口3306(第二个)
      volumes:
        - ~/.canalyze_web/mysql/mysql_data:/var/lib/mysql #宿主机目录挂在容器
      restart: always
      user: root


      project-app:
        restart: always
        build:
          context: ./
          dockerfile: ./docker/app/Dockerfile
        working_dir: /app
        environment:
          TZ: Asia/Shanghai
        volumes:
          - ./web:/app
          - ~/.m2:/root/.m2
          - ~/.project_name/logs/app:/app/log #这里的project_name就是项目根目录名称
        ports:
          - "9091:8080"#端口映射 把宿主机的端口9091(第一个)映射到容器的端口8080(第二个)
        depends_on:
          - mysql #这里的名称和第三行服务名称保持一致
        command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker #指定启动配置文件为application-docker.properties
  • 然后创建并编写docker/app/Dockerfile文件,这个文件没有后缀,内容只有一行
FROM maven:3.5-jdk-8
  • 然后创建并编写application-docker.properties,可以直接对之前的文件application.properties重命名后得到此文件。
  • 由于使用了mybatis,有关数据库连接的配置文件比普通的spring boot项目多了几个,比如application.yml,generatorConfig.xml,jdbc.properties,mybatis-config-dao.xml等,所有出现了数据库连接语句的文件中的localhost:3306全部修改为mysql:3306(这里的mysql来源于docker-compose.yml中的第三行,3306来源于docker-compose.yml中的第十二行)

到这里所有的内容就编辑好了,进入docker-compose.yml文件所在目录,使用命令sudo docker-compose up来构建并启动容器,启动后使用docker ps 应该能看到有两个容器在运行,名称分别为mysql-container(数据库的)和XXX-project-app(web应用的)然后在浏览器访问localhost:9091即可。可以查看宿主机IP地址address然后访问address:9091。

附:不同项目的配置文件可能不同,这里给出我的项目中的几个配置文件内容,仅供参考

1. application.yml

spring:
# 数据库相关配置
datasource:
url: jdbc:mysql://mysql:3306/database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
initialSize: 1
minIdle: 1
maxActive: 5
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 180000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false

# mybaties 配置
mybatis:
  mapperLocations: classpath:mapper/*.xml
  typeAliasesPackage: com.project.web.entity

2.application-docker.properties

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.http.multipart.maxFileSize=1000Mb
spring.http.multipart.maxRequestSize=10000Mb
driver=com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456

3. generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <properties resource="application.yml"/>

    <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://mysql:3306/database?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8&amp;useSSL=false&amp;allowPublicKeyRetrieval=true"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加 构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="${targetXMLPackage}"  targetProject="${targetResourcesProject}">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- tableName是数据库的表名,domainObjectName是生成的实体类名称 -->
        <table tableName="user_info" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="project_info" domainObjectName="ProjectInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

4. jdbc.properties

driver=com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456

5. mybatis-config-dao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--从外部配置文件导入jdbc信息-->
    <properties resource="jdbc.properties"></properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射资源文件-->
    <mappers>
        <mapper resource="mapper/UserInfoMapper.xml"/>
        <mapper resource="mapper/ProjectInfoMapper.xml"/>
    </mappers>

</configuration>

以上是一些附加的配置文件的内容。

特别鸣谢:

1. https://www.cnblogs.com/ityouknow/p/8661644.html

2. https://www.jianshu.com/p/4d92f9188266

3. https://blog.csdn.net/Gushiyuta/article/details/93239648

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值