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 공식 문서