Гайды

Ollama в Docker: когда контейнер помогает а когда мешает

Главная практическая боль — проброс видеокарты в контейнер. Готовый фрагмент compose с GPU, таблица оправданности по платформам и честный вывод про Windows и macOS.

Контейнер даёт воспроизводимость, изоляцию и удобство обновления. Всё это правда — и всё это разбивается об один вопрос: увидит ли контейнер вашу видеокарту.

Для Linux с картой NVIDIA ответ «да, после установки одного пакета». Для Windows — «да, если Docker работает через WSL2». Для macOS — «нет, и обойти это нельзя»: проброса графического ускорителя Apple в контейнеры не существует, модель в контейнере на Mac будет считаться процессором.

Поэтому решение принимается не по принципу «контейнеры — это правильно», а по платформе и сценарию.

#Что понадобится

  • Установленный Docker. На Linux — движок и, для NVIDIA, контейнерный тулкит. На Windows — Docker Desktop с бэкендом WSL2.
  • Драйвер видеокарты на хосте. Внутрь контейнера драйвер не ставится: контейнер использует хостовый.
  • Место под тома. Модели весят гигабайты, и хранить их надо в именованном томе, а не внутри контейнера.

#Шаг 1. Установить проброс GPU (NVIDIA, Linux)

Контейнерный тулкит NVIDIA ставится из репозитория производителя; конкретные команды зависят от дистрибутива и меняются между версиями — сверяйтесь с официальной инструкцией, не с копией из статьи. После установки настраивается среда выполнения и перезапускается демон Docker.

Проверка, что проброс работает:

docker run --rm --gpus=all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

Если внутри контейнера вывелась таблица с вашей картой — всё готово. Если нет, дальше идти бессмысленно: Ollama в контейнере тоже её не увидит.

#Шаг 2. Запустить одной командой

docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

Разбор: --gpus=all пробрасывает видеокарты, -v ollama:/root/.ollama создаёт именованный том под модели (без него скачанные веса пропадут при пересоздании контейнера), -p 11434:11434 открывает порт наружу.

Команды выполняются внутри контейнера:

docker exec -it ollama ollama pull qwen2.5:7b
docker exec -it ollama ollama ps

#Шаг 3. Оформить как compose

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ollama:/root/.ollama
    environment:
      - OLLAMA_KEEP_ALIVE=2h
      - OLLAMA_FLASH_ATTENTION=1
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

volumes:
  ollama:

Секция deploy.resources.reservations.devices — это и есть проброс видеокарты в синтаксисе compose. Она выглядит громоздко и легко теряется при копировании — именно её отсутствие объясняет большинство случаев «в контейнере всё медленно».

Для карт AMD образ другой (вариант с суффиксом rocm), а вместо секции с драйвером nvidia пробрасываются устройства:

    devices:
      - /dev/kfd
      - /dev/dri

Общие принципы упаковки таких сервисов разобраны в материале о Docker для ИИ-приложений, а связка нескольких сервисов в одном файле — в гайде по docker-compose для Persona.

#Шаг 4. Решить, нужен ли вам контейнер вообще

Сценарий Контейнер оправдан
Linux-сервер с NVIDIA, рядом другие сервисы ✓ явно
Воспроизводимое окружение, несколько машин ✓
Windows с WSL2 и картой NVIDIA скорее нет: нативная установка проще
Windows без WSL2 ✗ карта не пробросится
macOS на Apple Silicon ✗ ускоритель не пробрасывается вовсе
AMD на Linux ✓ с оговорками по версиям ROCm
Домашний ПК, одна модель, один пользователь ✗ лишний слой без выгоды

Что здесь смотреть: строки с ✗ — это не «сложно», а «не работает как задумано». На Mac контейнер запустится и будет отвечать, просто впятеро медленнее, чем нативная установка, и без единого сообщения об ошибке. Это худший вид проблемы — та, которая не выглядит как проблема.

Практический вывод: контейнер оправдан там, где Ollama — один из нескольких сервисов на общем сервере. Для одиночной установки на личной машине он добавляет слой без выгоды. Обычный маршрут установки — в гайде по запуску моделей через Ollama.

#Проверка результата

Проверка первая: карта видна изнутри.

docker exec -it ollama nvidia-smi

Проверка вторая: модель считается на видеокарте.

docker exec -it ollama ollama ps

Колонка PROCESSOR должна показывать 100% GPU. Это единственная проверка, которая ловит молчаливый откат на процессор.

Проверка третья: модели переживают пересоздание контейнера.

docker compose down && docker compose up -d && docker exec -it ollama ollama list

Список должен остаться прежним. Если он пуст — том не подключён, и вы только что потеряли скачанные веса.

#Что может пойти не так

Контейнер работает, но медленно. В девяти случаях из десяти — не пробросилась видеокарта. Проверьте nvidia-smi внутри контейнера, а не снаружи.

could not select device driver "nvidia". Контейнерный тулкит не установлен или демон Docker не перезапущен после его настройки.

Модели скачиваются заново после каждого перезапуска. Не подключён именованный том, данные лежали внутри контейнера и удалились вместе с ним.

Порт недоступен с других машин. Публикация порта в Docker и настройка прослушивания в самой Ollama — разные вещи. Внутри контейнера сервис должен слушать на всех интерфейсах, а порт — быть опубликован. Отдельно помните, что у Ollama нет авторизации: открытый наружу порт означает открытый доступ. Как это защищать — в материале о настройке доступа к Ollama по сети.

На Windows контейнер не видит карту. Docker Desktop должен работать через WSL2. С бэкендом Hyper-V проброс не поддерживается.

Не хватает места на диске. Том с моделями растёт незаметно. Проверяйте docker system df — образы и тома учитываются отдельно.

Ошибка выглядит так же, как вне контейнера. Значительная часть сообщений не связана с Docker вовсе: нехватка памяти, неподдерживаемая архитектура модели, сломанный шаблон чата. Разбор по текстам сообщений — в справочнике по ошибкам Ollama.

#Частые вопросы

#Работает ли Ollama в Docker на Mac с ускорением?

Нет. Проброса графического ускорителя Apple Silicon в контейнеры не существует, и модель будет считаться процессором. На Mac ставьте Ollama нативно — это не компромисс, а единственный рабочий вариант.

#Нужен ли контейнер, если Ollama — единственный сервис на машине?

Обычно нет. Выгода контейнера в изоляции и воспроизводимости проявляется, когда сервисов несколько или когда окружение нужно повторить на другой машине. Для одиночной установки это лишний слой.

#Теряет ли контейнер в производительности?

При корректно пробросённой видеокарте — практически нет, разница в пределах погрешности. Все заметные потери в скорости объясняются тем, что проброс не сработал, а не самим контейнером.

#Где хранятся модели при работе в контейнере?

В подключённом томе, по умолчанию по пути /root/.ollama внутри контейнера. Именно поэтому том обязателен: без него веса живут внутри контейнера и исчезают вместе с ним.

#Можно ли подключиться к контейнерной Ollama из другого контейнера?

Да, по имени сервиса внутри общей сети compose — обращение идёт на http://ollama:11434. Публиковать порт наружу для этого не требуется, и не публиковать безопаснее.

#Как обновить Ollama в контейнере?

Скачать свежий образ и пересоздать контейнер. Модели при этом сохранятся, если они лежат в именованном томе. Это как раз тот случай, где контейнер удобнее нативной установки.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт