2025년 3월 3일

김동환·2025년 3월 3일

Today I Learned (TIL) - Docker Compose를 활용한 마피아 게임 서버 구성

1. 개요

오늘은 docker-compose.yml을 작성하여 마피아 게임 서버를 컨테이너 환경에서 실행할 수 있도록 구성했다. 이를 통해 app(NestJS 기반 게임 서버)과 redis(게임 상태 관리를 위한 Redis)를 함께 실행할 수 있도록 설정했다.

2. Docker Compose 구성

작성한 docker-compose.yml 파일은 다음과 같은 서비스를 포함한다.

  • app: NestJS 기반의 마피아 게임 서버
  • redis: 게임 데이터를 관리하는 Redis 서버

3. 주요 설정

  • app 서비스

    • Dockerfile을 사용하여 애플리케이션 이미지를 빌드한다.
    • 환경 변수(REDIS_HOST, REDIS_PORT)를 설정하여 Redis와 연결한다.
    • 3000번 포트를 개방하여 외부에서 접근할 수 있도록 한다.
    • depends_on을 사용하여 redis 서비스가 정의된 후 실행되도록 한다.
    • restart: always를 설정하여 예기치 않은 종료 시 자동으로 재시작되도록 한다.
  • redis 서비스

    • ./src/redis/Dockerfile을 사용하여 Redis 이미지를 빌드한다.
    • container_name: mafia-redis를 설정하여 컨테이너 이름을 고정한다.
    • 6379 포트를 개방하여 애플리케이션에서 Redis에 접근할 수 있도록 한다.
    • volumes를 사용하여 Redis 데이터를 영구적으로 저장한다.
    • command를 활용해 redis.conf 설정 파일을 적용한 상태로 Redis를 실행한다.
    • restart: always를 설정하여 종료되더라도 자동으로 재시작되도록 한다.

4. 추가 고려 사항

  • ECS 배포 시 depends_on 무시
    ECS에서는 서비스 간 실행 순서를 depends_on으로 제어할 수 없기 때문에, Redis가 완전히 실행된 후 앱이 정상적으로 Redis에 연결되는지 확인하는 로직이 필요하다.

  • AWS EFS 활용 가능성
    Redis의 volumes를 AWS EFS로 대체할 수 있으며, 이를 통해 Redis 데이터를 영구적으로 보존할 수 있다.

  • ALB를 통한 접근
    현재 3000 포트를 개방하여 실행하고 있지만, ECS에서는 Application Load Balancer(ALB)를 통해 접근할 예정이다. 이를 위해 컨테이너 포트와 ALB의 Target Group을 적절히 매핑해야 한다.

5. 배운 점

  • docker-compose.yml을 활용하면 여러 개의 서비스를 손쉽게 관리할 수 있다.
  • restart: always 설정을 통해 컨테이너가 비정상 종료되더라도 자동으로 복구할 수 있다.
  • depends_on은 로컬 개발 환경에서는 유용하지만, ECS에서는 무시된다는 점을 고려해야 한다.
  • Redis의 데이터를 유지하려면 volumes를 적절히 활용해야 한다.

앞으로 AWS ECS에 배포할 때, ALB 설정 및 서비스 간 연결을 어떻게 최적화할지 고민해볼 예정이다.

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379
    ports:
      - '3000:3000' # ECS에서는 ALB를 통해 접근 가능
    depends_on:
      - redis # (ECS에서는 무시됨)
    restart: always # Redis가 늦게 실행되더라도 재시작 가능하도록 설정

  redis:
    build:
      context: ./src/redis
      dockerfile: Dockerfile
    container_name: mafia-redis
    ports:
      - '6379:6379'
    volumes:
      - redis_data:/data # AWS EFS를 사용할 수도 있음
    command: ['redis-server', '/usr/local/etc/redis/redis.conf']
    restart: always # 컨테이너가 종료되더라도 자동 재시작

volumes:
  redis_data:
profile
Node.js 7기

0개의 댓글