spring/spring-boot

Spring Boot Docker Compose Support

ppthejake 2023. 12. 17. 20:08

Spring Boot 3.1 부터 개발자도구에 Docker Compose 연동을 지원한다.

스프링 공식 블로그에도 관련 소개글을 확인할 수 있다. 

일반적으로 docker compose 는 "docker-compose up" 으로 실행하고 "docker-compose down" 으로 컨테이너를 중지시킨다. Spring Boot 3.1 부터는 Docker Compose 명령어를 위임하여 사용할 수 있다. Spring Boot 어플리케이션이 시작되거나 중지되는 동안 컨테이너 관리도 같이 하게 된다는 의미이다.

디펜던시 설정

spring initializr 에서 프로젝트 구성시 Dependencies 에서 Docker Compose Support 를 추가하면 된다. (매우 간단하다.)

dependencies {
	...
    developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}

 

spring-boot-docker-compose 종속성이 추가되면 다음과 같은 동작을 한다.

  • 어플리케이션 디렉토리에서 compose.yaml 파일을 찾는다.  (application.properties 에서 파일명 별도지정 가능)
  • 검색된 compose.yaml 파일을 기준으로 docker-compose up 명령을 실행한다.
  • 지원되는 각 컨테이너에 대한 서비스 연결을 생성한다.
  • 어플리케이션이 shutdown 될 때 docker-compose stop 명령을 실행한다.
Spring Docker Compose 는 테스트 수행 시 disabled 가 기본값으로 설정되어 있다.
(spring.docker.compose.skip.in-tests=false)

Service Connections

Spring Boot Auto Configuration 에서 기본적으로 정의해 놓은 컨테이너 서비스 이름을 사용하여 설정됩니다. 현재 지원되는 목록은 다음과 같습니다.

Connection Details Matched On
ActiveMQConnectionDetails "symptoma/activemq"
CassandraConnectionDetails "cassandra"
ElasticsearchConnectionDetails "elasticsearch"
JdbcConnectionDetails "gvenzl/oracle-free"
"gvenzl/oracle-xe"
"mariadb"
"mssql/server"
"mysql"
"postgre"
MongoConnectionDetails "mongo"
Neo4jConnectionDetails "neo4j"
OtlpMetricsConnectionDetails "otel/opentelemetry-collector-contrib"
OtlpTracingConnectionDetails "otel/opentelemetry-collector-contrib"
PulsarConnectionDetails "apachepulsar/pulsar"
R2dbcConnectionDetails "gvenzl/oracle-free"
"gvenzl/oracle-xe"
"mariadb"
"mssql/server"
"mysql"
"postgres"
RabbitConnectionDetails "rabbitmq"
RedisConnectionDetails "redis"
ZipkinConnectionDetails "openzipkin/zipkin"

 

각각의 Connection Details 에 해당하는 컨테이너 명을 Match On 에 기재된 이름으로 명시해줘야 자동으로 연결된다.

만약, 종속성으로 mariadb 를 추가하면 compose.yaml 파일의 서비스명에 "mariadb" 와 함께 관련 설정이 추가된다.

services:
  mariadb:
    image: 'mariadb:latest'
    environment:
      - 'MARIADB_DATABASE=mydatabase'
      - 'MARIADB_PASSWORD=secret'
      - 'MARIADB_ROOT_PASSWORD=verysecret'
      - 'MARIADB_USER=myuser'
    ports:
      - '3306'

Compose 파일 변경하기

만약, compose 파일을 특정 디렉토리에서 별도의 이름으로 관리하는 경우 spring.docker.compose.file 속성에 관련정보를 정의한다.

spring.docker.compose.file=../my-compose.yml

Docker Compose Lifecycle

기본적으로 spring boot 어플리케이션이 시작될 때 docker-compose up 을 호출하고, 중지될 때 docker-compose stop 을 호출한다. 이와 다른 형태의 lifecycle 을 관리하고자 할 때, spring.docker.compose.lifecycle-management 속성을 사용할 수 있다.

  • none: docker compose 를 시작하거나 중지하지 않는다.
  • start-only: 어플리케이션이 실행될 때만 docker compose 를 실행한다.
  • start-and-stop: 어플리케이션이 실행될 때 docker compose 를 시작하고, 중지될 때 docker compose 를 중지한다.
spring.docker.compose.lifecycle-management=start-and-stop
spring.docker.compose.start.command=start
spring.docker.compose.stop.command=down
spring.docker.compose.stop.timeout=1,

Docker Compose Profiles 활성화하기

스프링 프로파일과 유사하게 Docker Compose 프로파일을 spring.docker.compose.profiles.active 속성에 지정할 수 있다.

spring.docker.compose.profiles.active=myprofile