2016-08-05 30 views
11

Ich bin neu in Docker und Entwicklung eines Projekts mit Docker komponieren. Aus der Dokumentation habe ich gelernt, dass ich Data-Only-Container verwenden sollte, um Daten persistent zu halten, aber ich bin nicht in der Lage, dies mit docker-compose zu tun. Immer wenn ich docker-compose down mache, entfernt es die Daten von db, aber dadurch docker-compose stop werden die Daten nicht entfernt. Möglicherweise liegt das daran, dass ich nicht named Datenvolumen erstellen und docker-compose down kaum alle Container entfernt. Also habe ich versucht, den Container zu benennen, aber es hat mir Fehler gemacht. haben Sie einen Blick auf meine yml Datei:Docker Compose - Wie werden Datenbankdaten gespeichert?

version: '2' 
services: 
    data_container: 
    build: ./data 
    #volumes: 
    # - dataVolume:/data 
    db: 
    build: ./db 
    ports: 
     - "5445:5432" 
    environment: 
     - POSTGRES_USER=postgres 
     - POSTGRES_DB=postgres 
    # - PGDATA=/var/lib/postgresql/data/pgdata 
    volumes_from: 
    # - container:db_bus 
     - data_container 
    geoserver: 
    build: ./geoserver 
    depends_on: 
     - db 
    ports: 
     - "8004:8080" 
    volumes: 
     - ./geoserver/data:/opt/geoserverdata_dir 

    web: 
    build: ./web 
    volumes: 
     - ./web:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
    command: python manage.py runserver 0.0.0.0:8000 

    nginx: 
    build: ./nginx 
    ports: 
     - "83:80" 
    depends_on: 
     - web 

Die Docker für die data_container Datei ist:

FROM stackbrew/busybox:latest 
MAINTAINER Tom Offermann <[email protected]> 

# Create data directory 
RUN mkdir /data 

# Create /data volume 
VOLUME /data 

habe ich versucht, dies aber, indem Sie Docker-komponieren nach unten, gehen die Daten verloren. Ich versuchte, die data_container Benennung, wie Sie die Kommentarzeile sehen können, es warf mir diesen Fehler:

ERROR: Named volume "dataVolume:/data:rw" is used in service "data_container" but no declaration was found in the volumes section. 

So jetzt, was ich tue, ist habe ich einen Stand nur allein Daten genannt Behälter und setzen, dass in der volumes_from Wert der db. Es funktionierte gut und löschte keine Daten, selbst nachdem docker-compose down getan wurde.

Meine Anfragen:

  • Was ist der beste Ansatz Behälter herzustellen, der die docker-compose unter Verwendung von Daten der Datenbank speichern kann und sie richtig zu benutzen?

  • Mein Bewusstsein ist nicht einverstanden mit mir über die Vorgehensweise, die ich gewählt habe, die durch die Schaffung eines eigenständigen Datencontainers. Irgendwelche Gedanken?

+1

Gibt es einen Grund, warum Sie wollen keinen Namen Volumen für Ihre Daten verwenden, wie 'Band: -/data/mydata:/var/lib/postgresql/data/pgdata' ist die bevorzugte Methode für Datencontainervolumes. – ldg

+0

Ich habe versucht, dies zu tun und es wirft mich Fehler: 'FEHLER: Benannte Datenträger" dataVolume:/data: rw "wird im Dienst" data_container "verwendet, aber keine Deklaration wurde im Abschnitt Volumes gefunden." Ich bin auch neugierig auf Datenportabilität mit diesem Ansatz. –

Antwort

11

docker-compose down

macht folgendes

Stops containers and removes containers, networks, volumes, and images created by up

So das Verhalten Sie erwarten erleben wird.

Verwenden Sie docker-compose stop zum Herunterfahren von Containern, die mit der docker-compose-Datei erstellt wurden, aber nicht ihre Volumes entfernen.

Zweitens brauchen Sie nicht die data-container Muster in der Version 2 von Docker komponieren. So entfernen Sie das und verwenden nur

db: 
    ... 
    volumes: 
     - /var/lib/postgresql/data 
+0

Wie kann ich mit diesem Ansatz die Daten sichern oder portabel machen? –

+1

Es ist bereits auf dem Docker-Host in einem Volume. Sie müssen auf dieses Volume mit einem Tool zugreifen, mit dem die Daten gesichert werden können. z.B. '' 'docker-komponieren exec POSTGRES_CONTAINER pg_dump | bzip2> pfad/on/host/mydb-dump-'date" +% Y% m% d% H% M% S "' .sql.bz2''' –

+0

Das hat sehr geholfen. Es gibt einen Fehler, während ich versuchte, die Daten zu sichern, die ist: 'pg_dump: [Archiver (db)] Verbindung zur Datenbank" root "fehlgeschlagen: FATAL: Rolle" root "existiert nicht Können Sie mir dabei helfen ? –

5

Docker-komponieren unten stoppt Container, sondern auch entfernt sie (mit allem: Netzwerke, ...).

Verwenden Sie stattdessen docker-compose stop.

Ich denke, der beste Ansatz Container zu machen, die Datenbank Daten mit Docker-compose speichern kann, ist benannt Volumen zu verwenden:

version: '2' 
services: 

    db: #https://hub.docker.com/_/mysql/ 
    image: mysql 
    volumes: 
     - "wp-db:/var/lib/mysql:rw" 
    env_file: 
     - "./conf/db/mysql.env" 

volumes: 
    wp-db: {} 

Hier wird es eine benannte Band namens „wp-db“ erstellen (wenn es existiert nicht) und mount es in/var/lib/mysql (im Lese-Schreib-Modus, der Standard). Hier speichert die Datenbank ihre Daten (für das mysql-Image).

Wenn das benannte Volume bereits existiert, wird es verwendet, ohne es zu erstellen.

Beim Start sieht das mysql-Image aus, ob sich Datenbanken in/var/lib/mysql (Ihrem Volume) befinden, um sie zu verwenden.

können Sie mehr Informationen haben, mit dem Docker-compose Dateiverweis hier: https://docs.docker.com/compose/compose-file/#/volumes-volume-driver