diff --git a/backup_docker_image.md b/backup_docker_image.md new file mode 100644 index 0000000..a47a982 --- /dev/null +++ b/backup_docker_image.md @@ -0,0 +1,177 @@ +Создать **ISO-образ** напрямую из Docker-контейнера — **невозможно**, потому что **ISO** — это образ оптического диска (например, для загрузки ОС), а Docker использует **собственный формат образов**, основанный на слоях файловой системы. + +Однако, вы можете **экспортировать Docker-образ в архив (tar)**, который затем можно перенести на **оффлайн-сервер** и загрузить локально. Это стандартный и рекомендуемый способ развертывания Docker-образов без интернета. + +--- + +### ✅ Цель: развернуть ваш `llm-chat` на сервере **без интернета** + +### 🔧 Решение: экспортировать Docker-образ как `.tar`, перенести его, импортировать + +--- + +## 🛠 Шаги: создание и перенос образа + +### 1. Соберите образ (на машине с интернетом) + +```bash +docker compose build llm-chat +``` + +> Это создаст образ с именем, например: `llm-chat-llm-chat` (зависит от папки). +> Вы можете задать имя явно в `docker-compose.yml`: + +```yaml +services: + llm-chat: + image: qwen3-8b-awq-offline:latest # ← добавьте это + build: + context: . + dockerfile: Dockerfile + # ... остальное +``` + +Тогда образ будет называться `qwen3-8b-awq-offline:latest`. + +--- + +### 2. Убедитесь, что образ собран + +```bash +docker images | grep qwen3 +``` + +Пример вывода: +``` +qwen3-8b-awq-offline latest a1b2c3d4e5f6 5 minutes ago 8.2GB +``` + +--- + +### 3. Сохраните образ в `.tar` архив + +```bash +docker save qwen3-8b-awq-offline:latest -o qwen3-8b-awq-offline.tar +``` + +> Архив будет содержать **весь образ**, включая слои, метаданные и зависимости. +> Размер — около 8–9 ГБ (в зависимости от модели). + +--- + +### 4. Скопируйте архив на оффлайн-сервер + +Например, через USB, внешний диск или `scp`: + +```bash +scp qwen3-8b-awq-offline.tar user@offline-server:/tmp/ +``` + +--- + +### 5. На оффлайн-сервере: загрузите образ + +```bash +docker load -i /tmp/qwen3-8b-awq-offline.tar +``` + +Проверьте: + +```bash +docker images | grep qwen3 +``` + +--- + +### 6. Настройте `docker-compose.yml` на оффлайн-сервере + +Убедитесь, что на оффлайн-сервере: +- Установлен **Docker** и **Docker Compose** +- Установлен **NVIDIA Container Toolkit** (для GPU) +- Драйвера NVIDIA работают (`nvidia-smi`) + +Разместите: +- `docker-compose.yml` +- `qwen3-8b-awq-offline.tar` → загружен через `docker load` +- Папку `models/` с моделью `Qwen3-8B-AWQ` (она **не входит в образ**, если вы монтируете её как volume!) +- Папки `app`, `cache` и т.д. + +> ⚠️ **ВАЖНО**: Модель (`./models/Qwen3-8B-AWQ`) **не включена в Docker-образ**, потому что вы её монтируете через volume. +> Значит, вы **должны вручную скопировать папку `models`** на оффлайн-сервер. + +--- + +### 7. Запустите + +```bash +docker compose up -d +``` + +Готово! Сервис будет доступен на `http://:8080`. + +--- + +## 📦 Альтернатива: встроить модель в образ (рекомендуется для полной автономности) + +Если вы хотите, чтобы **всё было в одном образе**, включая модель — измените `Dockerfile`: + +### Обновите `Dockerfile`: + +```dockerfile +# ... предыдущие шаги ... + +# Копируем модель внутрь образа +COPY models/Qwen3-8B-AWQ /models/Qwen3-8B-AWQ + +ENV MODEL_PATH=/models/Qwen3-8B-AWQ +``` + +И уберите `volumes:` для `/models` в `docker-compose.yml`: + +```yaml +volumes: + # - ./models:/models ← УДАЛИТЬ эту строку! + - ./app:/app + # ... +``` + +Тогда: +- Модель будет **внутри образа** +- `docker save` захватит всё +- На оффлайн-сервере не нужно копировать модель отдельно +- Но образ будет **очень большим** (~8–9 ГБ) + +--- + +## ❌ Почему нельзя сделать ISO? + +- ISO — это образ диска, обычно для загрузки ОС +- Docker работает с **контейнерами**, а не виртуальными машинами +- Чтобы использовать ISO, нужно делать **виртуальную машину с Docker внутри** + +Если вам **обязательно нужен ISO**, то: + +### Вариант: создать VM с предустановленным Docker и образом + +1. Создайте виртуальную машину (например, в VirtualBox) +2. Установите Ubuntu + Docker + NVIDIA драйверы +3. Загрузите туда Docker-образ и `docker-compose.yml` +4. Экспортируйте VM как `.iso` или `.ova` + +Но это **тяжеловесно и неэффективно** по сравнению с простым `.tar` + Docker. + +--- + +## ✅ Рекомендуемый итоговый workflow + +| Этап | Команда | +|------|--------| +| Сборка | `docker compose build` | +| Сохранение | `docker save qwen3-8b-awq-offline:latest -o qwen3.tar` | +| Перенос | `scp qwen3.tar user@offline:/tmp` | +| На оффлайн | `docker load -i /tmp/qwen3.tar` | +| Запуск | `docker compose up -d` | + +--- + +Если хотите, могу подготовить **автоматический скрипт**, который делает `build`, `save`, и копирует всё на удалённый сервер. \ No newline at end of file