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

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

Наложи ми се да направя бекъп на един Docker контейнер от LXC контейнер в Proxmox, в който имам инсталирани доста (27) контейнера. Реших да споделя как става това, защото стандартните решения не винаги работят, когато искаме да изолираме само един контейнер.

1. Защо е нужен такъв бекъп?

Ако имате много Docker контейнери в един LXC и искате:

  • Да мигрирате само един от тях в нов контейнер.
  • Да направите бекъп, който може да се възстанови на друг сървър.
  • Да изолирате проблемен контейнер без да спирате всички останали.

Стандартните инструменти (docker commitdocker 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)

Предварителни стъпки:

  1. Инсталиране на Docker в новия LXC контейнер
  2. Проверка на свободното дисково пространство

Възстановяване на бекъпа:

Копираме архивните файлове и ги разопаковаме.
# От хоста (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 контейнер. Методът работи и за други контейнери – просто сменете имената и пътищата според вашите нужди.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: