Mysql
 sql >> Database >  >> RDS >> Mysql

Docker Machine su Mac:non riesci a vedere i volumi montati su Docker host/docker-machine? Dove vengono archiviati fisicamente i volumi?

Ok, ci sono un paio di punti che devono essere affrontati qui.

Cominciamo con cos'è un volume della finestra mobile (cerca di non pensare al tuo macbook o alla macchina vagabonda a questo punto. Tieni solo presente che le finestre mobili usano un filesystem diverso, ovunque possa risiedere a questo punto):forse immagina in questo modo, di per sé ogni volume in Docker è solo una parte del file system interno utilizzato dalla finestra mobile. I contenitori possono utilizzare questi volumi, come se fossero "piccoli dischi rigidi" che possono essere montati da loro e anche condivisi tra loro ( o montato da due di loro contemporaneamente, come montare una versione super veloce di un server ftp su due client o altro :P ).

In linea di massima puoi dichiarare questi volumi (ancora senza pensare al tuo computer/vagabondo stesso, solo alle finestre mobili;)) tramite l'istruzione VOLUME di Dockerfile. Esempio standard, esegui un contenitore di server web in questo modo:

FROM: nginx
VOLUME /www

Ora tutto ciò che va in /www può in teoria essere montato e smontato da un container e anche montato su più container. Ora Nginx da solo è noioso, quindi vogliamo che php esegua l'esecuzione sui file che nginx memorizza per produrre un contenuto più divertente. => Abbiamo bisogno di montare quel volume in un contenitore php-fpm. Ergo nel nostro file di composizione lo faremmo

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

=> voilà! ogni cartella dichiarata da una direttiva VOLUME nel contenitore nginx/web sarà visibile in quello php. Punto importante da notare qui, qualunque cosa sia in /www di nginx, sovrascriverà qualsiasi cosa php abbia in /www.Se metti :ro, php non può nemmeno scrivere in quella cartella :)

Ora avvicinandoti al tuo problema, c'è un secondo modo per dichiarare i volumi, che non richiede che vengano dichiarati nel Dockerfile. Questo può essere fatto montando i volumi dall'host (in questo caso il tuo oggetto vagabondo/boo2docker). Discutiamone come se stessimo girando prima su un Linux nativo.

Se dovessi inserire qualcosa come:

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

nel tuo docker-compose.yml, questo significherà che /home/myuser/folder sarà ora montato nel docker. Sovrascriverà tutto ciò che la finestra mobile ha in /cartella e, proprio come /www, sarà accessibile anche dalla cosa che lo ha dichiarato. Ora la macchina Linux su cui è in esecuzione il demone Docker.

Questo per quanto riguarda la teoria :), in effetti probabilmente hai solo bisogno dei seguenti consigli per far funzionare le tue cose :):

Il modo in cui boot2docker/docker-machine/kitematic e tutte queste cose affrontano il problema è semplicemente che prima di tutto montano semplicemente un volume nella macchina vagante sui contenitori docker e montano semplicemente anche questa cosa nel file system del tuo Mac , sperando che tutto si risolverà :P

Ora, per il problema pratico che tutti noi stiamo affrontando (o semplicemente cercando di aiutare i loro colleghi nel mondo del dolce e dolce Docker :P) su Mac sono le autorizzazioni. Voglio dire, pensaci (root o qualche altro utente gestisce i file nel contenitore, l'utente vagabondo potrebbe gestire i file nell'host vagabondo e quindi il tuo utente Mac "skalfyfan" gestisce quei file in Mac. Hanno tutti ID utente diversi e quant'altro => ne derivano molti problemi, e in qualche modo dipendono da cosa stai effettivamente eseguendo in Docker.Mysql e Apache sono particolarmente dolorosi, perché non vengono eseguiti come root all'interno del contenitore.Ciò significa che spesso hanno problemi a scrivere sul file Mac sistema.

Prima di provare il secondo approccio di seguito, prova semplicemente a mettere i volumi del tuo contenitore nella home directory del tuo Mac. Ciò risolverà i problemi con MySQL nella maggior parte dei casi, come ho riscontrato nel tempo. A proposito:Non è necessario dichiarare percorsi completi per i volumi ./folder va bene e viene letto rispetto al luogo in cui risiede il tuo docker-compose.yml!

Metti semplicemente il compose-yml nella cartella degli utenti Mac, questo è tutto ciò che conta. Nessun chmod 777 -R :P ti aiuterà qui, deve solo essere nella tua cartella home :)

Tuttavia alcune app (Apache per esempio) ti daranno ancora del filo da torcere. Il fatto che l'ID utente di tutto ciò che viene eseguito nel contenitore è diverso dall'ID utente del tuo Mac renderà la tua vita un inferno. Per aggirare questo problema, devi modificare l'ID utente e il gruppo di utenti in un modo che non sia in conflitto con le autorizzazioni del tuo Mac. Il gruppo che desideri su un Mac è staff, un UID che funziona sarebbe ad esempio 1000. Quindi potresti metterlo alla fine del tuo Dockerfile:

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

o

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

Quindi, come ora hai imparato:

Esatto, lo fa :)

Questo l'hai sbagliato :) Come spiegato, se non dai una cartella host, Docker persisterà questo percorso. Ma solo per questo contenitore e tutto rimarrà all'interno del file system della finestra mobile. Non viene scritto nulla all'host! Questo accadrà sempre solo se assegni una cartella host prima della cartella contenitore!

Spero che questo abbia aiutato :)