환경 선택 기준 #
| 환경 | 적합한 목적 | 장점 | 주의점 |
|---|---|---|---|
| Docker 단일 노드 | 학습, 기능 실습, RAG 프로토타입 | 설치가 빠르고 재현성이 높음 | 운영 클러스터의 shard, replica, 장애 복구 특성을 충분히 검증하기 어려움 |
| Docker Compose 다중 컨테이너 | Dashboards, 보안 플러그인, 네트워크 구성을 함께 실습 | OpenSearch와 Dashboards를 한 번에 구성 가능 | 리소스 사용량이 증가함 |
| 직접 설치 | OS 서비스 구성, systemd, 파일 경로, JVM 설정 학습 | 서버 운영 방식과 가까움 | 초기 설정과 제거가 번거로움 |
| Amazon OpenSearch Service | 관리형 운영, IAM 인증, VPC, 프로덕션 연결 | 인프라 운영 부담이 줄어듦 | 로컬 OpenSearch와 인증/네트워크/권한 모델이 다름 |
개발 환경 판단 기준 #
RAG 실습 초기에는 Docker 단일 노드가 가장 효율적입니다.
그러나 운영 RAG 서비스에서는 단일 노드 기준으로 설계하면 안 됩니다.
해당 wiki에서는 Dashboard 활용을 위해서 Docker compose 방법을 사용합니다.
운영에서는 장애 복구, replica, shard allocation, snapshot, index lifecycle, 인증, 권한 분리, TLS, VPC 또는 private network 접근 제어를 함께 고려해야 합니다.
사전 준비 #
- Docker Desktop 또는 Docker Engine
- Docker Compose
- Python 3.12 이상
- 터미널 또는 IDE
- 충분한 메모리. OpenSearch는 JVM 기반이므로 로컬 환경에서 메모리 부족이 자주 발생합니다.
디렉터리 구조 #
opensearch-rag-lab/
docker-compose.yml
.env
Docker Compose 예시 #
아래 구성은 학습용 단일 노드 OpenSearch와 Dashboards를 함께 실행하는 예시입니다. 운영 설정이 아니라 로컬 개발용입니다.
services:
opensearch-node1:
build:
context: .
dockerfile: Dockerfile.opensearch
image: opensearch-nori:latest
container_name: opensearch-node1
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- type: bind
source: C:\\Users\\user\\Documents\\volume\\opensearch
target: /usr/share/opensearch/data
ports:
- "9200:9200"
- "9600:9600"
networks:
- opensearch-net
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:latest
container_name: opensearch-dashboards
ports:
- "5601:5601"
environment:
OPENSEARCH_HOSTS: '["<https://opensearch-node1:9200>"]'
depends_on:
- opensearch-node1
networks:
- opensearch-net
networks:
opensearch-net:
.env 예시
OPENSEARCH_INITIAL_ADMIN_PASSWORD='set your admin password'실행
docker compose up -d상태 확인
docker compose ps
curl -k -u admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD} <https://localhost:9200>정상적으로 실행되면 cluster name, version, tagline 등이 포함된 JSON 응답을 확인할 수 있습니다.