Files
llm/backup_docker_image.md
2025-08-02 17:33:16 +00:00

177 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Создать **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
```
> Архив будет содержать **весь образ**, включая слои, метаданные и зависимости.
> Размер — около 89 ГБ (в зависимости от модели).
---
### 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://<server-ip>: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` захватит всё
- На оффлайн-сервере не нужно копировать модель отдельно
- Но образ будет **очень большим** (~89 ГБ)
---
## ❌ Почему нельзя сделать 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`, и копирует всё на удалённый сервер.