본문 바로가기
Docker

[Docker-compose] 서버의 DB 연결 지연 이슈

by yonikim 2024. 10. 30.
728x90

 

 

docker-compose 로 구성한 server 컨테이너의 서버와 db 컨테이너의 MySQL 서버 연결시 데이터베이스 연결이 지연되는 문제가 발생했다. 

 

서버는 빠르게 실행되어 데이터베이스와 연결을 시도하지만 데이터베이스는 서버보다 늦게 실행되기 때문에, 서버 혼자 열심히 데이터베이스 연결을 시도하다가 죽어버리는 현상이었다. 

 

 


 

`depends_on` 은 컨테이너 간의 종속성을 설정하는데 사용되는 옵션으로, 이 옵션을 통해 특정 컨테이너가 다른 컨테이너의 실행을 완료한 후 시작되도록 지정할 수 있다. 

version: '3.8'

services:
  server:
    image: webapp
    depends_on:
      - db
  db:
    image: database

 

하지만 `depends_on` 은 단순히 시작 순서만 보장할 뿐, 실제로 db 가 완전히 준비된 후에 server 가 시작되는 것을 보장하지는 않는다. 즉, db 컨테이너가 실행되기만 하면 server 컨테이너를 시작한다. 

 

이 문제를 해결하려면 컨테이너가 준비될 때까지 기다리도록 healthcheck 나 retry 로직을 추가로 설정하는 것이 필요하다.

 

 

healthcheck 와 함께 사용하기 

docker-compose 버전 3.4 이상에서는 healthcheck 를 설정해 컨테이너의 상태를 체크하고, 서비스가 완전히 준비된 후 다른 컨테이너가 실행되도록 설정할 수 있다. 

version: '3.8'

services:
  server:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: server
    ports:
      - '3000:3000'
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis
    volumes:
      - ./src:/var/app/src
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8.0
    platform: linux/amd64
    # platform: linux/x86_64 # mac m1칩
    container_name: db
    env_file:
      - '.env.local'
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_DATABASE}
    volumes:
      - ./db:/var/lib/mysql
    healthcheck:
      test:
        [
          'CMD',
          'mysqladmin',
          'ping',
          '-h',
          'localhost',
          '-u',
          'root',
          '-p$$MYSQL_ROOT_PASSWORD',
        ]
      interval: 1s
      timeout: 20s
      retries: 10
      start_period: 10s

 

 

 

References

https://velog.io/@cabbage/문제해결-도커-컴포즈에서-DB-연결-지연-이슈

728x90

'Docker' 카테고리의 다른 글

[Docker] Docker Compose 는 무엇인가  (0) 2024.01.07
[Docker] 바인드 마운트(bind mount)  (0) 2021.09.19
[Docker] Docker 컨테이너 로그 관리  (0) 2021.06.16
[Docker] Timezone 설정하기  (0) 2021.06.02
[Docker] docker 설치하기  (0) 2021.04.27