1066 Stimmen

Wie man mit persistentem Speicher (z. B. Datenbanken) in Docker umgeht

Wie gehen Menschen mit persistentem Speicher für ihre Docker-Container um?

Derzeit verwende ich diesen Ansatz: Das Image erstellen, z.B. für PostgreSQL, und dann den Container starten mit

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

Meiner Meinung nach hat das den Nachteil, dass ich niemals (aus Versehen) den Container "c0dbc34fd631" löschen darf.

Eine weitere Idee wäre, Host-Volumes "-v" in den Container einzuhängen, jedoch stimmt die Benutzer-ID im Container nicht unbedingt mit der Benutzer-ID des Hosts überein, und dann könnten die Berechtigungen durcheinander geraten.

Anmerkung: Anstelle von --volumes-from 'kryptische_id' können Sie auch --volumes-from my-data-container verwenden, wobei my-data-container ein Name ist, den Sie einem reinen Datencontainer zugewiesen haben, z.B. docker run --name my-data-container ... (siehe die akzeptierte Antwort)

3voto

slth Punkte 71

Ich habe kürzlich über eine potenzielle Lösung und eine Anwendung geschrieben, die die Technik demonstriert. Ich finde es sowohl während der Entwicklung als auch in der Produktion ziemlich effizient. Hoffe es hilft oder einige Ideen hervorruft.

Repo: https://github.com/LevInteractive/docker-nodejs-example
Artikel: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/

2voto

Alen Komljen Punkte 429

Ich verwende einfach ein vordefiniertes Verzeichnis auf dem Host, um Daten für PostgreSQL dauerhaft zu speichern. Auf diese Weise ist es auch möglich, bestehende PostgreSQL-Installationen einfach auf Docker-Container zu migrieren: https://crondev.com/persistent-postgresql-inside-docker/

1voto

Hassan Saeed Punkte 4644

Um Datenbankdaten zu erhalten oder zu speichern, stellen Sie sicher, dass Ihre docker-compose.yml wie folgt aussieht, wenn Sie Dockerfile verwenden möchten

version: '3.1'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:
  mysql-data:

Ihre docker-compose.yml wird wie folgt aussehen, wenn Sie Ihr eigenes Bild anstelle von Dockerfile verwenden möchten

version: '3.1'   

services:
  php:
    image: php:7.4-apache
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:

Wenn Sie die Daten von MySQL speichern oder erhalten möchten, müssen Sie sich daran erinnern, zwei Zeilen in Ihre docker-compose.yml hinzuzufügen

volumes:
  - mysql-data:/var/lib/mysql

und

volumes:
  mysql-data:

danach verwenden Sie diesen Befehl

docker-compose up -d

Jetzt bleiben Ihre Daten persistent und werden auch nach Verwendung dieses Befehls nicht gelöscht

docker-compose down

Extra: Aber wenn Sie alle Daten löschen möchten, verwenden Sie

docker-compose down -v

Außerdem können Sie die Liste Ihrer Datenbankdaten mithilfe dieses Befehls überprüfen

docker volume ls

DRIVER              VOLUME NAME
local               35c819179d883cf8a4355ae2ce391844fcaa534cb71dc9a3fd5c6a4ed862b0d4
local               133db2cc48919575fc35457d104cb126b1e7eb3792b8e69249c1cfd20826aac4
local               483d7b8fe09d9e96b483295c6e7e4a9d58443b2321e0862818159ba8cf0e1d39
local               725aa19ad0e864688788576c5f46e1f62dfc8cdf154f243d68fa186da04bc5ec
local               de265ce8fc271fc0ae49850650f9d3bf0492b6f58162698c26fce35694e6231c
local               phphelloworld_mysql-data

0voto

Lanti Punkte 2179

Meine Lösung besteht darin, das neue docker cp zu verwenden, das jetzt in der Lage ist, Daten aus Containern zu kopieren, unabhhängig davon, ob sie ausgeführt werden oder nicht, und ein Host-Volume für den genau gleichen Ort freizugeben, an dem die Datenbankanwendung ihre Datenbankdateien im Container erstellt. Diese doppelte Lösung funktioniert ohne einen Datencontainer, direkt aus dem Original-Datenbankcontainer heraus.

Also übernimmt mein systemd-Init-Skript die Aufgabe, die Datenbank in ein Archiv auf dem Host zu sichern. Ich habe einen Zeitstempel in den Dateinamen eingefügt, um nie eine Datei zu überschreiben.

Es erfolgt im ExecStartPre:

ExecStartPre=-/usr/bin/docker cp lanti-debian-mariadb:/var/lib/mysql /home/core/sql
ExecStartPre=-/bin/bash -c '/usr/bin/tar -zcvf /home/core/sql/sqlbackup_$$(date +%%Y-%%m-%%d_%%H-%%M-%%S)_ExecStartPre.tar.gz /home/core/sql/mysql --remove-files'

Und dasselbe passiert auch im ExecStopPost:

ExecStopPost=-/usr/bin/docker cp lanti-debian-mariadb:/var/lib/mysql /home/core/sql
ExecStopPost=-/bin/bash -c 'tar -zcvf /home/core/sql/sqlbackup_$$(date +%%Y-%%m-%%d_%%H-%%M-%%S)_ExecStopPost.tar.gz /home/core/sql/mysql --remove-files'

Außerdem habe ich einen Ordner vom Host als Volume freigegeben, um genau am gleichen Ort, an dem die Datenbank gespeichert ist:

mariadb:
  build: ./mariadb
  volumes:
    - $HOME/server/mysql/:/var/lib/mysql/:rw

Es funktioniert großartig auf meinem VM (ich erstelle einen LEMP-Stack für mich selbst): https://github.com/DJviolin/LEMP

Aber ich weiß einfach nicht, ob es eine "bulletproof" Lösung ist, wenn Ihr Leben davon abhängt (zum Beispiel ein Webshop mit Transaktionen in möglichen Millisekunden)?

Bei 20 min 20 Sek ab diesem offiziellen Docker-Keynote-Video macht der Moderator dasselbe mit der Datenbank:

Erste Schritte mit Docker

"Für die Datenbank haben wir ein Volume, damit wir sicherstellen können, dass wir, wenn der Datenbankcontainer gestoppt wird, keine Daten verlieren, wenn die Datenbank heruntergefahren wird."

0voto

Santanu Dey Punkte 2860

Verwenden Sie Persistent Volume Claim (PVC) von Kubernetes, einem Docker-Container-Verwaltungs- und Terminierungstool:

Persistent Volumes

Die Vorteile der Verwendung von Kubernetes zu diesem Zweck sind:

  • Sie können jeden Speicher wie NFS oder anderen Speicher verwenden und selbst wenn der Knoten ausfällt, muss der Speicher nicht.
  • Darüber hinaus kann die Daten in solchen Volumes so konfiguriert werden, dass sie auch nach der Zerstörung des Containers selbst erhalten bleiben - so dass sie bei Bedarf von einem anderen Container zurückgewonnen werden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X