Docker Compose Support in Spring Boot 3.1

kms·2024년 1월 2일
2

스프링 부트 3.1 부터 Docker Compose 를 지원하는 기능이 생겼다.
매번 컨테이너를 일일히 명령어로 띄워서 개발하던 찰나에 나에겐 정말 반가운 기능이다.

간단히 말해서 compose 파일을 작성하면, 앱 실행 시 compose 파일을 토대로 컨테이너를 실행시킬 수 있는 기능이다.

필자는 개발을 할 때 개발용 데이터베이스를 도커 컨테이너로 먼저 띄운 뒤에 연결하여 개발을 즐겨하는 편이다.
물론 h2 데이터베이스를 사용한다면 docker 를 추가로 설치하지 않기 때문에 간편하고 또한 인메모리 데이터베이스이기 때문에 테스트 시에 빠르다는 장점도 있다.

하지만 h2 데이터베이스는 실제 프로덕션에서 사용하는 데이터베이스가 아니기 때문에 실제의 환경과 비슷하게 개발하기를 원했기 때문에 프로덕션과 같은 스펙의 DB 도커 이미지를 컨테이너로 실행시켜 실제 ddl, dml 도 추가하면서 개발을 진행합니다.

그래서 개발에 필요한 이미지를 컨테이너로 실행시킬 수 있도록 docker compose 파일을 미리 정의해두고 개발 시작 전 docker-compose up -d 으로 컨테이너를 미리 띄워두고 개발한다.

하지만, Spring Boot 3.1 부터는 spring-boot-docker-compose 의존성을 추가하면 Docker Compose 를 사용해서 컨테이너와 같이 동작할 수 있도록 지원하고 있다.

의존성 추가

사용법은 간단하다. 먼저 빌드 도구에 따라 아래의 의존성을 추가한다.

Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-docker-compose</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle

dependencies {
    developmentOnly("org.springframework.boot:spring-boot-docker-compose")
}

이후 애플리케이션 디렉터리에 실행 시킬 compose.yml 파일을 위치시킨 후 서버를 기동하면 된다.

실행 과정

  1. 스프링은 애플리케이션 디렉터리에서 compose.yml 또는 기타 일반적인 compose 파일 이름을 찾는다.

  2. docker compose up 명령어를 통해compose.yml 실행한다.
  3. 지원되는 각 컨테이너에 대한 서비스 연결 Bean 생성한다.
  4. 애플리케이션을 종료할 때 docker compose stop 명령어를 실행시켜 컨테이너를 종료한다.

유의점

Docker 와 Docker Compose 는 필수입니다.

위에 있는 의존성을 다운 받더라도 결국 docker 를 사용할 수 밖에 없습니다. 따라서 docker 그리고 docker compose CLI application 이 클래스 경로에 있어야 합니다. 지원되는 최소 버전은 Docker Compose 2.2.0 입니다.

직접 접속 시 랜덤 포트 유의

만약 spring.start.io 에서 프로젝트를 시작할 때 부터 해당 의존성을 추가하거나, Intelij 에서 제공하는 Spring Initliar 로 프로젝트를 시작할 때 의존성을 추가하는 경우에는 간단한 MySQL 컨테이너를 띄우도록 할 수 있는 compose.yml 파일이 있습니다.

이때 compose.yml 보면 MySQL 서버는 포트 3306를 사용하여 컨테이너 내부에서 실행될 수 있지만 로컬에서는 완전히 다른 포트에 매핑될 수 있다.

따라서 만약 로컬에서 항상 지정된 포트로 접속하고 싶다면 compose.yml 의 port 를 내외부 포트를 직접 명시해야합니다. 외부에서 접속하는 포트를 명시해야 합니다.

ports:  
- '33060:3306'

docker compose lifecycle

기본적으로 애플리케이션이 시작할 때 docker compose up 으로 컨테이너를 실행하고 애플리케이션이 종료될 때 docker compose stop 으로 컨테이너 실행을 종료합니다.

그렇기 때문에 가령 앱 실행과 상관없이 컨테이너에 접속하기 위해서는 매번 앱을 실행하거나, 혹은 종료된 컨테이너를 실행시켜야 하는 불편함이 있다.

따라서 이를 해결하기 위해 spring 에서는 spring.docker.compose.lifecycle-management 프로퍼티를 사용한다.

none : 말 그대로 아무것도 하지 않음 (Docker Compose 시작도 종료도 하지 않음).
start-only: 애플리케이션이 시작될 때 Docker Compose를 시작하고 실행 상태로 둡니다.
start-and-stop: 애플리케이션이 시작되면 Docker Compose를 시작하고 JVM이 종료되면 중지합니다.

추가로 spring.docker.compose.start.command 를 사용해서 애플리케이션 시작 시 docker compose up 을 사용할 것인지 혹은 docker compose start 를 사용할 것인지 등을 정할 수도 있다.

자세한 설정 방법은 참고에 있는 공식 문서를 살펴보기 바랍니다.

참고


https://www.youtube.com/watch?v=NOrwxSI_VIg
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.docker-compose
https://spring.io/blog/2023/06/21/docker-compose-support-in-spring-boot-3-1/

0개의 댓글