add backup instruction
This commit is contained in:
177
backup_docker_image.md
Normal file
177
backup_docker_image.md
Normal file
@@ -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://<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`, и копирует всё на удалённый сервер.
|
||||
Reference in New Issue
Block a user