Pomoc Automatyczny backup kontenerów

goruss

System Engineer
Q Specialist
20 Październik 2020
114
7
18
24
QNAP
null
Ethernet
null
Witam,
W jaki sposób zautomatyzować proces backupu kontenerów, tak aby można było je szybko przywrócić poprzez import kilkoma kliknięciami w container station?
Dotychczas miałem ustawioną synchronizację całego katalogu /Container, ale to poza samymi plikami niewiele mi dawało i w przypadku problemów musiałem kontener przywracać ręcznie.
Zależy mi na jakimś skrypcie, który cyklicznie robiłby backup kontenerów.
Mogę liczyć na pomoc?
 
zależy od kontenera ?
docker inspect -f '{{ json .Mounts }}' emby_server | jq | grep Source gdzie emby_server jest nazwą kontenera

1678877877001.png


i wtedy wiesz że kontener emby_server do pracy używa 5 mountów:
"Source": "/var/lib/docker/volumes/emby_config/_data", <- to jest wolumen (prowadzi do folderu z container station)
"Source": "/share/_DATA/DATA2/Marek/Zdjęcia", <- to jest bind (prowadzi do czegoś w Twoim systemie plików)
"Source": "/share/_DATA/DATA2/Multimedia",
"Source": "/share/_ANIME/_ANIME",
"Source": "/share/_DATA/DATA2/Filmy",

i wtedy w/w ścieżki należy zabezpieczyć.

W przypadku baz danych masz dwa wyjścia:
1. użyć narzędzia co robi kopię zapasową (np How to dump & restore a MariaDB/MySQL database from a docker container) POLECANA metoda
2. albo wyłączyć kontener z bazą danych i zrobić kopię jego wolumenów/bindów

Zrobisz tą kopię ? Cudownie, a wiesz jak ją przywrócić ? Przećwicz to i zapisz jak przywrócić sobie tak zabezpieczone dane.
 
Wolumeny wiem jak zabezpieczyć, bazy danych też (zresztą kopie baz danych mariadb są ulokowane w jednym z wolumenów). Chodzi mi o to, że np. jak zrobię update jednego z kontenerów do nowszej wersji i coś pójdzie nie tak, oraz uznam że lepiej wrócić do poprzedniej stabilnej wersji to poza wspomnianymi już mountami - co jakie dane jeszcze powinienem zabezpieczyć, aby odtworzyć kontener?
Czy przypadkiem nie powinienem też zrobić backup image kontenera?
 
Czy przypadkiem nie powinienem też zrobić backup image kontenera?
OPCJA #1
raczej odczytałbym wersję(TAG) istniejącego kontenera i kazał dockerowi załadować tą konkretną wersję jako opcję przywrócenia.

np mariadb Docker
Kod:
docker run --detach --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw  mariadb:latest
gdzie latest jest wersją(TAGiem) , jeśli explicte nie podasz wersji - to zostanie pobrany "latest" - co przeważnie oznacza ostatnią wersje wypuszczoną na świat

chcą odpalić wersję
1678889143890.png

wklepałbym
Kod:
docker run --detach --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw  mariadb:10.3.31

OPCJA #2
Kod:
docker save mariadb-1 > /share/Public/busybox.tar
docker save
 
Luźne przemyślenia - czyli mogę palnąć gafę
Czy jest możliwe coś takiego (bo nie wiem czy usiąść i rzeźbić)
1 skrypt który
a) zatrzymuje dokera (np unifi controler)
b) zrobi kopie ustawień tj baza
c) zrobi kopie plików (reszty)
d) zrobi kopie całego obrazu
e) pobierze aktualizacje dokera (unifi controler)
f) uruchomi (unifi controler)
2 skrypt który będzie wywoływał ten pierwszy ale np php
3 wrzucić 2gi skrypt do crontaba z ustawieniem np raz w tygodniu
-------------------------------------------------------------------------------------
Profit:
1 kopia danych
2 automatyka zadań
3 wersja dokera aktualizowana na bieżąco bez udziału człowieka
 
raczej odczytałbym wersję(TAG) istniejącego kontenera i kazał dockerowi załadować tą konkretną wersję jako opcję przywrócenia.
Dochodzimy chyba do sedna, bo jakoś chyba nieudolnie starałem się przekazać. Podam mój konkretny przykład:
Mam kontener nextcloud-latest, ale została wydana nowa wersja nextlcouda i jak robię update tego kontenera np. z poziomu portainera to TAG tego kontenera jest taki sam tj. nextcloud-latest.
Załóżmy, że coś mi nie tak działa po tym update i chcę wrócić do poprzedniej wersji to rozumiem, że przywrócenie do poprzedniej działającej wersji wykonuję poprzez odtworzenie z kopii bezpieczeństwa, o którą się tu dopytuję lub też muszę odtworzyć kontener ale nie nextcloud-latest tylko nextcloud-[nr wersji] ???
Oczywiście w tym drugim przypadku musiałbym tylko znać numer wersji nextcloud-latest.
Czy dobrze to przedstawiłem?
 
Mam kontener nextcloud-latest, ale została wydana nowa wersja nextlcouda i jak robię update tego kontenera np. z poziomu portainera to TAG tego kontenera jest taki sam tj. nextcloud-latest.
Dokładnie tak i to jednocześnie jest strzał w kolano - bo nie wiesz co to za wersja dokładnie.

Jak jesteś teraz w portainer, idź do zakładki IMAGES i zobacz jaką masz wersję teraz:
1678892653455.png

ja mam latest (bo niestety wiem co robię). Ty będziesz miał konkretny numer ? Może w końcu zapodasz screenshota (jak ja ?) i zobaczymy co tam namodziłeś ?

Załóżmy, że coś mi nie tak działa po tym update i chcę wrócić do poprzedniej wersji to rozumiem, że przywrócenie do poprzedniej działającej wersji wykonuję poprzez odtworzenie z kopii bezpieczeństwa, o którą się tu dopytuję lub też muszę odtworzyć kontener ale nie nextcloud-latest tylko nextcloud-[nr wersji] ???
Dokładnie - tak jak w przykładzie z mariadb (albo cały kontener z opcji #2).

Oczywiście w tym drugim przypadku musiałbym tylko znać numer wersji nextcloud-latest.
idziesz do repo nextclouda i se klikasz - a te informacje są podane na tacy w portainerze na jednym screenie w sekcji IMAGES.

Czy dobrze to przedstawiłem?
Dobrze ! 3+, siadaj ! :D

Brzmi to zawile , ale ma ręce i nogi.
Połączono posty:

@RafalLenarczyk - leniu ! otwieraj swój temat to ci odpisze!
 
idziesz do repo nextclouda i se klikasz - a te informacje są podane na tacy w portainerze na jednym screenie w sekcji IMAGES.
Bez tytułu.png

No właśnie, czy jest gdzieś info o numerze konkretnej wersji jeżeli nazywa się to nextcloud-latest?

EDIT
W szczegółach tego kontenera akurat znalazłem.
Bez tytułu.png

Ciekawe jak jest w przypadku innych aplikacji z oznaczeniem latest?
 
prosze bardzo : Docker
i teraz w zależnosci od procesora Twojego nasa:
1678895111492.png

klikasz w link po lewej (u mnie to akurat idioto-odpornie amd64) -> Docker

na górze strony widze SHA256 obrazu (to co portainer wypisał wcześniej).
1678895251882.png

i stąd wiem ze obraz ma TAG XYZ (tu akurat latest) .. no ale taki przykład ;p

idąc dalej tym wątkiem:
plik docker-compose ułatwia ci życie - to wiesz że kontener z bazą masz mieć zawsze w wersji ABC , podczas gdy kontener NextClouda w wersji CDE.
jesli masz polecenie "docker run ...." to strona Composerize jest w stanie ci pomóc z migracją.
 
Duże dzięki za podpowiedzi.
Opcja odtwarzania aplikacji kontenerowych poprzez tworzenie nowego kontenera z konkretną (starszą wersją) aplikacji wydaje się rozsądniejszym rozwiązaniem choćby wyłącznie dlatego, że nie trzeba robić backupów tych kontenerów oczywiście poza bazami danych jeżeli z takowych korzystają.
Pozostaje tylko jedna wątpliwość tj. utworzenie kontenera z konkretną wersją aplikacji to nie wszystko ponieważ pozostają jeszcze ustawienia tego kontenera takie jak na obrazku poniżej oznaczone numerami
Bez tytułu.png
Czy da się w prosty sposób robić backup tych ustawień i je odtwarzać dla innych kontenerów?
 
A może poświęć chwile i przepisz to na docker-compose.yml?
Np.:
Kod:
version: "3"
services:
  portainer:
    image: portainer/portainer-ee:latest
    container_name: portainer
    command: -H unix:///var/run/docker.sock
    ports:
      - 9000:9000
      - 8000:8000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /share/CACHEDEV1_DATA/Container/portainer:/data
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped
    environment:
      PUID: 0
      PGID: 0
      TZ: Europe/Warsaw
      DOCKER_MODS: gilbn/theme.park:portainer
    networks:
       dnet:
          ipv4_address: 172.30.10.8
Masz później wszystko w jednym pliku Chcesz wrócić do jakieś wersji robisz np. image:portainer/portainer-ee:linux-amd64-2.0.0-alpine. Masz informację jakie katalogi backupować itd.
 
Nie mam dużo kontenerów i może bym to zrobił ale totalnie nie wiem jak mam się do tego zabrać tj. nie wiem, które ustawienia z container station odpowiada wpisowi, który Ty podałeś wyżej (no może poza nr portów dla aplikacji i ścieżkami voluminów).
Jedyne co wiem, bo już kiedyś tego używałem to sposób tworzenia kontenerów poprzez docker compose
Bez tytułu.png
 
Duże dzięki Damian - ciekawe to jest tj. docker-autocompose. Przetestuję to.
W sumie ten docker-compose rozwiązałby wszystkie moje problemy z backupami.
Na koniec pytanie do Was: używając docker-compose i portainera przestaje być potrzebny container station od qnapa.
Czy w związku z tym mogę się go pozbyć bez żadnego wpływu na działające kontenery wykreowane za pomocą docker compose?
 
Container station musisz mieć zainstalowany bo to nie tylko GUI ale przede wszystkim aplikacje, które uruchamiają dockery. Bez tego żaden docker nie będzie działał, a że graficznie ta aplikacja jest słaba to inna sprawa.
 
Reasumując:
1. Update kontenerów mogę zrobić za pomocą portainera.
2. Backup kontenerów w zasadzie jest mi niepotrzebny mając zachowany plik docker compose.yml aplikacji w odpowiedniej dla konkretnej wersji.
3. Jedyne co należałoby backupować to bazy danych (w moim przypadku mariadb).
Sam backup jak w podpunkcie 3 to żadne problem i załatwiałem to narzędziem Qbackup sync woluminu, w którym znajdowały się kopie baz danych natomiast problemem jest backup samych baz danych do woluminu - używam tego kontenera
Po jego aktualizacji przestały mi się robić kopie, a wcześniejsza wersja wykonywała kopie codziennie o 6 rano na 14 dni wstecz.
Teraz pomimo, że mam ustawione te parametry (poza oczywiście parametrami dla baz danych typu ich nazwy i hasła)
Kod:
MARIADB_BACKUP_IGNORE = null
MARIADB_BACKUP_PATH = /var/lib/backup
MARIADB_BACKUP_RETENTION = 14
to kopie się nie wykonują.
To już moja ostatnia prośba w zakresie backupów kontenerów tj. prośba o wskazanie sprawdzonego kodu docker copose dla kontenera mariadb, który miałby zdefiniowane ENV dla codziennych backupów baz danych.
 
Żeby nie było, że tylko ciągle coś chcę to podzielę się tym, o co dopytywałem ponieważ udało mi się zautomatyzować tworzenie kopii baz danych poprzez docker compose. Aplikacja zawiera mechanizm bazodanowy mariadb, phpmyadmin do zarządzania oraz mechanizm automatyzujący backup baz danych


Kod:
###################### PREVIOUS DOCKER-COMPOSE FILE ###############
version: '2'
services:
  db:
    image: webhippie/mariadb:latest
    restart: always
    volumes:
      - data:/var/lib/mysql
      - backup:/var/lib/backup
      - config:/etc/mysql/conf.d
      - init:/etc/mysql/init.d


    environment:
      - TZ=Europe/Warsaw
      - MARIADB_DATABASE=namedatabase
      - MARIADB_PASSWORD=passworddatabase
      - MARIADB_ROOT_PASSWORD=rootpassworddatabase
      - MARIADB_ROOT_USERNAME=root
      - MARIADB_USERNAME=nameuserdatabase
    ports:
      - "3308:3306"
###################### PREVIOUS DOCKER-COMPOSE FILE ###############


  dbBackup:
    image: fradelg/mysql-cron-backup
    depends_on:
      - db
    restart: always
    volumes:
      - backup:/backup
    environment:
      - TZ=Europe/Warsaw
      - MYSQL_HOST=hostmariadb
      - MYSQL_USER=root
      - MYSQL_PASS=rootpassworddatabase
      - MAX_BACKUPS=15
      - INIT_BACKUP=1
      # Every day at 01:00
      - CRON_TIME=0 1 * * *
      # Make it small
      - GZIP_LEVEL=9
    restart: unless-stopped
###################### PREVIOUS DOCKER-COMPOSE FILE ###############


  phpmyadmin:
    image: phpmyadmin:latest
    restart: always
    ports:
      - 9010:80
    environment:
      - PMA_HOST=hostmariadb
      - PMA_USER=root
      - PMA_PASSWORD=rootpassworddatabase
      - UPLOAD_LIMIT=0
volumes:
  data:
  backup:
  config:
  init:
Opierałem się na tym poradniku GitHub - fradelg/docker-mysql-cron-backup: Docker image to backup all your databases periodically
Jedyne co nie chce mi zadziałać z miom docker compose to
Kod:
network_mode: bridge
ponieważ chciałbym aby te aplikacje było w sieci z pozostałymi moimi aplikacjami jak na obrazku poniżej
Bez tytułu.png

Oczywiście w portainerze dla kontenera mariadb dodałem bridge, ale chciałbym aby się to automatycznie zrobiło przez docker compose.
Dodam, że docker compose dla nextclouda opcja bridge działa - przykład poniżej (ostatnia linia)

Kod:
version: '2'


volumes:
  nextcloud:


services:
  app:
    image: nextcloud
    restart: always
    ports:
      - 9090:80
    volumes:
      - nextcloud:/var/www/html
      - /share/nextcloud:/nextcloud
    network_mode: bridge
Podpowie ktoś?
 
no ale czemu nie dodałeś network_mode: bridge do swojego kodu zaraz pod wpisem image ?
trzeba to zrobić dla każdej usługi w pliku (db, backup ...)
YAML:
version: '2'
services:
  db:
    image: webhippie/mariadb:latest
    network_mode: bridge
    restart: always
    ........
[B]
[/B]
 
no ale czemu nie dodałeś network_mode: bridge do swojego kodu zaraz pod wpisem image
Super - właśnie o to chodziło.
Ostatecznie jednak zrezygnowałem z tego gdyż w tej opcji zbudowane aplikacje nie mogą się komunikować między sobą po nazwie hosta np. taki phpmyadmin nie może podłączyć się do mariadb po nazwie
Kod:
database_db_1
W związku z tym dużo prościej jeden z kontenerów (w moim przypadku mariadb) "zbridżować" przez portainera niż zminiać nazwy hostów w configach innych aplikacji na adresy IP.
W tym miejscu pojawia się pytanie czy adresy IP kontenerów są przydzielane statycznie czy też mogą się zmienić np. po jakimś restarcie?
 

Użytkownicy znaleźli tą stronę używając tych słów:

  1. Portainer
  2. unifi
  3. Hybrid Backup Sync
  4. Container Station
  5. hybrid backup
  6. backup mysql
  7. backup kontenera
  8. docker
  9. volume
  10. cron
  11. backup kontenerów
  12. kopia
  13. unifi controler
  14. ssl dla kontenerow
  15. container station folder
  16. non-root
  17. kontenery
  18. hybrid
  19. *
  20. portainer aktualizacja
  21. mysql dump
  22. qbittorrent x19
  23. docker backup
  24. qbitorrent
  25. nextcloud