본문 바로가기

DevOps

Spring Boot 개발 환경을 위한 도커 세팅, 그리고 실전 팁들 🐳

MeowRo 프로젝트에 Docker를 적용해 보고 있는데,
Spring Boot + MariaDB + Docker + GitHub Actions로 꽤 탄탄하게 세팅하고 있다.
중간중간 마주쳤던 문제들이 꽤 실무에서도 유용할 것 같아서 기록으로 남겨본다.


📦 도커 컴포즈, 서비스는 뭘 의미할까?

services:
  meowro-db-dev:
  meowro-api-dev:

처음에 이걸 보고 "하나의 컨테이너 안에 두 서비스가 들어가는 건가?" 싶었는데,
그게 아니라 services는 "컨테이너 단위로 실행할 애플리케이션"을 말한다.
즉, 이건 컨테이너가 2개 생긴다는 뜻이다.
각 서비스 = 하나의 컨테이너.
하나의 API, 하나의 DB 이렇게 나눠진다고 보면 된다.


⚙️ depends_on, 진짜 의존이 아니더라

처음엔 depends_on만 써두면 DB가 준비되고 나서 Spring Boot가 실행될 줄 알았는데,
DB 컨테이너가 시작만 되면 바로 다음 컨테이너도 실행하더라.
결국 DB가 완전히 준비되기도 전에 API가 DB 연결을 시도하면서 실패 💣

해결법은 두 가지였다:

✅ healthcheck + depends_on 조건 설정

meowro-db-dev:
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
    interval: 5s
    timeout: 3s
    retries: 10

meowro-api-dev:
  depends_on:
    meowro-db-dev:
      condition: service_healthy

이렇게 하면 DB 컨테이너가 실제로 "정상 응답 가능한 상태"가 될 때까지 기다려준다.


💾 volumes는 왜 명시적으로 쓰는 게 좋을까?

volumes:
  db_data:

이렇게만 쓰면 Docker가 자동으로 볼륨을 하나 만들어준다.
근데 이름도 랜덤스럽고 나중에 관리가 좀 애매하다.
그래서 아래처럼 명시적으로 이름을 지어주는 걸 추천한다:

volumes:
  meowro-db-dev-data:
    name: meowro-db-dev-data
    driver: local

이러면 docker volume ls 했을 때 한 눈에 용도 파악이 가능하다.


🗂 Spring 로그 파일을 날짜별로 관리하고 싶었다

Spring Boot에서 WAS 로그를 파일로 남기려면, application-*.yml에서 로그 경로를 지정해주면 된다.
그리고 날짜별로 분리하고 싶을 땐 이렇게 설정했다:

logging:
  file:
    name: /home/service/meowro/api/dev/logs/spring.log
  logback:
    rollingpolicy:
      file-name-pattern: /home/service/meowro/api/dev/logs/spring-%d{yyyy-MM-dd}.log
      max-history: 14
      total-size-cap: 1GB

파일은 하루 단위로 나뉘고, 14일치까지만 유지된다.

( max-history 처음알았는데, 개꿀 )


로그는 spring-2025-04-04.log, spring-2025-04-05.log 이런 식으로 쌓인다.


📁 로그 파일이 안 생긴다고?

처음에 로그 파일이 안 생겨서 살짝 당황했었는데, 알고 보니 도커 컨테이너 안에 해당 경로가 없었을 뿐이었다.
Dockerfile에 로그 디렉토리를 미리 생성해두면 문제 해결됨:

RUN mkdir -p /home/service/meowro/api/dev/logs

🔚 마무리

생각보다 도커 + Spring Boot 세팅이 복잡한 건 아니었는데,
"조금만 신경 쓰면 실무급으로도 확장 가능한 구조"가 된다는 게 매력이다.

환경은 개발자를 배신하지 않으니까,
처음부터 잘 정리해두면 나중에 진짜 고마워진다. (특히 에러 났을 때...🫠)