Docker

Docker

기본 Docker 컨테이너에서 Hayhooks를 사용한 복잡한 애플리케이션까지, Docker를 통해 Haystack 파이프라인을 배포하는 방법을 배워요.

출처: 문서

본문

Running Haystack in Docker

가장 기본적인 Haystack 배포 형태는 Docker 컨테이너를 통한 것이에요. Haystack Docker 이미지 실행·커스터마이징에 익숙해지는 것은 더 고급 배포의 기반이 되므로 유용합니다.

Haystack 릴리스는 공식적으로 deepset/haystack Docker 이미지로 배포됩니다. Haystack 이미지는 포함하는 컴포넌트와 Haystack 버전에 따라 여러 flavor로 제공돼요.

참고: 현재 Haystack에서 사용 가능한 flavor는 base 하나뿐이며, 로컬에서 pip install haystack-ai로 설치했을 때 얻는 것과 정확히 같은 구성을 담고 있어요.

Docker 태그로 특정 Haystack flavor를 pull할 수 있습니다. 예를 들어 Haystack 3.0.0을 담은 이미지를 pull하려면:

docker pull deepset/haystack:base-v3.0.0

base flavor는 커스터마이즈용으로 만들어졌지만, Python 환경과 의존성을 설정하지 않고 로컬에서 Haystack 스크립트를 빠르게 실행하는 데도 사용할 수 있어요. 예를 들어 Docker 컨테이너를 실행해 Haystack 버전을 출력하는 방법입니다:

docker run -it --rm deepset/haystack:base-v3.0.0 python -c"from haystack.version import __version__; print(__version__)"

Customizing the Haystack Docker Image

애플리케이션은 단순 스크립트보다 복잡할 가능성이 높고, Haystack과 함께 Docker 이미지 안에 추가 의존성을 설치해야 할 것입니다.

예를 들어 Docker 컨테이너로 Chroma를 Document Store로 쓰는 간단한 인덱싱 파이프라인을 실행하고 싶다고 해보죠. base 이미지에는 Haystack 기본 설치만 들어 있으므로, Chroma 통합(chroma-haystack) 패키지를 추가로 설치해야 합니다. 추가 의존성을 담은 커스텀 Docker 이미지를 만드는 것이 가장 좋은 방법이에요.

현재 폴더에 main.py 스크립트가 있다고 가정하면 Dockerfile은 이렇게 생겼어요:

FROM deepset/haystack:base-v3.0.0

RUN pip install chroma-haystack

COPY ./main.py /usr/src/myapp/main.py

ENTRYPOINT ["python", "/usr/src/myapp/main.py"]

그 다음 커스텀 Haystack 이미지를 만들 수 있습니다:

docker build . -t my-haystack-image

Complex Application with Docker Compose

Docker에서 실행되는 Haystack 애플리케이션은 꽤 멀리 갈 수 있어요. 인터넷 연결만 있으면 컨테이너가 벡터 데이터베이스, 추론 엔드포인트, 관측성 기능을 제공하는 외부 서비스에 도달할 수 있습니다.

하지만 비용 절감이나 성능 향상 등을 위해 Haystack 컨테이너용 추가 서비스를 로컬에서 오케스트레이션하고 싶을 수도 있어요. 애플리케이션 런타임이 둘 이상의 Docker 컨테이너에 의존한다면, Docker Compose가 모든 것을 함께 유지하는 훌륭한 도구입니다.

예를 들어 애플리케이션이 두 파이프라인을 감싼다고 해보죠. 하나는 문서를 Qdrant 인스턴스에 인덱싱하고, 다른 하나는 나중에 그 문서를 쿼리합니다. 이 설정에는 두 개의 Docker 컨테이너가 필요해요. 하나는 Hayhooks를 사용해 파이프라인을 REST API로 실행하고, 다른 하나는 Qdrant 인스턴스를 실행합니다. Docker Compose에서 Hayhooks 구성에 대한 자세한 내용은 공식 Hayhooks 문서를 참고하세요.

Hayhooks 이미지를 만들기 위해 최신 Hayhooks 버전 중 하나의 base 이미지를 쉽게 커스터마이즈해 QdrantDocumentStore가 필요로 하는 의존성을 추가할 수 있습니다. Dockerfile은 이렇게 생겼어요:

FROM deepset/hayhooks:v1.23.0

RUN pip install qdrant-haystack sentence-transformers-haystack

CMD ["hayhooks", "run", "--host", "0.0.0.0"]

Qdrant는 커스터마이즈할 필요가 없으므로 공식 Docker 이미지가 그대로 잘 작동할 거예요. docker-compose.yml 파일은 이렇게 생겼어요:

services:
  qdrant:
    image: qdrant/qdrant:latest
    restart: always
    container_name: qdrant
    ports:
      - 6333:6333
      - 6334:6334
    expose:
      - 6333
      - 6334
      - 6335
    configs:
      - source: qdrant_config
        target: /qdrant/config/production.yaml
    volumes:
      - ./qdrant_data:/qdrant_data

  hayhooks:
    build: . # Build from local Dockerfile
    container_name: hayhooks
    ports:
      - "1416:1416"
    volumes:
      - ./pipelines:/pipelines
    environment:
      - HAYHOOKS_PIPELINES_DIR=/pipelines
      - LOG=DEBUG
    depends_on:
      - qdrant

configs:
  qdrant_config:
    content: |
      log_level: INFO

Docker Compose 배포의 실제 동작 예시는 GitHub의 "RAG indexing and querying with Elasticsearch" 예제를 확인해 보세요.

더 알아보기 (Learn more)

  • Docker — Haystack 공식 문서