sql >> Base de Datos >  >> RDS >> Mysql

Docker Machine en Mac:¿No se pueden ver los volúmenes montados en docker host/docker-machine? ¿Dónde se almacenan físicamente los volúmenes?

Bien, hay un par de puntos que deben abordarse aquí.

Comencemos con lo que es un volumen docker (Trate de no pensar en su macbook o en la máquina vagabunda en este punto. Solo tenga en cuenta el hecho de que los dockers usan un sistema de archivos diferente, donde sea que resida en este punto):tal vez imagine Es así, en sí mismo, cada volumen en Docker es solo una parte del sistema de archivos interno que usa Docker. Los contenedores pueden usar estos volúmenes, como si fueran "pequeños discos duros" que pueden montar y también compartir entre ellos ( o montado por dos de ellos al mismo tiempo, como montar una versión súper rápida de algún servidor ftp a dos clientes o lo que sea :P ).

En principio, puede declarar estos volúmenes (todavía sin pensar en su computadora/vagrant en sí mismo, solo en los acopladores;)) a través de la instrucción VOLUME de Dockerfile. Ejemplo estándar, ejecute un contenedor de servidor web así:

FROM: nginx
VOLUME /www

Ahora, en teoría, todo lo que entra en /www puede montarse y desmontarse de un contenedor y también montarse en varios contenedores. Ahora, Nginx solo es aburrido, por lo que queremos que php ejecute los archivos que almacena nginx para producir contenido más divertido. => Necesitamos montar ese volumen en algún contenedor php-fpm. Ergo, en nuestro archivo de redacción haríamos esto

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

=> ¡voilá! cada carpeta declarada por una directiva VOLUME en el contenedor nginx/web será visible en el php. Punto importante a tener en cuenta aquí, lo que sea que esté en /www de nginx, anulará lo que php tenga en /www. Si coloca :ro, php ni siquiera podrá escribir en esa carpeta :)

Ahora, acercándonos a su problema, hay una segunda forma de declarar volúmenes, que no requiere que se declaren en el Dockerfile. Esto se puede hacer montando volúmenes desde el host (en este caso, su cosita vagabunda/boo2docker). Analicemos esto como si primero estuviéramos ejecutando en un Linux nativo.

Si pusieras algo como:

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

en su docker-compose.yml, esto significará que /home/myuser/folder ahora se montará en la ventana acoplable. Anulará lo que tenga la ventana acoplable en /folder y, al igual que /www, también será accesible desde lo que lo declaró. Ahora la máquina Linux en la que se ejecuta el demonio docker.

Hasta aquí la teoría :), de hecho, probablemente solo necesites los siguientes consejos para que tus cosas funcionen :):

La forma en que boot2docker/docker-machine/kitematic y todas estas cosas resuelven el problema es simplemente que primero montan un volumen en la máquina vagabunda en los contenedores de la ventana acoplable, y simplemente también montan esta cosa en el sistema de archivos de su Mac. , esperando que todo salga bien :P

Ahora, el problema práctico al que nos enfrentamos todos los que usamos esto (o simplemente intentamos ayudar a nuestros compañeros de trabajo en el mundo del dulce dulce Docker:P) en Mac es el de los permisos. Quiero decir, piénselo (root u otro usuario maneja archivos en el contenedor, el usuario vagabundo puede manejar archivos en el host vagabundo y luego su usuario de Mac "skalfyfan" maneja esos archivos en Mac. Todos tienen diferentes ID de usuario y otras cosas => muchos problemas surgen con eso, y un poco dependiendo de lo que realmente esté ejecutando en Docker.Mysql y Apache son especialmente dolorosos, porque no se ejecutan como root dentro del contenedor.Esto significa que a menudo tienen problemas para escribir en el archivo Mac sistema.

Antes de probar el segundo enfoque a continuación, simplemente intente colocar los volúmenes de su contenedor en el directorio de inicio de su Mac. Esto resolverá los problemas con MySQL en la mayoría de los casos, como he encontrado a lo largo del tiempo. Por cierto: ¡No es necesario declarar rutas completas a los volúmenes ./la carpeta está bien y se lee en relación con el lugar donde reside su docker-compose.yml!

Simplemente coloque el compose-yml en la carpeta de usuarios de su Mac, eso es todo lo que importa. No chmod 777 -R :P te ayudará aquí, solo necesita estar en tu carpeta de inicio :)

Aún así, algunas aplicaciones (Apache, por ejemplo) aún te harán pasar un mal rato. El hecho de que la identificación de usuario de lo que sea que se ejecute en el contenedor difiera de su identificación de usuario de Mac hará que su vida sea un infierno. Para evitar esto, debe ajustar la identificación del usuario y el grupo de usuarios de una manera que no entre en conflicto con los permisos de su Mac. El grupo que desea en una Mac es personal, un UID que funciona sería, por ejemplo, 1000. Por lo tanto, podría poner esto al final de su Dockerfile:

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

o

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

Entonces, como ya has aprendido:

Justo en ese momento, lo hace :)

Este se equivocó :) Como se explicó, si no proporciona una carpeta de host, Docker persistirá en esta ruta. Pero solo para este contenedor y todo permanecerá dentro del sistema de archivos docker. ¡Nada está escrito para el host en absoluto! ¡Esto siempre sucederá si proporciona una carpeta de host antes de la carpeta contenedora!

Espero que esto haya ayudado :)