• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Unklare Docker Volumes

gehrke

Administrator
Teammitglied
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:
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:
# 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:
# 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:
# 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:
# 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
 
OP
gehrke

gehrke

Administrator
Teammitglied
OK, so langsam lichtet sich das Bild.

https://devops.stackexchange.com/questions/8571/volumes-not-mounting-with-docker-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:
[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...
 
OP
gehrke

gehrke

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

Code:
[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:
[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:
[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:
[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:
[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:
[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:
[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
 
OP
gehrke

gehrke

Administrator
Teammitglied
Wenigstens gelingt das Recovery - alles wieder da:
Code:
[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
 
OP
gehrke

gehrke

Administrator
Teammitglied
Prozedur noch einmal wiederholt, diesmal aber die alten Volumes von Hand gelöscht:
Code:
[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.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Ich glaub, ich hab's jetzt.

Änderung 1: Im docker-compose.yml werden die Volumes nicht mehr absolut angegeben:
Code:
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:
[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:
[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:
[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
 
OP
gehrke

gehrke

Administrator
Teammitglied
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.
 
Oben