Mysql
 sql >> база данни >  >> RDS >> Mysql

Docker Machine на Mac:Не можете да видите монтирани томове на docker host/docker-machine? Къде се съхраняват физически обеми?

Добре, има няколко точки, които трябва да бъдат разгледани тук.

Нека започнем с това какво представлява обемът на docker (Опитайте се да не мислите за вашия macbook или скитническата машина в този момент. Просто имайте предвид факта, че докерите използват различна файлова система, където и да се намира в този момент):Може би си представете така, сам по себе си всеки том в Docker е само част от вътрешната файлова система, която Docker използва. Контейнерите могат да използват тези томове, сякаш са "малки твърди дискове", които могат да бъдат монтирани от тях и също така споделени между тях ( или монтиран от двама от тях едновременно, като монтиране на супер бърза версия на някакъв ftp сървър към два клиента или каквото и да било :P ).

По принцип можете да декларирате тези томове (все още не мислите за самия компютър/скитник, а само за докерите;) ) чрез инструкцията VOLUME на Dockerfile. Стандартен пример, стартирайте един контейнер за уеб сървър по следния начин:

FROM: nginx
VOLUME /www

Сега всичко, което влиза в /www, на теория може да бъде монтирано и демонтирано от контейнер и също така да се монтира в множество контейнери. Сега Nginx сам по себе си е скучен, така че искаме да накараме php да работи над файловете, които nginx съхранява, за да създаде по-забавно съдържание. => Трябва да монтираме този том в някакъв php-fpm контейнер. Така че в нашия файл за композиране бихме направили това

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

=> воала! всяка папка, декларирана от директива VOLUME в nginx/web контейнера, ще бъде видима в php. Важна точка, която трябва да се отбележи тук, каквото и да е в /www на nginx, ще замени всичко, което php има в /www. Ако поставите :ro, php дори не може да пише в тази папка :)

Сега, приближавайки се до проблема ви, има втори начин за деклариране на томове, който не изисква те да бъдат декларирани в Dockerfile. Това може да стане чрез монтиране на томове от хоста (в този случай вашето нещо vagrant/boo2docker). Нека първо обсъдим това, сякаш работим с роден Linux.

Ако трябва да поставите нещо като:

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

във вашия docker-compose.yml, тогава това ще означава, че /home/myuser/folder вече ще бъде монтиран в docker. Той ще отмени всичко, което докерът има в /folder и точно както /www ще бъде достъпен от нещото, което го е декларирало. Сега Linux машината, на която работи докер демонът.

Толкова за теорията :), всъщност вероятно просто се нуждаете от следния съвет, за да вървите нещата :):

Начинът, по който boot2docker/docker-machine/kitematic и всички тези неща се справят с проблема е просто, че те на първо място просто монтират том в скитническата машина към докер контейнерите и просто също монтират това нещо във вашата файлова система на Mac , надявам се всичко да се оправи :P

Сега за практическия проблем, пред който всички ние, които използваме това (или просто се опитваме да помогнем на колегите си в света на сладкия Docker :P) на Mac, са изправени разрешенията. Имам предвид, че помислете за това ( root или някой друг потребител обработва файловете в контейнера, потребителят vagrant може да обработва файлове в хоста vagrant и след това вашият потребител на Mac "skalfyfan" обработва тези файлове в Mac. Всички те имат различни потребителски идентификатори и какво ли още не => с това възникват много проблеми и донякъде в зависимост от това какво всъщност изпълнявате в Docker. Mysql и Apache са особено болезнени, защото не се изпълняват като root в контейнера. Това означава, че често имат проблеми с записването в Mac файла система.

Преди да опитате втория подход по-долу, просто опитайте да поставите обемите на контейнерите си в домашната директория на Mac. Това ще разреши проблемите с MySQL в повечето случаи, както открих с течение на времето. Между другото:Няма нужда да декларирате пълни пътища до томовете ./folder е добре и се чете спрямо мястото, където се намира вашият docker-compose.yml! силно>

Просто поставете compose-yml в папката за потребители на Mac, това е всичко, което има значение. Никакъв chmod 777 -R :P няма да ви помогне тук, просто трябва да е в домашната ви папка :)

Все пак някои приложения (например Apache) ще ви затрудняват. Фактът, че потребителският идентификатор на всичко, което работи в контейнера, се различава от потребителския ви идентификатор на Mac, ще направи живота ви ад. За да заобиколите това, трябва да коригирате потребителския идентификатор, както и потребителската група по начин, който не противоречи на разрешенията на вашия Mac. Групата, която искате на Mac, е персонал, UID, който работи, би бил например 1000. Следователно можете да поставите това в края на вашия Dockerfile:

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

или

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

И така, както вече научихте:

Точно така, прави това :)

Това сте сбъркали :) Както беше обяснено, ако не дадете хост папка, тогава Docker ще запази този път. Но само за този контейнер и всичко ще остане във файловата система на docker. На хоста изобщо не се пише нищо! Това винаги ще се случва само ако дадете хост папка преди папката контейнер!

Надявам се това да е помогнало :)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да стартирам MySQL команда на bash?

  2. SUM(подзаявка) в MYSQL

  3. MySQL CONVERT_TZ()

  4. Как да направя друга колона за автоматично увеличение на MySQL?

  5. Mysql връща неправилен bigint резултат с една, много странна грешка