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
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 |