NestJS 배포와 관측성
Docker를 이용한 컨테이너화: 이미지 실행 조건과 healthcheck
컨테이너화는 앱을 포장하는 단계가 아니라 실행 조건을 고정하는
작업입니다. 빌드 산출물, 권한, 포트, 상태 확인이 운영과 같은
기준인지 확인합니다.
이미지 기준
runtime image에 dist와 production dependency만 남고 digest로
추적되는가
실행 사용자
컨테이너가 root가 아닌 사용자로 뜨고 필요한 포트만 노출한다
환경 주입
PORT, NODE_ENV, DB_URL은 image layer가 아니라 runtime env로
들어온다
위험 신호
dev dependency, secret, root 실행, healthcheck 누락을 이미지
검사로 잡는다
이미지 실행 조건은 build 산출물, runtime 권한, health 신호가
이어져야 닫힌다
Dockerfile만 보지 말고 컨테이너가 실제로 뜬 뒤의 증거까지 같은
선에서 확인한다.
Dockerfile
base image
lockfile + npm ci
builder stage
test/build 가능
dev dependency 허용
runtime image
dist + prod deps
digest로 추적
container
non-root user
PORT, NODE_ENV
OK
ready
secret layer
image history 검사
dev deps 잔류
runtime 크기/scan
root 실행
권한 상승 표면
env drift
DB_URL, PORT 불일치
no healthcheck
장애 감지 지연
digest, scan result, startup log, health response를 배포 기록에
남긴다
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로 실행되면 배포 편의가 곧 운영 공격면이 됩니다.