ChatGPT나 Claude 같은 클라우드 AI 서비스는 편리하지만, 사내 기밀이나 개인 데이터를 다룰 때는 외부 서버 전송이 부담스러울 수밖에 없습니다. 매달 결제해야 하는 구독료나 API 토큰 비용도 만만치 않습니다.
최근 오픈소스 경량 언어 모델(sLLM)의 성능이 빠르게 올라오면서, 가정용 PC나 사내 서버에서도 Llama 3.2, DeepSeek-R1, Gemma 2 같은 고성능 모델을 로컬에서 쾌적하게 구동할 수 있게 되었습니다.
Docker Compose를 이용해 모델 실행 엔진인 Ollama와 브라우저 UI를 제공하는 Open WebUI를 하나로 묶어 안정적인 로컬 AI 환경을 구축하는 방법을 정리합니다.
아키텍처 및 구성 방식
로컬 AI 구동 환경은 크게 두 가지 서비스로 분리됩니다:
- Ollama: GGUF 양자화 모델을 메모리에 로드하고 추론을 처리하는 백엔드 엔진
- Open WebUI: 대화 세션 관리, 문서 기반 질의(RAG), 프롬프트 프리셋 등을 지원하는 웹 인터페이스
| 구분 | Ollama 단독 (CLI) | Docker Compose (Ollama + WebUI) | 상용 클라우드 (ChatGPT 등) |
|---|---|---|---|
| 인터페이스 | 터미널 CLI | 모던 웹 인터페이스 | 웹 브라우저 / 모바일 앱 |
| 데이터 프라이버시 | 100% 로컬 격리 | 100% 로컬 격리 | 외부 클라우드 전송 |
| 히스토리 / RAG | 제한적 | 대화 내역 저장 / 문서 질의 지원 | 지원 |
| 운영 비용 | 무료 (하드웨어 전기세) | 무료 (하드웨어 전기세) | 월 구독료 / 토큰당 과금 |
| 구성 난이도 | 낮음 | 보통 (Compose 1회 설정) | 없음 |
Docker Compose 환경 구성
두 컨테이너 간 내부 통신과 데이터 보존을 위해 작업 디렉토리를 생성하고 docker-compose.yml을 작성합니다.
작업 디렉토리 생성
mkdir -p ~/local-ai/{ollama_data,webui_data}
cd ~/local-ai
docker-compose.yml 작성
NVIDIA 그래픽 카드가 설치된 환경이라면 CUDA 가속을 적용하고, CPU만 사용하는 서버라면 deploy 블록을 제외하고 실행하면 됩니다.
version: "3.8"
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama_data:/root/.ollama
environment:
- OLLAMA_KEEP_ALIVE=24h
# NVIDIA GPU 사용 시 활성화 (CPU 전용 환경은 아래 deploy 블록 주석 처리)
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./webui_data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=change-this-to-a-secure-random-string
depends_on:
- ollama
💡 Tip: Ollama는 기본적으로 5분 동안 호출이 없으면 메모리를 확보하기 위해 모델을 언로드합니다. 전용 서버나 홈랩 환경에서는
OLLAMA_KEEP_ALIVE=24h로 설정해 두면 모델이 메모리에 계속 상주하므로 다음 호출 시 초기 지연이 발생하지 않습니다.
컨테이너 실행 및 모델 다운로드
설정 파일 작성이 끝났으면 백그라운드에서 컨테이너를 올립니다.
# 컨테이너 구동
docker compose up -d
# 실행 상태 확인
docker compose ps
추천 모델 다운로드
하드웨어 VRAM과 RAM 용량에 맞는 모델을 선택해 다운로드합니다:
# 범용 경량 모델 (4.7GB, VRAM 8GB 권장)
docker exec -it ollama ollama run llama3.2:latest
# 논리 추론 특화 모델 (4.9GB)
docker exec -it ollama ollama run deepseek-r1:8b
# 코딩 전용 모델
docker exec -it ollama ollama run qwen2.5-coder:7b
다운로드가 완료되면 대화형 프롬프트가 실행됩니다. 간단한 테스트 후 /bye를 입력해 터미널로 돌아옵니다.
Open WebUI 접속 및 보안 설정
웹 브라우저에서 http://<서버-IP>:3000에 접속합니다.
- 최초 접속 시 관리자 계정 생성 화면이 나타나며, 처음 가입한 계정이 최고 관리자 권한을 가집니다.
- 로그인 후 상단 모델 선택 메뉴에서 다운로드한
llama3.2또는deepseek-r1:8b가 목록에 표시되는지 확인합니다.
⚠️ 주의: 외부 인터넷에 포트를 포워딩하거나 사내망에 노출할 경우, Open WebUI 관리자 메뉴(
Settings > Admin Settings > General)에서Allow New Signups(신규 가입 허용) 옵션을 반드시 꺼두어야 합니다. 비인가 사용자가 접속해 GPU와 CPU 자원을 무단 사용하는 상황을 막을 수 있습니다.
자주 발생하는 문제 해결
WebUI에서 Ollama 연결 오류가 발생하는 경우
WebUI could not connect to Ollama 메시지가 나타난다면 컨테이너 간 네트워크 통신 설정을 확인해야 합니다.
OLLAMA_BASE_URL 환경변수가 http://127.0.0.1:11434가 아니라 Docker 내부 서비스 이름인 http://ollama:11434로 지정되어 있는지 점검합니다.
# WebUI 컨테이너 내부에서 Ollama 통신 테스트
docker exec -it open-webui curl -s http://ollama:11434/api/version
NVIDIA 드라이버 인식 오류
could not select device driver with capabilities: [[gpu]] 오류가 발생한다면 호스트 시스템에 nvidia-container-toolkit이 설치되지 않았거나 Docker 런타임에 등록되지 않은 상태입니다.
# Ubuntu/Debian 기준 툴킷 설치 및 런타임 재설정
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
운영 시 확인 사항
컨테이너가 정상 구동되면 docker stats나 nvidia-smi를 통해 모델 추론 시 메모리와 GPU 사용량을 모니터링합니다. 완전히 격리된 로컬 컨테이너 환경이므로 민감한 문서나 사내 코드 분석 작업도 외부 유출 걱정 없이 안전하게 진행할 수 있습니다.
