Docker: 컨테이너화로 배포 간단하게

개발팀
2분 읽기
DockerDevOps배포

Docker: 컨테이너화로 배포 간단하게

Docker는 애플리케이션과 그 환경을 함께 패킹하여 어디서든 실행할 수 있게 해줍니다.

Dockerfile 작성

# Node.js 애플리케이션 예제
FROM node:18-alpine

WORKDIR /app

# 의존성 설치
COPY package*.json ./
RUN npm ci --only=production

# 애플리케이션 코드
COPY . .

# 포트 노출
EXPOSE 3000

# 헬스 체크
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s \
  CMD node healthcheck.js

# 시작 명령어
CMD ["npm", "start"]

이미지 빌드 및 실행

# 이미지 빌드
docker build -t my-app:1.0 .

# 컨테이너 실행
docker run -p 3000:3000 -e NODE_ENV=production my-app:1.0

# 백그라운드 실행
docker run -d -p 3000:3000 --name my-app-container my-app:1.0

Docker Compose

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://postgres:password@db:5432/mydb
    depends_on:
      - db
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

유용한 Docker 명령어

# 이미지 목록 확인
docker images

# 실행 중인 컨테이너 확인
docker ps

# 모든 컨테이너 확인
docker ps -a

# 컨테이너 로그 확인
docker logs <container-id>

# 컨테이너 멈추기
docker stop <container-id>

# 컨테이너 제거
docker rm <container-id>

# 이미지 제거
docker rmi <image-id>

멀티 스테이지 빌드

# 빌드 단계
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 실행 단계
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
CMD ["npm", "start"]

이미지 최적화

  1. 작은 베이스 이미지: alpine 버전 사용
  2. 불필요한 파일 제외: .dockerignore 파일 사용
  3. 레이어 최소화: 관련 명령어 병합
  4. 캐싱 활용: 변경 빈도가 낮은 명령어를 먼저 실행
# .dockerignore 파일
node_modules
.git
.env
.DS_Store
dist

보안 고려사항

# 루트 사용자 제거
RUN useradd -m appuser
USER appuser

# 읽기 전용 파일 시스템
RUN chmod -R a-w /app

배포 및 오케스트레이션

# Docker Hub에 푸시
docker tag my-app:1.0 username/my-app:1.0
docker push username/my-app:1.0

# Kubernetes로 배포
kubectl apply -f deployment.yaml

Docker를 효과적으로 사용하면 배포 과정이 훨씬 간단해집니다.

Docker: 컨테이너화로 배포 간단하게 | 블로그