Docker Compose: Spring Boot +MySQL+MyBatis

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

Docker Compose: Spring Boot +MySQL+MyBatis_第1张图片

  • 首先在pom.xml中添加docker所需依赖

com.spotify
dockerfile-maven-plugin
1.3.6

	docker/${project.artifactId}
	
		target/${project.build.finalName}.jar
	

  • 然后编辑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





    

    
        
            
            
        
        
        
        
            
        
        
            
            
            
            
            
            
            
            
        

        
            
        

        
            
        
        
        

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




    
    

    
        
            
            
                
                
                
                
            
        
    

    
    
        
        
    

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

特别鸣谢:

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

你可能感兴趣的:(docker,Mysql,Spring)