본문 바로가기
Infra

[Docker Compose] depense_on으로 서비스 의존 관계 설정하기

by devson 2024. 10. 30.

대부분의 웹 애플리케이션은 DB나 Message Queue와 같은 외부 인프라에 종속을 갖게 된다.

예를 들어 DB를 사용하는 Spring 애플리케이션은 실행 시에 DB datasource를 생성하기 위해서 먼저 DB 커넥션을 맺는다.

이때 DB와 연결이 되지 않으면 Spring 애플리케이션이 실행되지 않는데,

Docker Compose에서는 이렇게 서비스 간의 의존 관계를 명시해야하는 경우 healthcheckdepense_on 옵션을 통해서 처리할 수 있다.

 

  • healthcheck 옵션은 해당 서비스의 상태를 어떻게 확인할지를 명시한다.
  • depends_on 옵션은 다른 서비스와의 의존 관계를 명시한다.

 

예시로 MySQL과 Redis를 의존하는 웹 애플리케이션의 경우 아래와 같이 docker-compose 스크립트를 짤 수 있다.

services:
  my-web-application:
    image: "my-web-application" # 인프라에 의존하는 웹 애플리케이션
    ports:
      - "8080:8080"
    environment:
      # MySQL
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/my-db
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
      # Redis
      - SPRING_DATA_REDIS_HOST=redis
      - SPRING_DATA_REDIS_PORT=6379
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy

  mysql:
    container_name: mysql
    image: "mysql:8.0"
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=datarise
      - TZ=Asia/Seoul
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_ROOT_PASSWORD" ]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    container_name: redis
    image: "redis:7.4.0-alpine"
    ports:
      - "6379:6379"
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      timeout: 5s
      retries: 5

 

 

참고: https://docs.docker.com/compose/how-tos/startup-order/

'Infra' 카테고리의 다른 글

Github Actions self-hosted runner - Ubuntu 구성하기  (1) 2023.08.12

댓글