NestJS 배포와 관측성

Docker를 이용한 컨테이너화: 이미지 실행 조건과 healthcheck

컨테이너화는 앱을 포장하는 단계가 아니라 실행 조건을 고정하는 작업입니다. 빌드 산출물, 권한, 포트, 상태 확인이 운영과 같은 기준인지 확인합니다.

이미지 실행 조건은 build 산출물, runtime 권한, health 신호가 이어져야 닫힌다

Dockerfile만 보지 말고 컨테이너가 실제로 뜬 뒤의 증거까지 같은 선에서 확인한다.

build base image, lockfile, npm ci로 재현 가능한 산출물을 만든다.
runtime dist와 production dependency만 남기고 non-root로 실행한다.
health PORT, DB_URL, SIGTERM, readiness 실패를 컨테이너 상태로 확인한다.
evidence digest, scan 결과, startup log, health 응답을 배포 기록에 남긴다.
01

빌드 산출물과 base image 고정

multi-stage build로 dist와 production dependency만 복사하고 Node base image, lockfile, npm ci 조건을 재현 가능하게 둡니다.

build
02

runtime user와 포트 확인

root가 아닌 사용자, exposed port, NODE_ENV, read-only filesystem 등 컨테이너 실행 조건을 Dockerfile과 compose에서 맞춥니다.

runtime
03

운영 불일치 재현

잘못된 env, DB 연결 실패, healthcheck 실패, SIGTERM 종료를 테스트해 로컬에서는 되지만 운영에서 죽는 조건을 줄입니다.

healthcheck
04

이미지 증거 남기기

image digest, scan result, size, startup log, healthcheck 응답을 배포 기록에 남겨 어떤 이미지가 실행됐는지 역추적합니다.

image digest
Dockerfile
컨테이너 기준은 Dockerfile의 stage와 dependency에서 결정 builder stage에는 dev dependency가 있어도 runtime stage에는 dist, package lock, production node_modules만 남깁니다.
multi-stage
Runtime
Docker 실행 옵션은 NestJS ConfigModule과 맞춘다 PORT, NODE_ENV, DB_URL 같은 값은 runtime env로 주입하고 image layer나 compose 예시에 secret을 남기지 않습니다.
env injection
Healthcheck
NestJS 컨테이너화 검증은 종료와 readiness까지 포함 GET /health, SIGTERM graceful shutdown, migration 대기, non-root 실행을 컨테이너 명령으로 확인합니다.
readiness

Docker 이미지 실행 조건

작은 runtime 이미지 개발 도구와 test fixture가 빠진 이미지가 같은 digest로 registry와 배포 기록에 남습니다.
비밀 없는 이미지 DB password, JWT secret, API key가 Docker layer, compose 예시, startup log에 남지 않습니다.
상태 확인 healthcheck 실패와 SIGTERM 종료가 orchestrator에서 감지되고 NestJS shutdown hook이 로그를 남깁니다.

Docker 이미지 실행 조건 점검

질문: Docker image가 production dependency, non-root user, healthcheck, runtime env 조건을 만족하는가
순서: multi-stage Dockerfile 확인 -> 컨테이너 부팅/healthcheck -> SIGTERM과 잘못된 env 재현
위험: dev dependency와 secret이 image layer에 남거나 root로 실행되면 배포 편의가 곧 운영 공격면이 됩니다.