sql >> Databasteknik >  >> RDS >> Mysql

Docker-maskin på Mac:Kan inte se monterade volymer på docker-värd/docka-maskin? Var lagras volymer fysiskt?

Ok, det finns ett par punkter som måste tas upp här.

Låt oss börja med vad en dockningsvolym är (Försök att inte tänka på din macbook eller den lösdrivande maskinen vid det här laget. Tänk bara på det faktum att dockarbetarna använder ett annat filsystem, var det än befinner sig vid denna tidpunkt ):Föreställ dig kanske det så här, i och för sig är varje volym i Docker bara en del av det interna filsystem som docker använder. Behållarna kan använda dessa volymer, som om de var "små hårddiskar" som kan monteras av dem och även delas mellan dem ( eller monteras av två av dem samtidigt, som att montera en supersnabb version av någon ftp-server till två klienter eller vad som helst :P ).

I princip kan du deklarera dessa volymer (fortfarande inte tänka på din dator/vagrant själv, bara hamnarbetarna;)) via Dockerfilens VOLYM-instruktion. Standardexempel, kör en webbserverbehållare så här:

FROM: nginx
VOLUME /www

Nu kan allt som går in i /www i teorin monteras och avmonteras från en container och även monteras på flera containrar. Nu är bara Nginx tråkigt, så vi vill att php ska köras över filerna som nginx lagrar för att producera lite roligare innehåll. => Vi måste montera den volymen i någon php-fpm-behållare. I vår skrivfil skulle vi göra detta

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

=> voila! varje mapp som deklareras av ett VOLUME-direktiv i nginx/web-behållaren kommer att vara synlig i php one. Viktigt att notera här, vad som än finns i nginx:s /www, kommer att åsidosätta vad som helst php har i /www. Om du sätter :ro, kan php inte ens skriva till den mappen :)

När du nu närmar dig ditt problem, finns det ett andra sätt att deklarera volymer, som inte kräver att de deklareras i Dockerfilen. Detta kan göras genom att montera volymer från värden (i det här fallet din vagrant/boo2docker-grej). Låt oss diskutera detta som om vi kör på ett inbyggt Linux först.

Om du skulle lägga något som:

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

i din docker-compose.yml, kommer detta att innebära att /home/myuser/folder nu kommer att monteras i dockern. Den kommer att åsidosätta vad dockeraren har i /folder och precis som /www också vara tillgänglig från den sak som deklarerade det. Nu körs den Linux-maskin som docker-demonen körs på.

Så mycket för teorin :), faktiskt behöver du förmodligen bara följande råd för att få igång dina saker :):

Sättet som boot2docker/docker-machine/kitematic och alla dessa saker hanterar problemet är helt enkelt att de först och främst bara monterar en volym i vagrantmaskinen till dockercontainrarna, och de monterar helt enkelt också den här saken i ditt Mac-filsystem , hoppas att allt löser sig :P

Nu för det praktiska problemet vi alla som använder detta (eller bara försöker hjälpa sina medarbetare in i den söta söta Dockers värld :P) på Mac står inför är behörigheter. Jag menar, tänk på det (root eller någon annan användare hanterar filer i behållaren, användaren vagrant kan hantera filer i vagrant-värden och sedan hanterar din Mac-användare "skalfyfan" dessa filer i Mac. De har alla olika användar-ID och vad inte => många problem uppstår med det, och lite beroende på vad du faktiskt kör i Docker. Mysql och Apache är särskilt smärtsamma eftersom de inte körs som root i behållaren. Det betyder att de ofta har problem med att skriva till Mac-filen system.

Innan du provar det andra tillvägagångssättet nedan, försök helt enkelt lägga dina containervolymer under din Mac-hemkatalog. Detta kommer att lösa problem med MySQL i de flesta fall, vilket jag har funnit med tiden. Förresten:Inget behov av att deklarera fullständiga sökvägar till volymer ./folder är bra och läs i förhållande till platsen där din docker-compose.yml finns!

Lägg bara in compose-yml i din Mac-användarmapp, det är allt som betyder något. Ingen chmod 777 -R :P hjälper dig här, den behöver bara finnas under din hemmapp :)

Fortfarande kommer vissa appar (Apache till exempel) fortfarande att ge dig en svår tid. Det faktum att användar-id för vad som än körs i behållaren skiljer sig från ditt Mac-användar-id kommer att göra ditt liv till ett helvete. För att komma runt detta måste du justera användar-id såväl som användargrupp på ett sätt som inte kommer i konflikt med din Macs behörigheter. Gruppen du vill ha på en Mac är personal, ett UID som fungerar skulle till exempel vara 1000. Därför kan du lägga detta i slutet av din Dockerfil:

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

eller

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

Så som du nu har lärt dig:

Precis, det gör det :)

Den här har du fel :) Som förklarat, om du inte ger en värdmapp, kommer Docker att fortsätta denna väg. Men bara för den här behållaren och alla kommer att stanna inom docker-filsystemet. Inget skrivs till värden alls! Detta kommer alltid bara att hända om du ger en värdmapp före containermappen!

Hoppas detta hjälpte :)




  1. Hur kontrollerar man om strängvärdet i en kolumn delvis ingår i strängvärdet i en annan kolumn med SQL?

  2. Kan inte ansluta till den lokala MySQL-servern via socket '/tmp/mysql.sock

  3. MySQL-kolumner med DEFAULT NULL - stilistiskt val, eller är det?

  4. SQL-databasmigrering med kommandorad