도커 기반 실행 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 모노 컨테이너 방식

  • Dockerfile

    FROM python:3.10
    
    WORKDIR /app
    
    COPY . .
    
    RUN pip install -r requirements.txt
    
    CMD bash -c "redis-server & python fastapi_server.py & python worker.py"
    
    • 장점: 구조 단순, 배포 쉬움
    • 단점:
      • 리소스 제한은 컨테이너 전체에만 적용 가능
      • 각 구성요소(FastAPI/Worker/Redis)에 별도 CPU/메모리 제한 불가능
      • 장애 격리 불가, 확장성 없음

2. 멀티 컨테이너 구조

  • 컨테이너 각각 실행

    docker run -d --name redis redis:6.2
    
    docker run -d --name fastapi \
      --cpus="1.0" --memory="1g" \
      -p 8000:8000 \
      my-fastapi-image
    
    docker run -d --name worker \
      --cpus="1.5" --memory="1g" \
      my-worker-image
    
  • 각 컨테이너에 리소스 제한 개별 적용

  • 사용자 정의 브리지 네트워크를 이용함으로써 각각의 컨테이너에서 이름으로 서로 접근 가능하다

    docker network create my-network
    
    docker run -d --name redis --network my-network redis:6.2
    
    docker run -d --name fastapi --network my-network my-fastapi-image
    
    project/
    ├── docker-compose.yml
    ├── fastapi_server/
    │   └── Dockerfile
    ├── worker/
    │   └── Dockerfile
    
  • docker-compose.yaml

    version: "3.9"
    services:
      redis:
        image: redis:6.2
        container_name: redis
        ports:
          - "6379:6379"
    
      fastapi:
        build: ./fastapi_server
        ports:
          - "8000:8000"
        depends_on:
          - redis
    
      worker:
        build: ./worker
        depends_on:
          - redis
        deploy:
          resources:
            limits:
              cpus: '1.5'
              memory: 1g
    
    
  • docker-compose.yaml에서 deploy.resource는 Swarm에서만 유효

  • docker swarm은 컨테이너 오케스트레이션 툴로, 추후 쿠버네티스로의 확장을 고려하는 상황에서 docker swarm을 이용하는 것은 추후 완전히 수정되어야 하는 부분으로 적합하지 않음

image