Tan Kim

Docker

컨테이너 기반 가상화 플랫폼. 애플리케이션과 의존성을 컨테이너로 패키징해 어디서든 동일하게 실행한다.

핵심 개념

개념 설명
Image 컨테이너 실행을 위한 읽기 전용 템플릿
Container 이미지의 실행 인스턴스
Dockerfile 이미지 빌드 명세 파일
Registry 이미지 저장소 (Docker Hub, ECR 등)
Volume 컨테이너 외부에 데이터 영속화
Network 컨테이너 간 통신

Dockerfile

FROM node:20-alpine
 
WORKDIR /app
 
# 의존성 먼저 복사 (레이어 캐시 활용)
COPY package*.json ./
RUN npm ci --only=production
 
COPY . .
 
RUN npm run build
 
EXPOSE 3000
 
CMD ["node", "dist/index.js"]

자주 쓰는 명령어

# 이미지
docker build -t myapp:1.0 .
docker images
docker pull nginx
docker push myapp:1.0
docker rmi myapp:1.0
 
# 컨테이너 실행
docker run -d -p 3000:3000 --name myapp myapp:1.0
docker run -it ubuntu bash           # 인터랙티브
docker run --rm myapp:1.0            # 종료 시 자동 삭제
docker run -e NODE_ENV=prod myapp    # 환경 변수
docker run -v ./data:/app/data myapp # 볼륨 마운트
 
# 컨테이너 관리
docker ps               # 실행 중인 컨테이너
docker ps -a            # 전체 컨테이너
docker stop myapp
docker start myapp
docker restart myapp
docker logs myapp -f    # 로그 실시간 확인
docker exec -it myapp bash  # 컨테이너 접속
docker inspect myapp    # 상세 정보
 
# 정리
docker system prune     # 미사용 리소스 삭제
docker volume prune

Docker Compose

여러 컨테이너를 함께 정의하고 실행.

# docker-compose.yml
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=mysql://root:1234@db:3306/mydb
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
 
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"
 
volumes:
  db-data:
docker compose up -d       # 백그라운드 실행
docker compose down        # 종료 + 컨테이너 삭제
docker compose down -v     # 볼륨도 삭제
docker compose logs -f     # 로그
docker compose ps
docker compose exec app bash

멀티 스테이지 빌드

이미지 크기 최소화.

# 빌드 스테이지
FROM node:20 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
 
# 실행 스테이지 (빌드 결과물만 복사)
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

.dockerignore

node_modules
.git
.env
*.log
dist

메모