Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Docker Machine na Macu:Nie widzisz zamontowanych woluminów na hoście dockera/docker-machine? Gdzie są fizycznie przechowywane woluminy?

Ok, jest tu kilka kwestii, którymi należy się zająć.

Zacznijmy od tego, czym jest wolumin dokowany (staraj się nie myśleć w tym momencie o swoim Macbooku lub włóczęgiej maszynie. Po prostu pamiętaj, że doki używają innego systemu plików, gdziekolwiek może się znajdować w tym momencie):Może wyobraź sobie to w ten sposób, każdy wolumin w Dockerze sam w sobie jest tylko częścią wewnętrznego systemu plików, którego używa Docker. lub montowany przez dwóch z nich w tym samym czasie, jak montowanie superszybkiej wersji jakiegoś serwera ftp na dwóch klientach lub cokolwiek innego :P ).

Zasadniczo możesz zadeklarować te woluminy (wciąż nie myśląc o swoim komputerze/sam włóczędze, tylko o oknach dokujących;) ) za pomocą instrukcji VOLUME pliku Dockerfile. Standardowy przykład, uruchom jeden kontener serwera WWW, tak jak:

FROM: nginx
VOLUME /www

Teraz wszystko, co wchodzi do /www, może teoretycznie być montowane i odłączane z kontenera, a także montowane do wielu kontenerów. Teraz sam Nginx jest nudny, więc chcemy, aby php uruchamiało pliki, które przechowuje nginx, aby stworzyć bardziej zabawną zawartość. => Musimy zamontować ten wolumin do jakiegoś kontenera php-fpm.Ergo w naszym pliku Compose zrobimy to

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

=> voila! każdy folder zadeklarowany przez dyrektywę VOLUME w kontenerze nginx/web będzie widoczny w php. Ważna uwaga, o której należy pamiętać, to, co znajduje się w /www nginx, nadpisze to, co php ma w /www.Jeśli umieścisz :ro, php nie będzie nawet mogło pisać do tego folderu :)

Teraz zbliżając się do twojego problemu, istnieje drugi sposób deklarowania woluminów, który nie wymaga ich deklarowania w pliku Dockerfile. Można to zrobić montując woluminy z hosta (w tym przypadku twój włóczęga/boo2docker). Porozmawiajmy o tym tak, jakbyśmy najpierw używali natywnego Linuksa.

Gdybyś miał umieścić coś takiego:

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

w twoim docker-compose.yml, oznacza to, że /home/myuser/folder zostanie teraz zamontowany w dockerze. Zastąpi wszystko, co docker ma w /folder i podobnie jak /www będzie również dostępny z elementu, który go zadeklarował. Teraz maszyna z Linuksem, na której działa demon Docker.

Tyle teorii :), w rzeczywistości prawdopodobnie potrzebujesz tylko następujących rad, aby zacząć działać :):

Sposób, w jaki boot2docker/docker-machine/kitematic i wszystkie te rzeczy radzą sobie z tym problemem, jest po prostu taki, że najpierw po prostu montują wolumin w wędrującej maszynie do kontenerów dockera, a następnie po prostu montują to w systemie plików Mac , mam nadzieję, że wszystko się ułoży :P

Teraz praktyczny problem, z którym wszyscy z tego korzystamy (lub po prostu próbujemy pomóc swoim współpracownikom w świecie słodkiego, słodkiego Dockera :P) na Macu, to uprawnienia. Mam na myśli to, że pomyśl o tym (root lub inny użytkownik obsługuje pliki w kontenerze, użytkownik włóczęgi może obsługiwać pliki na hoście włóczęgi, a następnie twój użytkownik Mac "skalfyfan" obsługuje te pliki na Macu. Wszystkie mają różne identyfikatory użytkownika i co nie => wynika z tego wiele problemów, w zależności od tego, co faktycznie działa w Docker.Mysql i Apache są szczególnie bolesne, ponieważ nie działają jako root w kontenerze.Oznacza to, że często mają problemy z zapisem do pliku Mac system.

Przed wypróbowaniem drugiego podejścia poniżej po prostu spróbuj umieścić woluminy kontenerów w katalogu domowym Maca. To rozwiąże problemy z MySQL w większości przypadków, jak odkryłem z biegiem czasu. Btw:Nie ma potrzeby deklarowania pełnych ścieżek do woluminów ./folder jest w porządku i jest odczytywany względem miejsca, w którym znajduje się twój docker-compose.yml!

Po prostu umieść compose-yml w folderze użytkowników komputerów Mac, to wszystko, co się liczy. Żaden chmod 777 -R :P ci tu nie pomoże, po prostu musi być w twoim katalogu domowym :)

Mimo to niektóre aplikacje (na przykład Apache) nadal będą sprawiać trudność. Fakt, że identyfikator użytkownika tego, co działa w kontenerze, różni się od identyfikatora użytkownika komputera Mac, sprawi, że twoje życie stanie się piekłem. Aby obejść ten problem, musisz dostosować identyfikator użytkownika oraz grupę użytkowników w sposób, który nie koliduje z uprawnieniami komputera Mac. Grupa, którą chcesz na Macu, to personel, UID, który działa, to na przykład 1000. Dlatego możesz umieścić to na końcu pliku Dockerfile:

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

lub

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

Jak się teraz dowiedziałeś:

Właśnie tak robi :)

W tym się pomyliłeś :) Jak wyjaśniono, jeśli nie podasz folderu hosta, Docker zachowa tę ścieżkę. Ale tylko dla tego kontenera i wszystko pozostanie w systemie plików dockera. W ogóle nic nie jest napisane do gospodarza! Stanie się tak zawsze tylko wtedy, gdy podasz folder hosta przed folderem kontenera!

Mam nadzieję, że to pomogło :)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapełnić bazę danych tylko raz przed metodami @Test w teście wiosennym?

  2. Czy można policzyć dwie kolumny w tym samym zapytaniu?

  3. JSON_SET() vs JSON_INSERT() vs JSON_REPLACE() w MySQL:jaka jest różnica?

  4. Czy usunięcie tabeli w MySQL powoduje również usunięcie indeksów?

  5. Wydajność w PDO / PHP / MySQL:transakcja a wykonanie bezpośrednie