Pourquoi Docker-Machine efface-t-il les données au redémarrage?

9

J'utilise Docker Toolbox sur OSX.

J'ai créé un conteneur de volume de données pour stocker les données persistantes: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

J'ai vérifié que ces données sont bien stockées sur la VM boot2docker (créée par docker-machine) et non sur le conteneur, afin qu'elles persistent. Cependant, le «redémarrage de la station d'accueil» efface ces données personnalisées sur le VM.

Je ne trouve pas de documentation sur ce qui se passe. J'ai trouvé un message sur le forum mentionnant que les données dans / var / lib / docker seront préservées, mais je n'ai trouvé aucun document officiel indiquant cela et cela semble également étrange étant donné que le guide de stockage persistant ci-dessus n'utilise pas ce chemin ou même mentionne que vos données seront supprimées.

Est-ce prévu et dans l'affirmative, existe-t-il une documentation officielle sur le chemin correct pour stocker les données persistantes?


Edit: Ajout d'un exemple de senario défaillant

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory
Gerry
la source

Réponses:

8

Cela devrait certainement fonctionner:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Pouvez-vous développer davantage les étapes pour reproduire votre problème?

boot2docker a un système de fichiers en lecture seule (sera effacé au redémarrage) à l'exception de:

  1. Conteneurs et leurs données (volumes) - c'est ce que vous lisez /var/lib/docker
  2. Images Docker
  3. Configuration de Docker (par exemple, /var/lib/boot2docker/profileoù les drapeaux du démon peuvent être modifiés)
nathanleclaire
la source
Bonjour, je viens de suggérer une modification de votre réponse. Vouliez-vous spécifier l'image de la boîte occupée dans les commandes de 2e, 3e et 4e exécution? Sans cela, Docker essaie de télécharger des images appelées "sh" et "cat" qui, je le soupçonne, ne correspondent pas à ce que vous vouliez. J'ajouterai un exemple défaillant ci-dessus.
Gerry
Merci de votre aide. Vous et @ mc0e avez tous deux aidé avec celui-ci, je vous ai donc donné la coche et lui la prime (ainsi qu'un +1 pour les deux). J'espère que vous considérez cela comme juste.
Gerry
1
Ah oui, mal tapé. Désolé pour la faute de frappe.
nathanleclaire
Aucune excuse nécessaire. Je vérifiais simplement pour m'assurer que je n'avais pas mal compris. Merci pour toute votre aide.
Gerry
6

Je n'utilise pas boot2docker, mais si / data est effacé au redémarrage, c'est là que votre volume est stocké ( docker run -v /data:/var/lib/mysql), donc il sera perdu.

Ce que vous faites, c'est également combiner deux modèles différents pour gérer la persistance du volume. Afin d'obtenir la persistance, les conteneurs peuvent monter des volumes à partir d'un emplacement spécifié sur le système hôte (qui est présumé être persistant), ou ils peuvent être associés à un conteneur de données et montés avec --volumes-from. Il semble que l'approche du système de fichiers hôte ne soit pas appropriée pour boot2docker, et vous devez utiliser le modèle de volume de données (uniquement).

Vraisemblablement, vous devriez créer votre conteneur de données avec -v /var/lib/mysqlplutôt que -v /data:/var/lib/mysql.

mc0e
la source
La création d'un volume à l'aide de l'indicateur -v, puis l'utilisation de volumes de ce conteneur dans d'autres conteneurs à l'aide de --volumes-from est exactement ce que la documentation montre cependant: docs.docker.com/userguide/dockervolumes/… Je m'attendrais à ce que si -v / location sait qu'il doit être relatif à / var / lib / docker / volumes, alors l'ajout de deux points ne devrait pas changer cela. À tout le moins, cela n'est pas intuitif. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Il semble également que les documents mysql-docker devraient être mis à jour: hub.docker.com/_/mysql/#caveats
Gerry
Merci de votre aide. Vous et @nathanleclaire avez tous deux aidé avec celui-ci, donc je vous ai donné la prime (car cela vaut plus) et j'ai donné la coche à nathanleclaire (ainsi qu'un +1 pour les deux). J'espère que vous pensez que c'est juste.
Gerry
@Gerry Il est certainement conseillé de créer un volume puis de l'utiliser via --volumes-from. Le montage de l'éphémère / des données sur votre conteneur ne l'est pas.
mc0e
Ouais, le problème est que je ne savais pas / les données étaient éphémères jusqu'à ce que je redémarre.
Gerry
0

Notez que j'utilise docker pour mac beta qui utilise le xhyve vm.

Le contenu de / var / lib / boot2docker sera conservé entre les redémarrages de la machine. Donc, si vous voulez que certains fichiers soient disponibles sur votre VM, mettez-les dans ce répertoire.

Si vous souhaitez qu'ils soient accessibles dans un emplacement différent pour exécuter les conteneurs Docker, vous pouvez ajouter ce qui suit à / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Si vous souhaitez ajouter une autre configuration aux fichiers système qui persistera entre les redémarrages de VM, comme des valeurs supplémentaires dans votre fichier d'hôtes, vous pouvez ajouter une commande telle que celle ci-dessous à / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

J'espère que cela aide

baoluofu
la source