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 pruneDocker 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