Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Docker Machine no Mac:Não é possível ver os volumes montados no host do docker/docker-machine? Onde os volumes são armazenados fisicamente?


Ok, há alguns pontos que precisam ser abordados aqui.

Vamos começar com o que é um volume do docker (tente não pensar no seu macbook ou na máquina vagrant neste momento. Apenas esteja ciente do fato de que os dockers usam um sistema de arquivos diferente, onde quer que ele resida neste ponto):Talvez imagine assim, por si só cada volume no Docker é apenas uma parte do sistema de arquivos interno que o docker usa. Os containers podem usar esses volumes, como se fossem "pequenos discos rígidos" que podem ser montados por eles e também compartilhados entre eles ( ou montado por dois deles ao mesmo tempo, como montar uma versão super rápida de algum servidor ftp para dois clientes ou qualquer outra coisa :P ).

Em princípio, você pode declarar esses volumes (ainda não pensando no seu computador/vagrant, apenas nos dockers;)) por meio da instrução VOLUME do Dockerfile. Exemplo padrão, execute um contêiner de servidor da Web assim:
FROM: nginx
VOLUME /www

Agora tudo o que vai para /www pode, em teoria, ser montado e desmontado de um container e também montado em vários containers. Agora, o Nginx sozinho é chato, então queremos que o php passe por cima dos arquivos que o nginx armazena para produzir um conteúdo mais divertido. => Precisamos montar esse volume em algum container php-fpm. Ergo em nosso arquivo de composição, faríamos isso
web:
  image: nginx
php:
  image: php-fpm
  volumes_from:
    - web

=> voilá! cada pasta declarada por uma diretiva VOLUME no contêiner nginx/web será visível no php. Ponto importante a ser observado aqui, o que estiver no /www do nginx, substituirá o que o php tiver em /www. Se você colocar o :ro, o php não poderá nem escrever nessa pasta :)

Agora, aproximando-se do seu problema, há uma segunda maneira de declarar volumes, que não exige que eles sejam declarados no Dockerfile. Isso pode ser feito montando volumes do host (neste caso, seu vagrant/boo2docker). Vamos discutir isso como se estivéssemos rodando em um Linux nativo primeiro.

Se você colocar algo como:
volumes:
 - /home/myuser/folder:/folder

em seu docker-compose.yml, isso significa que /home/myuser/folder agora será montado no docker. Ele substituirá o que o docker tiver na pasta / e, assim como o / www, também será acessível a partir da coisa que o declarou. Agora a máquina Linux em que o daemon docker está sendo executado.

Tanto para a teoria :), na verdade, você provavelmente só precisa do seguinte conselho para fazer suas coisas :):

A maneira como boot2docker/docker-machine/kitematic e todas essas coisas lidam com o problema é simplesmente que, antes de tudo, eles apenas montam um volume na máquina vagrant para os contêineres do docker, e eles simplesmente também montam essa coisa em seu sistema de arquivos Mac , esperando que tudo dê certo :P

Agora, para o problema prático que todos nós usando isso (ou apenas tentando ajudar seus colegas de trabalho no mundo do doce doce Docker :P) no Mac estamos enfrentando são as permissões. Quero dizer, pense sobre isso ( root ou algum outro usuário lida com arquivos no contêiner, o usuário vagrant pode manipular arquivos no host vagrant e, em seguida, seu usuário Mac "skalfyfan" lida com esses arquivos no Mac. Todos eles têm IDs de usuário diferentes e outros enfeites => muitos problemas acontecem com isso, e um pouco dependendo do que você está realmente executando no Docker. Mysql e Apache são especialmente dolorosos, porque eles não são executados como root dentro do contêiner. Isso significa que eles geralmente têm problemas para gravar no arquivo Mac sistema.

Antes de tentar a segunda abordagem abaixo, simplesmente tente colocar seus volumes de contêiner no diretório inicial do Mac. Isso resolverá problemas com o MySQL na maioria dos casos, como descobri ao longo do tempo. Btw:Não há necessidade de declarar caminhos completos para volumes ./folder é bom e lido em relação ao local em que seu docker-compose.yml reside!

forte>

Basta colocar o compose-yml na pasta de usuários do Mac, isso é tudo o que importa. No chmod 777 -R :P vai te ajudar aqui, só precisa estar na sua pasta pessoal :)

Ainda assim, alguns aplicativos ( Apache, por exemplo ) ainda lhe darão um tempo difícil. O fato de que o ID de usuário de tudo o que é executado no contêiner difere do seu ID de usuário do Mac tornará sua vida um inferno. Para contornar isso, você precisa ajustar o ID do usuário e o grupo de usuários de uma maneira que não entre em conflito com as permissões do seu Mac. O grupo que você quer em um Mac é staff, um UID que funciona seria, por exemplo, 1000. Portanto, você poderia colocar isso no final do seu Dockerfile:
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

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

Então, como você aprendeu agora:

Pronto, faz isso :)

Este você errou :) Como explicado, se você não fornecer uma pasta de host, o Docker persistirá nesse caminho. Mas apenas para este contêiner e todos permanecerão dentro do sistema de arquivos do docker. Nada é escrito para o host! Isso sempre acontecerá apenas se você fornecer uma pasta de host antes da pasta do contêiner!

Espero que isso tenha ajudado :)