it-swarm.com.de

wie kann ich eine Datenbank im Docker sichern?

ich verwende meine App mit Docker-Compose mit der folgenden Yml-Datei

  postgres:
    container_name: postgres
    image: postgres:${POSTGRES_VERSION}
    volumes:
      - postgresdata:/var/lib/postgresql/data
    expose:
      - "5432"
    environment:
      - POSTGRES_DB=42EXP
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  node:
    container_name: node
    links:
      - postgres:postgres
    depends_on:
      - postgres

volumes:
  postgresdata:

Wie Sie hier sehen können, verwende ich einen named volume, um den Postgres-Status zu verwalten.

Laut offiziellen Dokumenten kann ich ein Volume wie das folgende sichern

docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

In einigen anderen Tutorials wurde vorgeschlagen, die von postgres bereitgestellte pg-dump-Funktion für Backups zu verwenden.

pg_dump -Fc database_name_here > database.bak

Ich denke, ich müsste in den Postgres-Container gehen, um diese Funktion auszuführen und das Sicherungsverzeichnis an den Host zu mounten.

Ist ein Ansatz besser/vorzuziehen als der andere?

11
Kannaj

Zum Ausführen von pg_dump können Sie docker exec Befehl:

Zum Sichern:

docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

Um db fallen zu lassen (Mach es nicht in der Produktion, nur zu Testzwecken !!!):

docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

Wiederherstellen:

docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

Sie können auch docker-compose analog von exec verwenden. In diesem Fall können Sie anstelle des vollständigen Containernamens (composeproject_postgres) einen kurzen Dienstnamen (postgres) verwenden.

Docker Exec

Docker-Compose Exec

pg_restore

41
tck

Da hast du

expose:     
 - "5432"

du kannst rennen

pg_dump -U <user> -h localhost -Fc <db_name> > 1.dump

pg_dump stellt eine Verbindung zum 5432-Port her, um einen Speicherauszug zu erstellen, da er durch Postgres im Container beeinträchtigt wird. Sie werden die Datenbank aus dem Container auslagern

Ich übergebe einfach den Container, der die Datenbank ausführt. Dann schiebe ich das neue Bild in meine private Registry. Was auch immer mit der App oder der Datenbank geschieht, ich kann sie immer aus meiner Registrierung ziehen und in kürzester Zeit einrichten.

docker commit [container-name] [domain:port/'new-image-name']

Danach schiebe ich das Bild in meine Registry.

docker Push [new-image-name]

Wenn ich diese Datenbank jemals wiederherstellen muss, ziehe ich sie einfach so aus meiner eigenen Registry.

docker pull [domain:port/'new-image-name']

Um dies zu verdeutlichen: [Domäne: Port/'Neuer Image-Name']

Würde so aussehen: myregistrydomain.com:5000/dbSep