2015-11-06 8 views
10

Jestem na laptopie Macbook Pro i pracuję pod maszyna dokujaca (0.5.0) i doker-compose (1.5.0) aby moje pojemniki działały.Docker Machine na Macu: Nie widzisz zamontowanych woluminów na hoście dokera/docker-maszynie? Gdzie są fizycznie przechowywane objętości?

Oznacza to, że używam maszyny do dokowania do tworzenia maszyn wirtualnych HOST na moim bootboksie, które będą uruchamiać mojego demona docker i hostować wszystkie moje kontenery.

Myślę, że brakuje mi czegoś krytycznego w koncepcji HOSTS i VOLUME, ponieważ odnoszą się one do Docker i dokumentacji.

To jest mój plik doker-compose.yml (web po prostu buduje PHP: 5,6-apache zdjęciem):

web: 
    restart: "always" 
    build: ./docker-containers/web 
    ports: 
    - "8080:80" 
    volumes: 
    - ./src:/var/www/html 
    links: 
    - mysql:mysql 

mysql: 
    restart: "always" 
    image: mysql:5.7 
    volumes_from: 
    - data 
    ports: 
    - "3306:3306" 
    environment: 
    - MYSQL_ROOT_PASSWORD=XXX 

data: 
    restart: "no" 
    image: mysql:5.7 
    volumes: 
    - /var/lib/mysql 
    command: "true" 

Docker Utwórz plik dokumentację, o objętości jest tutaj: http://docs.docker.com/compose/compose-file/

Stwierdza dla woluminy - Montuj ścieżki jako woluminy, opcjonalnie określając ścieżkę na komputerze hosta (HOST: CONTAINER) lub tryb dostępu (HOST: CONTAINER: ro).

HOST w tym przypadku odnosi się do mojej maszyny wirtualnej utworzonej przez docker-machine, zgadza się? Lub mój lokalny system plików macbook? Montowanie ścieżki na mojej maszynie wirtualnej do kontenera?

Pod internetowej oświadczam:

volumes: 
    - ./src:/var/www/html 

i to jest mapowanie mój lokalny system plików macbook ./src folder na moim MacBook Pro do mojego pojemnika internetowej. Jeśli moje zrozumienie jest poprawne, czy nie powinien on mapować folderu ./src na moim VM do /var/www/html wewnątrz kontenera WWW ?! Teoretycznie uważam, że powinienem być zobowiązany do skopiowania mojego lokalnego folderu systemu plików mac ./src do mojej maszyny wirtualnej, a następnie wykonuję deklarację woluminu. Wygląda na to, że docker-compose magicznie robi to wszystko naraz? mylić

Wreszcie, widzimy, że tworzę kontener danych tylko do przechowywania moich danych mysql. Mam oświadczył:

volumes: 
    - /var/lib/mysql 

Nie powinno to doprowadzić do utworzenia var/lib/ folderu /mysql na mój gospodarz boot2docker VM i mogłem następnie przejdź do tego folderu na VM, tak/nie? Kiedy używam maszyny-dokowania do ssh do mojego komputera, a następnie nawiguję do /var/lib, w ogóle jest folder mysql NIE ?! Dlaczego nie jest tworzony? Czy jest coś nie tak z moją konfiguracją? :/

Z góry dziękuję! Wszelkie wyjaśnienia co do tego, co robię źle tutaj, byłyby bardzo mile widziane!

+0

Czy http://stackoverflow.com/questions/23439126/how-to-mount-host-directory-in-docker-container/33404132#33404132 odpowiedzieć na to pytanie? – Eli

Odpowiedz

10

Jest kilka punktów, które należy omówić tutaj.

Zacznijmy od tego, czym jest objętość doków w doku (spróbuj nie myśleć o swoim macbooku lub maszynie włóczęgi w tym momencie.Tylko pamiętaj o tym, że dokerzy używają innego systemu plików, gdziekolwiek on może znajdować się w tym momencie): Może to sobie wyobrazić, sam w sobie każdy wolumin w Dockerze jest tylko częścią wewnętrznego systemu dokowania wewnętrznego systemu plików . Kontenery mogą korzystać z tych woluminów, tak jakby były "małymi dyskami twardymi", które mogą być przez nich montowane, a także współdzielone między nimi (lub montowane przez dwa z nich w tym samym czasie, np. Montowanie superszybkiej wersji niektórych serwerów FTP do dwóch klienci lub cokolwiek: P).

Zasadniczo możesz zadeklarować te woluminy (wciąż nie myśląc o swoim komputerze/samym włóczącym, tylko o dokerach;)) za pomocą instrukcji VOLUME Dockerfile. Standardowy przykład uruchomić jeden pojemnik webserver tak:

FROM: nginx 
VOLUME /www 

Teraz wszystko, co idzie do/www może teoretycznie być montowany i odmontowany z pojemnika i zamontowane również do wielu pojemników. Sam Nginx jest nudny, więc chcemy, aby php działało na plikach, które przechowuje nginx, tworząc ciekawą treść. => Musimy zamontować ten wolumin do jakiegoś kontenera php-fpm. Ergo w naszym pliku redagowania chcielibyśmy zrobić 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żne, aby zwrócić uwagę, że cokolwiek znajduje się na stronie nginx/www, zastąpi to, co php ma na/www. Jeśli umieścisz: ro, php nie może nawet napisać do tego folderu :)

Teraz zbliżamy się do twojego problemu, istnieje drugi sposób deklarowania woluminów, który nie wymaga ich zadeklarowania w pliku Docker. Można to zrobić, montując woluminy z hosta (w tym przypadku twój vagrant/boo2docker). Porozmawiajmy o tym tak, jakbyśmy najpierw uruchomili natywny Linux.

Jeśli było umieścić coś takiego:

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

w swojej Döcker-compose.yml, to będzie oznaczać, że/home/myuser/folder będzie teraz zamontowany w dokowanym. Zastąpi to wszystko, co docker ma w/folderze i podobnie jak/www będzie dostępne także od rzeczy, które je zadeklarowały. Teraz maszyna Linux, na której działa demon dockera.

Tyle teorii :), w rzeczywistości prawdopodobnie wystarczy następujące informacje, aby uzyskać rzeczy dzieje :):

Sposób boot2docker/doker automatyczna/kitematic i wszystkie te rzeczy do czynienia z problemem jest po prostu, że najpierw montują oni wolumin w maszynie włóczęgowej do kontenerów doków, a oni po prostu także montują to do systemu plików Mac, mając nadzieję, że wszystko się uda: P

Teraz dla praktycznych Problemem jest to, że wszyscy, którzy używamy tego (lub po prostu staramy się pomóc swoim współpracownikom w świecie słodkiego słodkiego Dockera: P) na Macu, stajemy przed prawem. Myślę o tym (root lub jakiś inny użytkownik obsługuje pliki w kontenerze, użytkownik vagrant może obsługiwać pliki w hostingu vagrant, a następnie użytkownik Macintosh "skalfyfan" obsługuje te pliki na komputerze Mac. Wszystkie mają różne identyfikatory użytkownika i whatnot = > z tym wiąże się wiele problemów, a w pewnym stopniu zależy to od tego, co faktycznie robisz w Dockerze Mysql i Apache są szczególnie bolesne, ponieważ nie działają jako root w kontenerze, co oznacza, że ​​często mają problem z zapisaniem do pliku Mac

Przed próbą drugiego podejścia poniżej, po prostu spróbuj umieścić swoje objętości pojemników pod swoim katalogiem osobistym Mac. To rozwiąże problemy z MySQL w większości przypadków, jak znalazłem w czasie. Przy okazji: Nie trzeba zadeklarować pełnych ścieżek do woluminów ./folder jest w porządku i odczytywany w odniesieniu do miejsca, w którym znajduje się plik docker-compose.yml!

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

Nadal niektóre aplikacje (na przykład Apache) nadal będą ci ciężko pracować. Fakt, że identyfikator użytkownika tego, co działa w kontenerze, różni się od identyfikatora użytkownika Maca, sprawi, że twoje życie stanie się piekłem. Aby obejść ten problem, musisz dostosować identyfikator użytkownika, a także grupę użytkowników, w sposób niezgodny z uprawnieniami Twojego komputera Mac. Grupa chcesz na Mac jest personel, UID, który działa byłoby na przykład 1000. Stąd można umieścić to w końcu Dockerfile:

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

lub

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

Więc jak masz teraz dowiedział:

teoretycznie Chyba powinno być wymagane, aby skopiować moje lokalnego pliku mac systemu folderu ./src do mojego VM, a potem zrobić to objętość deklaracja. Wygląda na to, że docker-compose w magiczny sposób robi to wszystko na raz: ?

Prawo na to robi :)

Wreszcie możemy zobaczyć, że tworzę kontener danych tylko utrzymują moich danych MySQL. Mam oświadczył: tomy: -/var/lib/mysql

To jeden masz źle :) Jak wyjaśniono, jeśli nie dać folder hosta, a następnie Docker będzie utrzymywać tę ścieżkę. Ale tylko dla tego kontenera i wszystkich pozostanie w systemie plików dokera. W ogóle nic nie jest pisane do hosta! To zawsze będzie miało miejsce tylko wtedy, gdy podasz folder hosta przed folderem kontenera!

Nadzieja to pomogło :)

+0

Dzięki za wyjaśnienie! Jeśli chodzi o twoje ostatnie komentarze, jeśli nie podaję folderu hosta podczas deklarowania woluminu w komponowaniu, mówisz, * wtedy Docker utrzyma tę ścieżkę. * Czy możesz wyjaśnić, co to oznacza dla * Docker * do utrzymywania ścieżki w kontenerze? Jeśli się zatrzyma, uruchomi się ponownie, zachowa dane? Dane zostaną utracone tylko wtedy, gdy kontener zostanie usunięty? Czy to oznacza, że ​​* Docker utrzymuje ścieżkę TYLKO w kontenerze? * –

+0

Tak, dokładnie: zatrzymanie jest w porządku, ponowne uruchomienie, dane nadal istnieją. Usunięcie => danych w tomie również zniknęło. Najważniejsza wskazówka tutaj: Objętość jest nadal dostępna, ale tracisz dostęp i zanieczyszczasz hd => usuwaj kontenery za pomocą flagi -v :) –

+0

Ostatnie pytanie! W moim kontenerze "data" (tylko dane) zmieniłem go tak, by przeczytał: * woluminy: -/var/test/mysql:/var/lib/mysql *, a następnie uruchomił * kompilację docker-compose, docker-compose up -d *, aby odbudować wszystko. Spodziewałem się teraz zobaczyć/var/test/mysql na maszynie wirtualnej HOST, ale wciąż nic? * head scratch * Jedną rzeczą, którą zauważam teraz, jest to, że kiedy SSH trafi do mojej maszyny wirtualnej i * dockera ps *, aby zobaczyć wszystkie działające kontenery, kontener * data * nigdzie nie jest widoczny, nawet jeśli jest tworzony. Być może to kolejny tutorial tho :) Dzięki! –

Powiązane problemy