177 lines
6.3 KiB
Markdown
177 lines
6.3 KiB
Markdown
Создать **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://<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` захватит всё
|
||
- На оффлайн-сервере не нужно копировать модель отдельно
|
||
- Но образ будет **очень большим** (~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`, и копирует всё на удалённый сервер. |