Как да направим бекъп и възстановяване на Docker контейнер в Proxmox LXC

Наложи ми се да направя бекъп на един Docker контейнер от LXC контейнер в Proxmox, в който имам инсталирани доста (27) контейнера. Реших да споделя как става това, защото стандартните решения не винаги работят, когато искаме да изолираме само един контейнер.
1. Защо е нужен такъв бекъп?
Ако имате много Docker контейнери в един LXC и искате:
- Да мигрирате само един от тях в нов контейнер.
- Да направите бекъп, който може да се възстанови на друг сървър.
- Да изолирате проблемен контейнер без да спирате всички останали.
Стандартните инструменти (docker commit
, docker export
) не запазват всичко, така че ще използваме комбинация от методи.
2. Как да направим бекъп на Docker контейнер
Необходими инструменти
- Proxmox VE (за LXC контейнерите)
- Docker (инсталиран в LXC)
tar
(за архивиране на данни)
Стъпка 1: Създаване на скрип за бекъп
Аз ще пиша точно за моята нужда, как и какво направих. Вие съотвено ще промените , което е нужно според вашите нужди. В случая на мен ми трябваше да копирам, преместя и възстановява umami
.
Да започваме:
Създайте файл backup-umami.sh
в LXC контейнера:
#!/bin/bash
# Настройки
DATE=$(date +%F)
BACKUP_DIR="/root/backup/umami/$DATE"
UMAMI_DIR="/root/dockeri/umami"
VOLUME_DIR="/volume1/docker/umami/db" # Директория с данните
COMPOSE_FILE="$UMAMI_DIR/docker-compose.yml"
CONTAINER_NAME="umami" # Име на контейнера
IMAGE_NAME="umami-backup:$DATE"
# Създаване на директория за бекъп
mkdir -p "$BACKUP_DIR"
echo "⏹️ Спиране на контейнера..."
docker stop "$CONTAINER_NAME"
echo "🗃️ Архивиране на базата данни..."
tar -czf "$BACKUP_DIR/umami-db.tar.gz" -C "$VOLUME_DIR" .
echo "📄 Копиране на docker-compose.yml..."
cp "$COMPOSE_FILE" "$BACKUP_DIR/"
echo "📦 Създаване на Docker образ от контейнера..."
docker commit "$CONTAINER_NAME" "$IMAGE_NAME"
docker save "$IMAGE_NAME" -o "$BACKUP_DIR/umami-image.tar"
echo "▶️ Стартиране на контейнера отново..."
docker start "$CONTAINER_NAME"
echo "✅ Бекъпът е завършен! Файлове в: $BACKUP_DIR"
Стъпка 2: Направете скрипта изпълним
chmod +x backup-umami.sh
Стъпка 3: Стартиране на бекъпа
./backup-umami.sh
Резултат
В /root/backup/umami/<дата>/
ще имате:
umami-image.tar
(Docker образ)umami-db.tar.gz
(данни от volumes)docker-compose.yml
(конфигурация)
Това е цялата философия.
3. Как да възстановим бекъпа в нов LXC контейнер (ID 110)
Предварителни стъпки:
- Инсталиране на Docker в новия LXC контейнер
- Проверка на свободното дисково пространство
Възстановяване на бекъпа:
Копираме архивните файлове и ги разопаковаме.
# От хоста (Proxmox) копираме файловете:
DATE=$(date +%F) # или конкретната дата на бекъпа
pct push 110 /root/backup/umami/$DATE/umami-image.tar /tmp/
pct push 110 /root/backup/umami/$DATE/umami-db.tar.gz /tmp/
pct push 110 /root/backup/umami/$DATE/docker-compose.yml /tmp/
# Проверяваме дали файловете са копирани успешно
pct exec 110 -- ls -la /tmp/umami*
Вътре в LXC контейнер (110) възстановяваме:
# Влизаме в контейнера
pct exec 110 -- bash
# Зареждане на Docker образа
docker load -i /tmp/umami-image.tar
# Създаване на директория за данни
mkdir -p /volume1/docker/umami/db
# Разархивиране на данните
tar -xzf /tmp/umami-db.tar.gz -C /volume1/docker/umami/db/
# Създаване на работна директория и копиране на docker-compose.yml
mkdir -p /root/dockeri/umami
cp /tmp/docker-compose.yml /root/dockeri/umami/
# Стартиране на контейнера
cd /root/dockeri/umami
docker-compose up -d
Финална проверка:
# Проверка дали контейнерът работи
docker ps | grep umami
docker logs umami
# Проверка на портовете
netstat -tlnp | grep :3000 # или който порт използвате
Това е начинът, по който успешно копирах и преместих моя umami контейнер. Методът работи и за други контейнери – просто сменете имената и пътищата според вашите нужди.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut