Mysql
 sql >> Base de données >  >> RDS >> Mysql

Docker Machine sur Mac :Impossible de voir les volumes montés sur l'hôte docker/la machine docker ? Où sont physiquement stockés les volumes ?

Ok, il y a quelques points qui doivent être abordés ici.

Commençons par ce qu'est un volume de docker (essayez de ne pas penser à votre macbook ou à la machine vagabonde à ce stade. Gardez simplement à l'esprit le fait que les dockers utilisent un système de fichiers différent, où qu'il puisse résider à ce stade):peut-être imaginez comme ça, en soi, chaque volume de Docker n'est qu'une partie du système de fichiers interne utilisé par Docker. Les conteneurs peuvent utiliser ces volumes, comme s'il s'agissait de "petits disques durs" qui peuvent être montés par eux et également partagés entre eux ( ou monté par deux d'entre eux en même temps, comme monter une version ultra rapide d'un serveur ftp sur deux clients ou autre :P ).

En principe, vous pouvez déclarer ces volumes (toujours sans penser à votre ordinateur/vagabond lui-même, juste les dockers ;)) via l'instruction VOLUME du Dockerfile. Exemple standard, exécutez un conteneur de serveur Web comme ceci :

FROM: nginx
VOLUME /www

Maintenant, tout ce qui entre dans /www peut en théorie être monté et démonté d'un conteneur et également monté sur plusieurs conteneurs. Maintenant, Nginx seul est ennuyeux, nous voulons donc que php s'exécute sur les fichiers stockés par nginx pour produire du contenu plus amusant. => Nous devons monter ce volume dans un conteneur php-fpm.Ergo dans notre fichier de composition, nous ferions ceci

web:
  image: nginx
php:
  image: php-fpm
  volumes_from:
    - web

=> voila ! chaque dossier déclaré par une directive VOLUME dans le conteneur nginx/web sera visible dans celui php. Point important à noter ici, tout ce qui se trouve dans /www de nginx écrasera tout ce que php a dans /www.Si vous mettez le :ro, php ne peut même pas écrire dans ce dossier :)

Passant maintenant à votre problème, il existe une deuxième façon de déclarer des volumes, qui ne nécessite pas qu'ils soient déclarés dans le Dockerfile. Cela peut être fait en montant des volumes à partir de l'hôte (dans ce cas, votre truc vagrant/boo2docker). Discutons-en comme si nous utilisions d'abord un Linux natif.

Si vous deviez mettre quelque chose comme :

volumes:
 - /home/myuser/folder:/folder

dans votre docker-compose.yml, cela signifiera que /home/myuser/folder sera maintenant monté dans le docker. Il remplacera tout ce que le docker a dans /folder et tout comme le /www sera également accessible à partir de la chose qui l'a déclaré. Maintenant, la machine Linux sur laquelle le démon docker s'exécute.

Voilà pour la théorie :), en fait vous n'avez probablement besoin que des conseils suivants pour faire avancer vos affaires :) :

La façon dont boot2docker/docker-machine/kitematic et toutes ces choses traitent le problème est simplement qu'ils montent tout d'abord un volume dans la machine vagabonde sur les conteneurs docker, et ils montent simplement aussi cette chose dans votre système de fichiers Mac , en espérant que tout ira bien :P

Maintenant, pour le problème pratique, nous tous qui utilisons ceci (ou essayons simplement d'aider leurs collègues dans le monde de Sweet Sweet Docker :P) sur Mac sont confrontés à des autorisations. Je veux dire, pensez-y (root ou un autre utilisateur gère les fichiers dans le conteneur, l'utilisateur vagabond peut gérer les fichiers dans l'hôte vagabond, puis votre utilisateur Mac "skalfyfan" gère ces fichiers dans Mac. Ils ont tous des identifiants d'utilisateur différents et ainsi de suite => de nombreux problèmes s'ensuivent avec cela, et quelque peu en fonction de ce que vous exécutez réellement dans Docker.Mysql et Apache sont particulièrement pénibles, car ils ne s'exécutent pas en tant que root dans le conteneur.Cela signifie qu'ils ont souvent du mal à écrire dans le fichier Mac système.

Avant d'essayer la deuxième approche ci-dessous, essayez simplement de placer vos volumes de conteneur sous votre répertoire d'accueil Mac. Cela résoudra les problèmes avec MySQL dans la plupart des cas, comme je l'ai constaté au fil du temps.Btw :Pas besoin de déclarer des chemins complets vers les volumes./folder est correct et lu par rapport à l'endroit où réside votre docker-compose.yml ! fort>

Placez simplement le compose-yml dans le dossier des utilisateurs de votre Mac, c'est tout ce qui compte. Aucun chmod 777 -R :P ne vous aidera ici, il doit juste être sous votre dossier personnel :)

Pourtant certaines applications (Apache par exemple) vous donneront encore du fil à retordre. Le fait que l'identifiant d'utilisateur de tout ce qui s'exécute dans le conteneur diffère de votre identifiant d'utilisateur Mac rendra votre vie infernale. Pour contourner ce problème, vous devez ajuster l'ID utilisateur ainsi que le groupe d'utilisateurs d'une manière qui n'entre pas en conflit avec les autorisations de votre Mac. Le groupe que vous voulez sur un Mac est staff, un UID qui fonctionne serait par exemple 1000. Vous pouvez donc mettre ceci à la fin de votre Dockerfile :

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

ou

RUN usermod -u 1000 mysql
RUN usermod -G staff mysql

Donc, comme vous l'avez maintenant appris :

Tout de suite, ça fait ça :)

Celui-ci vous vous êtes trompé :) Comme expliqué, si vous ne donnez pas de dossier hôte, Docker conservera ce chemin. Mais uniquement pour ce conteneur et tout restera dans le système de fichiers Docker. Rien n'est écrit à l'hôte du tout ! Cela ne se produira toujours que si vous donnez un dossier hôte avant le dossier conteneur !

J'espère que cela a aidé :)