Module 4: Ollama - Introduction

Ollama Docker Deployment

Overview

You'll learn to run Ollama in a Docker container for deployment on servers.

Time: 40 minutes
Difficulty: Medium-High


🎯 Objectives

  • ✅ Run Ollama in Docker
  • ✅ Persistent storage (models)
  • ✅ Docker Compose setup
  • ✅ Network configuration

📦 Prerequisite: Docker

Install Docker:

macOS/Windows:

Linux:

curl -fsSL https://get.docker.com | sh

Verify:

docker --version

🚀 Run Ollama in Docker

Method 1: Docker run (simple):

docker run -d \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

Explanation:

  • -d: Background
  • -v ollama:/root/.ollama: Persistent storage (models)
  • -p 11434:11434: Exposes the port
  • --name ollama: Container name

Pull a model inside the container:

docker exec -it ollama ollama pull mistral

Test the API:

curl http://localhost:11434/api/tags

🐳 Method 2: Docker Compose (recommended)

docker-compose.yml:

version: '3.8'

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    restart: unless-stopped
    environment:
      - OLLAMA_HOST=0.0.0.0

volumes:
  ollama_data:

Start:

docker-compose up -d

Stop:

docker-compose down

Logs:

docker-compose logs -f ollama

🖥️ With GPU (NVIDIA)

Dockerfile with CUDA:

version: '3.8'

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    restart: unless-stopped
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

volumes:
  ollama_data:

Prerequisite: NVIDIA Container Toolkit


📦 Complete Stack: Ollama + App

docker-compose.yml (Ollama + Python app):

version: '3.8'

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    restart: unless-stopped

  chatbot:
    build: .
    container_name: chatbot
    depends_on:
      - ollama
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    ports:
      - "8000:8000"

volumes:
  ollama_data:

Dockerfile (Python app):

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY chatbot.py .

CMD ["python", "chatbot.py"]

requirements.txt:

openai==1.12.0

chatbot.py:

from openai import OpenAI
import os

client = OpenAI(
    base_url=os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") + "/v1",
    api_key="ollama"
)

# Your chatbot code here

Start the stack:

docker-compose up -d

🔧 Management Commands

Pull a model:

docker exec ollama ollama pull mistral

List models:

docker exec ollama ollama list

Logs:

docker logs ollama -f

Restart:

docker restart ollama

Interactive exec:

docker exec -it ollama bash

📊 Production Best Practices

1. Health checks:

services:
  ollama:
    # ... config ...
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
      interval: 30s
      timeout: 10s
      retries: 3

2. Resource limits:

services:
  ollama:
    # ... config ...
    deploy:
      resources:
        limits:
          memory: 16G
          cpus: '4'

3. Logging:

services:
  ollama:
    # ... config ...
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

🐛 Troubleshooting

Error: Cannot connect

# Check that the container is running
docker ps

# Check the logs
docker logs ollama

Error: Out of memory

# Increase the memory limit
docker update --memory 16g ollama

✅ Summary

  • Ollama in Docker: Production-ready
  • Persistent storage with volumes
  • Docker Compose: Multi-container
  • GPU support (optional)
  • Health checks and resource limits

Next: 07-performance-tuning.md

You'll optimize Ollama's performance (GPU, RAM, quantization).

Time: 20 min