2 분 소요

컨테이너 기술은 현대 애플리케이션 배포의 표준이 되었습니다. Docker를 효율적으로 운영하기 위해서는 단순히 컨테이너를 실행하는 것을 넘어, 체계적인 관리와 모니터링이 필요합니다.

컨테이너 생명주기 관리

컨테이너 실행과 종료

# 백그라운드에서 컨테이너 실행
docker run -d --name myapp -p 8080:80 nginx

# 컨테이너 재시작 정책 설정
docker run -d --restart unless-stopped myapp

# 모든 중지된 컨테이너 제거
docker container prune

컨테이너 관리

Docker 컨테이너 관리 개요

리소스 제한 설정

# CPU와 메모리 제한
docker run -d \
  --memory="512m" \
  --memory-swap="1g" \
  --cpus="1.5" \
  --name limited-app nginx

# 디스크 I/O 제한
docker run -d \
  --device-read-bps /dev/sda:1mb \
  --device-write-bps /dev/sda:1mb \
  redis

데이터 영속성 관리

볼륨 관리

# 명명된 볼륨 생성
docker volume create app-data

# 볼륨 목록 확인
docker volume ls

# 사용되지 않는 볼륨 정리
docker volume prune

# 볼륨 상세 정보
docker volume inspect app-data

바인드 마운트 vs 볼륨

# 바인드 마운트 (개발 환경)
docker run -d \
  -v $(pwd)/src:/app \
  -v $(pwd)/config:/etc/app \
  myapp:dev

# 볼륨 마운트 (운영 환경)
docker run -d \
  -v app-data:/data \
  -v app-logs:/var/log \
  myapp:prod

네트워크 관리

사용자 정의 네트워크

# 브리지 네트워크 생성
docker network create --driver bridge app-network

# 여러 컨테이너를 동일 네트워크에 연결
docker run -d --name db --network app-network mysql
docker run -d --name api --network app-network --link db:mysql myapi

# 네트워크 상세 정보
docker network inspect app-network

이미지 관리 전략

이미지 최적화

# 사용하지 않는 이미지 확인
docker images -f "dangling=true"

# 미사용 이미지 제거
docker image prune -a

# 이미지 히스토리 확인
docker history myapp:latest

# 이미지 크기 분석
docker images --format "table \t\t"

레지스트리 관리

# 이미지 태그 및 푸시
docker tag myapp:latest registry.example.com/myapp:v1.0
docker push registry.example.com/myapp:v1.0

# 프라이빗 레지스트리 로그인
docker login registry.example.com

로그 및 모니터링

컨테이너 로그 관리

# 실시간 로그 확인
docker logs -f --tail 100 myapp

# 특정 시간 범위의 로그
docker logs --since 1h --until 5m myapp

# 로그 드라이버 설정
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp

리소스 모니터링

# 실행 중인 컨테이너 통계
docker stats --all --format "table \t\t"

# 상세 이벤트 모니터링
docker events --filter event=start --filter event=stop

보안 설정

보안 옵션

# 루트가 아닌 사용자로 실행
docker run -d --user 1000:1000 myapp

# 읽기 전용 파일시스템
docker run -d --read-only --tmpfs /tmp --tmpfs /var/run myapp

# 커널 기능 제한
docker run -d --cap-drop ALL --cap-add NET_BIND_SERVICE myapp

# 보안 프로필 적용
docker run -d --security-opt seccomp=default.json myapp

Docker Compose 운영

프로덕션 설정

version: '3.8'
services:
  web:
    image: nginx:alpine
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 256M
    restart: unless-stopped
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  db:
    image: postgres:14-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password

volumes:
  pgdata:

secrets:
  db_password:
    external: true

효율적인 Docker 컨테이너 관리는 애플리케이션의 안정성과 보안을 위해 필수적입니다. 리소스 제한, 데이터 영속성, 네트워크 격리, 로그 관리 등의 모범 사례를 적용하여 운영 환경에서 컨테이너를 안전하게 관리하세요.

댓글남기기