Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

[Gelöst] Unklare Docker Volumes

Alles rund um die Server (Web-, Mail-, Datenbank-, Datenaustausch-, etc.) die man unter Linux betreiben kann

Moderator: Moderatoren

Antworten
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

[Gelöst] Unklare Docker Volumes

Beitrag von gehrke »

Lasst uns mal über Docker reden!

Ich habe ein Problem damit, dass die Volumes nicht so angelegt werden, wie ich es gedacht habe.

Meine docker-compose.yml:

Code: Alles auswählen

version: "3.5"
services:
 nextcloud-db:
    image: nextcloud-mariadb
    volumes:
      - /var/lib/docker/volumes/v-mysql-data:/var/lib/mysql:z
      - /var/lib/docker/volumes/v-mysql-log:/var/log/mysql:z

    networks:
      - net-nextcloud

    expose:
     - "3306"

 nextcloud-webserver:
   image: nextcloud-apache2

   volumes:
    - /var/lib/docker/volumes/v-apache-html:/var/www/html:z
    - /var/lib/docker/volumes/v-apache-log:/var/log/apache2:z

   networks:
     - net-nextcloud

   ports:
#     - "8080:80"
     - "8443:443"
volumes:
 v-mysql-data:
 v-mysql-log:
 v-apache-html:
 v-apache-log:
networks:
 net-nextcloud:
Meine Erwartung: Es werden 4 Volumes verwendet, die unter /var/lib/docker/volumes/v-* zu finden sind.

Tatsächlich sieht es aber so aus:

Code: Alles auswählen

# docker volume list
DRIVER              VOLUME NAME
local               docker_v-apache-html
local               docker_v-apache-log
local               docker_v-mysql-data
local               docker_v-mysql-log
local               v-apache-html
local               v-apache-log
local               v-mysql-data
local               v-mysql-log

Code: Alles auswählen

# tree -L 1 /var/lib/docker/volumes/*mysql-data
/var/lib/docker/volumes/docker_v-mysql-data
└── _data
/var/lib/docker/volumes/v-mysql-data
├── aria_log.00000001
├── aria_log_control
├── ib_buffer_pool
├── ibdata1
├── ib_logfile0
├── ibtmp1
├── multi-master.info
├── mysql
├── nextcloud
└── performance_schema
Ja, die eigentlichen Daten liegen dort, wo ich sie erwarte. Aber zusätzlich gibt es noch dieses 'docker_v-*', welches mir spanisch vorkommt.

Code: Alles auswählen

# docker volume inspect v-mysql-data
[
    {
        "CreatedAt": "0001-01-01T00:00:00Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/v-mysql-data/_data",
        "Name": "v-mysql-data",
        "Options": null,
        "Scope": "local"
    }
]

Code: Alles auswählen

# docker volume inspect docker_v-mysql-data
[
    {
        "CreatedAt": "2020-09-13T12:45:47+02:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "docker",
            "com.docker.compose.version": "1.27.1",
            "com.docker.compose.volume": "v-mysql-data"
        },
        "Mountpoint": "/var/lib/docker/volumes/docker_v-mysql-data/_data",
        "Name": "docker_v-mysql-data",
        "Options": null,
        "Scope": "local"
    }
]
Ich bin alarmiert, weil mir letztens ein beherztes 'docker volume prune' bei laufenden Containern alle meine Daten gelöscht hat.

Was ist da los?
TNX
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

Re: Unklare Docker Volumes

Beitrag von gehrke »

OK, so langsam lichtet sich das Bild.

https://devops.stackexchange.com/questi ... er-compose
docker-compose will prepend the volumes names with the compose project name, which is by default the name of the folder holding the compose file.
Ja, das passt - das Verzeichnis heisst tatsächlich so:

Code: Alles auswählen

[root@j15 docker]# pwd
/root/projects/docker

[root@j15 docker]# ls -ltar
insgesamt 24
drwxr-xr-x. 3 root root 4096 12. Sep 14:01 ..
drwxr-xr-x. 3 root root 4096 12. Sep 14:01 nextcloud-apache2
-rw-r--r--. 1 root root  657 12. Sep 14:01 docker-compose.yml
drwxr-xr-x. 2 root root 4096 12. Sep 14:01 nextcloud-mariadb
drwxr-xr-x. 5 root root 4096 12. Sep 14:01 .
drwxr-xr-x. 8 root root 4096 13. Sep 09:23 .git
Warum die Files in einem anderen Verzeichnis liegen und von dort auch gezogen werden?
Erster Teil der Frage: Wahrscheinlich, weil ich anfangs ohne docker-compose gearbeitet habe. Und zuletzt auch noch von einem anderen Host migriert habe.
Aber genau habe ich das noch nicht verstanden.

Ich schau mal, wie ich das wieder gerade gezogen bekomme...
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

Re: Unklare Docker Volumes

Beitrag von gehrke »

So, nun habe ich mir zum zweiten mal alle meine Daten gelöscht. :zensur:

Code: Alles auswählen

[root@j15 docker]# docker run -it -v /var/lib/docker/volumes/v-apache-html:/mnt/no-compose/apache2-html:z -v /var/lib/docker/volumes/v-apache-log:/mnt/no-compose/apache2-log:z -v /var/lib/docker/volumes/v-mysql-data:/mnt/no-compose//mysql-data:z -v /var/lib/docker/volumes/v-mysql-log:/mnt/no-compose/mysql-log:z -v /var/lib/docker/volumes/docker_v-apache-html:/mnt/compose/apache2-html:z -v /var/lib/docker/volumes/docker_v-apache-log:/mnt/compose/apache2-log:z -v /var/lib/docker/volumes/docker_v-mysql-data:/mnt/compose//mysql-data:z -v /var/lib/docker/volumes/docker_v-mysql-log:/mnt/compose/mysql-log:z fedora

Code: Alles auswählen

[root@db676abbb014 /]# tree -L 3 /mnt/
/mnt/
├── compose
│   ├── apache2-html
│   │   └── _data
│   ├── apache2-log
│   │   └── _data
│   ├── mysql-data
│   │   └── _data
│   └── mysql-log
│       └── _data
└── no-compose
    ├── apache2-html
    │   ├── 3rdparty
    │   ├── AUTHORS
    │   ├── COPYING
    │   ├── apps
    │   ├── config
    │   ├── console.php
    │   ├── core
    │   ├── cron.php
    │   ├── custom_apps
    │   ├── data
    │   ├── index.html
    │   ├── index.php
    │   ├── lib
    │   ├── occ
    │   ├── ocm-provider
    │   ├── ocs
    │   ├── ocs-provider
    │   ├── public.php
    │   ├── remote.php
    │   ├── resources
    │   ├── robots.txt
    │   ├── status.php
    │   ├── themes
    │   └── version.php
    ├── apache2-log
    │   ├── access.log
    │   ├── error.log
    │   └── other_vhosts_access.log
    ├── mysql-data
    │   ├── aria_log.00000001
    │   ├── aria_log_control
    │   ├── ib_buffer_pool
    │   ├── ib_logfile0
    │   ├── ibdata1
    │   ├── multi-master.info
    │   ├── mysql
    │   ├── nextcloud
    │   └── performance_schema
    └── mysql-log

29 directories, 21 files

Code: Alles auswählen

[root@db676abbb014 /]# rm -Rf /mnt/compose/*/*
[root@db676abbb014 /]# cp -r /mnt/no-compose/apache2-log/* /mnt/compose/apache2-log/
[root@db676abbb014 /]# cp -r /mnt/no-compose/apache2-html/* /mnt/compose/apache2-html/
[root@db676abbb014 /]# cp -r /mnt/no-compose/mysql-data/* /mnt/compose/mysql-data/
[root@db676abbb014 /]# cp -r /mnt/no-compose/mysql-log/* /mnt/compose/mysql-log/
[root@db676abbb014 /]# exit

Code: Alles auswählen

[root@j15 docker]# docker-compose up -d 
Creating network "docker_net-nextcloud" with the default driver
Creating docker_nextcloud-db_1        ... done
Creating docker_nextcloud-webserver_1 ... done

[root@j15 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
27019f168a1a        nextcloud-apache2   "/entrypoint.sh apac…"   7 seconds ago       Up 6 seconds        80/tcp, 0.0.0.0:8443->443/tcp   docker_nextcloud-webserver_1
0118738227f2        nextcloud-mariadb   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        3306/tcp                        docker_nextcloud-db_1

[root@j15 docker]# docker volume ls
DRIVER              VOLUME NAME
local               docker_v-apache-html
local               docker_v-apache-log
local               docker_v-mysql-data
local               docker_v-mysql-log
local               v-apache-html
local               v-apache-log
local               v-mysql-data
local               v-mysql-log

Code: Alles auswählen

[root@j15 docker]# ls -ltar /var/lib/docker/volumes/docker_v-mysql-data
insgesamt 176200
drwx------. 10 root root      4096 13. Sep 12:45 ..
-rw-r-----.  1 root root        52 26. Sep 12:41 aria_log_control
-rw-r-----.  1 root root     32768 26. Sep 12:41 aria_log.00000001
-rw-r-----.  1 root root      4690 26. Sep 12:41 ib_buffer_pool
-rw-r-----.  1 root root 100663296 26. Sep 12:41 ib_logfile0
-rw-r-----.  1 root root         0 26. Sep 12:41 multi-master.info
-rw-r-----.  1 root root  79691776 26. Sep 12:41 ibdata1
drwx------.  2 root root      4096 26. Sep 12:41 mysql
drwx------.  2 root root      4096 26. Sep 12:41 performance_schema
drwx------.  2 root root     12288 26. Sep 12:41 nextcloud
drwxr-xr-x.  5 root root      4096 26. Sep 12:41 .
Hier liefen die Dienste noch und alles schien gut!

Code: Alles auswählen

[root@j15 docker]# docker rm $(docker ps -a -q -f ancestor=fedora)
Hiermit wurde alles gelöscht. Meine Erwartung war, dass die Volumes 'in use' erhalten bleiben würden:

Code: Alles auswählen

[root@j15 docker]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
v-mysql-data
v-mysql-log
docker_v-apache-html
docker_v-apache-log
docker_v-mysql-data
docker_v-mysql-log
v-apache-html
v-apache-log

Total reclaimed space: 0B

[root@j15 docker]# docker volume ls
DRIVER              VOLUME NAME
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

Re: Unklare Docker Volumes

Beitrag von gehrke »

Wenigstens gelingt das Recovery - alles wieder da:

Code: Alles auswählen

[root@j15 docker]# cd ~/projects/docker/; docker-compose down
[root@j15 docker]# systemctl stop docker.service

[root@j15 docker]# cd /
[root@j15 /]# tar -xzf /root/docker-volumes-20200926.tar.gz 

[root@j15 /]# systemctl start docker.service
[root@j15 /]# cd ~/projects/docker/; docker-compose down; docker-compose up -d
Removing network docker_net-nextcloud
WARNING: Network docker_net-nextcloud not found.
Creating network "docker_net-nextcloud" with the default driver
Creating docker_nextcloud-db_1        ... done
Creating docker_nextcloud-webserver_1 ... done
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

Re: Unklare Docker Volumes

Beitrag von gehrke »

Prozedur noch einmal wiederholt, diesmal aber die alten Volumes von Hand gelöscht:

Code: Alles auswählen

[root@j15 docker]# docker volume rm v-apache-html
v-apache-html
[root@j15 docker]# docker volume rm v-apache-log
v-apache-log
[root@j15 docker]# docker volume rm v-mysql-data v-mysql-log
v-mysql-data
v-mysql-log
Hat docker auch brav gelöscht, sofort war die Application kaputt.

Offensichtlich werden die also weiterhin verwendet für irgendwas.
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

Re: Unklare Docker Volumes

Beitrag von gehrke »

Ich glaub, ich hab's jetzt.

Änderung 1: Im docker-compose.yml werden die Volumes nicht mehr absolut angegeben:

Code: Alles auswählen

version: "3.5"
services:
 nextcloud-db:
    build: ./nextcloud-mariadb
    volumes:
      - v-mysql-data:/var/lib/mysql:z
      - v-mysql-log:/var/log/mysql:z

    networks:
      - net-nextcloud

    expose:
     - "3306"

 nextcloud-webserver:
   build: ./nextcloud-apache2

   volumes:
    - v-apache-html:/var/www/html:z
    - v-apache-log:/var/log/apache2:z

   networks:
     - net-nextcloud

   ports:
#     - "8080:80"
     - "8443:443"

volumes:
 v-mysql-data:
 v-mysql-log:
 v-apache-html:
 v-apache-log:

networks:
 net-nextcloud:
Das sorgt dafür, dass ein 'prune' diese Volumes nicht platt macht.

Änderung 2: Im temporären Container die Originalfiles nach '_data' kopiert.

Code: Alles auswählen

[root@j15 docker]# docker run -it -v /var/lib/docker/volumes/v-apache-html:/mnt/no-compose/apache2-html:z -v /var/lib/docker/volumes/v-apache-log:/mnt/no-compose/apache2-log:z -v /var/lib/docker/volumes/v-mysql-data:/mnt/no-compose//mysql-data:z -v /var/lib/docker/volumes/v-mysql-log:/mnt/no-compose/mysql-log:z -v /var/lib/docker/volumes/docker_v-apache-html:/mnt/compose/apache2-html:z -v /var/lib/docker/volumes/docker_v-apache-log:/mnt/compose/apache2-log:z -v /var/lib/docker/volumes/docker_v-mysql-data:/mnt/compose//mysql-data:z -v /var/lib/docker/volumes/docker_v-mysql-log:/mnt/compose/mysql-log:z fedora

[root@f56bdacf70cc /]# dir=apache2-html; rm -Rf /mnt/compose/$dir/_data/*; cp -p -r /mnt/no-compose/$dir/* /mnt/compose/$dir/_data/
[root@f56bdacf70cc /]# dir=apache2-log; rm -Rf /mnt/compose/$dir/_data/*; cp -p -r /mnt/no-compose/$dir/* /mnt/compose/$dir/_data/
[root@f56bdacf70cc /]# dir=mysql-log; rm -Rf /mnt/compose/$dir/_data/*; cp -p -r /mnt/no-compose/$dir/* /mnt/compose/$dir/_data/
[root@f56bdacf70cc /]# dir=mysql-data; rm -Rf /mnt/compose/$dir/_data/*; cp -p -r /mnt/no-compose/$dir/* /mnt/compose/$dir/_data/
[root@f56bdacf70cc /]# exit
Dann startet die Nextcloud-Instanz mit den vorhandenen Daten.

Und jetzt das spannende:

Code: Alles auswählen

[root@j15 docker]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
v-apache-html
v-apache-log
v-mysql-data
v-mysql-log

Total reclaimed space: 0B

[root@j15 docker]# docker volume ls
DRIVER              VOLUME NAME
local               docker_v-apache-html
local               docker_v-apache-log
local               docker_v-mysql-data
local               docker_v-mysql-log

Code: Alles auswählen

[root@j15 docker]# ls -ltar /var/lib/docker/volumes/
insgesamt 48
drwx--x--x. 14 root root  4096 26. Sep 20:35 ..
drwxr-xr-x.  3 root root  4096 26. Sep 20:35 docker_v-mysql-data
drwxr-xr-x.  3 root root  4096 26. Sep 20:35 docker_v-mysql-log
drwxr-xr-x.  3 root root  4096 26. Sep 20:35 docker_v-apache-html
drwxr-xr-x.  3 root root  4096 26. Sep 20:35 docker_v-apache-log
drwx------.  6 root root  4096 26. Sep 20:40 .
-rw-------.  1 root root 32768 26. Sep 20:40 metadata.db
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Benutzeravatar
gehrke
Moderator
Moderator
Beiträge: 2114
Registriert: 10. Nov 2012, 11:00

Re: Unklare Docker Volumes

Beitrag von gehrke »

Ich markiere das hier mal als [Gelöst], auch wenn ich es noch nicht vollständig verstanden habe.

Es werden nun nur noch die Volumes erzeugt, die ich erwarte. Alle Daten sind verlustfrei migriert und die Volumes sind scheinbar geschützt davor, dass ein 'prune' unbeabsichtigt alle Daten löscht.
Keinen Bock mehr auf zentralisierte soziale Netzwerke von US-Konzernen?
Join the fediverse: https://fediverse.party/en/fediverse/
Antworten