컨테이너
Container
애플리케이션과 의존성을 패키징하는 경량 가상화 기술. Docker가 대표적. 일관된 실행 환경 제공.
Container
애플리케이션과 의존성을 패키징하는 경량 가상화 기술. Docker가 대표적. 일관된 실행 환경 제공.
컨테이너(Container)는 애플리케이션과 그 실행에 필요한 모든 의존성(라이브러리, 설정 파일, 바이너리)을 하나의 패키지로 묶어 격리된 환경에서 실행하는 기술입니다. 가상머신과 달리 OS 커널을 공유하여 훨씬 가볍고 빠릅니다.
Docker는 2013년 등장하여 컨테이너 기술을 대중화했습니다. 컨테이너 이미지는 애플리케이션의 불변(Immutable) 스냅샷으로, 어디서나 동일하게 실행됩니다. "내 컴퓨터에서는 되는데"라는 문제를 해결합니다.
컨테이너 런타임에는 containerd, CRI-O 등이 있으며, Kubernetes에서 표준 인터페이스(CRI)를 통해 사용됩니다. Docker Desktop은 개발 환경에서, containerd는 프로덕션 환경에서 주로 사용됩니다.
이미지 레이어 시스템은 베이스 이미지 위에 변경사항만 쌓아 효율적인 저장과 배포를 가능하게 합니다. 멀티스테이지 빌드로 빌드 의존성과 런타임을 분리하여 최종 이미지 크기를 최소화할 수 있습니다.
# Dockerfile: 멀티스테이지 빌드 예시
# 빌드 스테이지
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 런타임 스테이지 (최소 이미지)
FROM node:20-alpine AS runner
WORKDIR /app
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
USER appuser
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "dist/index.js"]
---
# docker-compose.yml: 멀티 컨테이너 구성
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://db:5432/mydb
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:
DevOps: "이미지 빌드 시간이 너무 길어요. 레이어 캐싱 활용하게 Dockerfile 순서 좀 바꿔주세요."
개발: "어떤 순서로 하면 되나요?"
DevOps: "변경 빈도 낮은 거 먼저요. package.json 복사 후 npm install, 그다음 소스 코드 복사. 소스만 바뀌면 npm install 캐시 활용돼요."
면접관: "컨테이너와 가상머신의 차이점을 설명해주세요."
지원자: "VM은 하이퍼바이저 위에 각각 게스트 OS를 실행하지만, 컨테이너는 호스트 OS 커널을 공유합니다. 그래서 컨테이너는 수십 MB 크기에 수초 만에 시작되고, VM은 수 GB에 수분이 걸립니다. 컨테이너는 프로세스 격리, VM은 하드웨어 격리를 제공합니다."
리뷰어: "Dockerfile에서 root로 실행하고 있네요. 보안상 non-root 유저 만들어서 실행하세요."
작성자: "USER 지시어로 권한 낮추겠습니다. UID 1000번대로 설정할게요."