오늘은 docker-compose.yml을 작성하여 마피아 게임 서버를 컨테이너 환경에서 실행할 수 있도록 구성했다. 이를 통해 app(NestJS 기반 게임 서버)과 redis(게임 상태 관리를 위한 Redis)를 함께 실행할 수 있도록 설정했다.
작성한 docker-compose.yml 파일은 다음과 같은 서비스를 포함한다.
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를 설정하여 종료되더라도 자동으로 재시작되도록 한다.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을 적절히 매핑해야 한다.
docker-compose.yml을 활용하면 여러 개의 서비스를 손쉽게 관리할 수 있다.restart: always 설정을 통해 컨테이너가 비정상 종료되더라도 자동으로 복구할 수 있다.depends_on은 로컬 개발 환경에서는 유용하지만, ECS에서는 무시된다는 점을 고려해야 한다.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: