Docker
도커
컨테이너 플랫폼의 사실상 표준. 애플리케이션을 이미지로 패키징하고 컨테이너로 실행.
도커
컨테이너 플랫폼의 사실상 표준. 애플리케이션을 이미지로 패키징하고 컨테이너로 실행.
Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행하기 위한 플랫폼입니다. 코드, 런타임, 라이브러리, 시스템 도구를 하나의 이미지로 패키징하여 "내 컴퓨터에서는 되는데..."라는 환경 차이 문제를 해결합니다. 2013년 출시 이후 컨테이너 기술의 대명사가 되었습니다.
Docker 이전에도 LXC(Linux Containers) 같은 컨테이너 기술이 있었지만, Docker가 사용하기 쉬운 CLI, 이미지 레이어 시스템, Docker Hub(이미지 레지스트리)를 제공하면서 폭발적으로 성장했습니다. 오늘날 거의 모든 클라우드 서비스와 CI/CD 파이프라인에서 Docker를 지원합니다.
Docker는 Linux 커널의 cgroups(리소스 제한), namespaces(격리), Union File System(레이어 파일시스템)을 활용합니다. 가상 머신(VM)과 달리 게스트 OS가 없어서 오버헤드가 적고, 이미지 크기도 수십 MB부터 시작해서 가볍습니다. 같은 호스트에서 수십~수백 개의 컨테이너를 실행할 수 있습니다.
실무에서 Docker는 개발 환경 통일, CI/CD 파이프라인, 마이크로서비스 배포, 레거시 앱 격리 등에 활용됩니다. Kubernetes, ECS, Cloud Run 등 대부분의 컨테이너 오케스트레이션 플랫폼이 Docker 이미지를 사용합니다.
# Node.js 프로덕션 Dockerfile
# 멀티 스테이지 빌드로 이미지 크기 최소화
# 1단계: 빌드
FROM node:20-alpine AS builder
WORKDIR /app
# 의존성 먼저 설치 (캐시 활용)
COPY package*.json ./
RUN npm ci --only=production
# 소스 코드 복사 및 빌드
COPY . .
RUN npm run build
# 2단계: 실행
FROM node:20-alpine AS runner
WORKDIR /app
# 보안: non-root 사용자 사용
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 appuser
# 빌드 결과물만 복사
COPY --from=builder --chown=appuser:nodejs /app/dist ./dist
COPY --from=builder --chown=appuser:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:nodejs /app/package.json ./
USER appuser
# 환경 변수 설정
ENV NODE_ENV=production
ENV PORT=3000
EXPOSE 3000
# 헬스체크
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
"개발 환경 차이 문제가 계속 발생하는데 Docker로 통일하면 어떨까요? docker-compose로 로컬에서 DB, Redis까지 한 번에 띄울 수 있고, CI에서도 동일한 환경으로 테스트할 수 있습니다."
"Docker 이미지 최적화 경험이 있습니다. 멀티 스테이지 빌드로 빌드 의존성을 제외하고, Alpine 베이스 이미지 사용, layer 순서 최적화로 캐시 히트율을 높여서 이미지 크기를 1.2GB에서 180MB로 줄이고 빌드 시간도 5분에서 1분으로 단축했습니다."
"컨테이너가 OOM Killed 됐네요. docker stats로 확인해보니 메모리 limit이 512MB인데 실제 사용량이 계속 증가하다 죽었습니다. 애플리케이션 메모리 누수 확인하고, 일단 limit을 1GB로 올려서 재배포합시다."
이미지 태그를 latest로 사용하면 언제 어떤 버전이 배포됐는지 추적이 안 됩니다. 반드시 버전 태그(v1.2.3)나 git commit SHA를 사용하세요. CI에서 자동으로 태그를 생성하는 것이 좋습니다.
기본적으로 컨테이너는 root로 실행됩니다. 보안 취약점이 있을 때 호스트까지 영향받을 수 있습니다. Dockerfile에서 USER 지시어로 non-root 사용자를 지정하세요.
.dockerignore로 불필요한 파일 제외, 멀티 스테이지 빌드로 이미지 최소화, HEALTHCHECK로 컨테이너 상태 모니터링, 민감 정보는 환경 변수나 secrets로 주입하세요.