sql >> Database teknologi >  >> RDS >> Mysql

Docker-maskine på Mac:Kan du ikke se monterede volumener på docker-vært/docker-maskine? Hvor opbevares mængder fysisk?

Ok, der er et par punkter, der skal behandles her.

Lad os starte med, hvad en docker-volumen er (Prøv ikke at tænke på din macbook eller den omstrejfende maskine på dette tidspunkt. Bare vær opmærksom på det faktum, at dockers bruger et andet filsystem, hvor det end befinder sig på dette tidspunkt):Forestil dig måske sådan er hver volumen i Docker kun en del af det interne filsystem, som docker bruger. Containerne kan bruge disse volumener, som om de var "små harddiske", der kan monteres af dem og også deles mellem dem ( eller monteret af to af dem på samme tid, som at montere en superhurtig version af en eller anden ftp-server til to klienter eller hvad som helst :P ).

I princippet kan du deklarere disse mængder (stadig tænker du ikke på selve din computer/vagrant, kun dockerne;)) via Dockerfilens VOLUME-instruktion. Standardeksempel, kør en webservercontainer som sådan:

FROM: nginx
VOLUME /www

Nu kan alt, der går ind i /www, i teorien monteres og afmonteres fra en container og også monteres på flere containere. Nu er Nginx alene kedeligt, så vi vil have php til at køre over de filer, som nginx gemmer for at producere noget mere sjovt indhold. => Vi er nødt til at montere den volumen i en eller anden php-fpm-beholder. Ergo i vores kompositfil ville vi gøre dette

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

=> voila! hver mappe, der er erklæret af et VOLUME-direktiv i nginx/web-beholderen, vil være synlig i php-en. Vigtigt at bemærke her, hvad end der er i nginx's /www, vil tilsidesætte hvad php har i /www. Hvis du sætter :ro, kan php ikke engang skrive til den mappe :)

Når du nu nærmer dig dit problem, er der en anden måde at erklære volumener på, som ikke kræver, at de erklæres i Dockerfilen. Dette kan gøres ved at montere volumener fra værten (i dette tilfælde din vagrant/boo2docker-ting). Lad os diskutere dette, som om vi kører på en indbygget Linux først.

Hvis du skulle sætte noget som:

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

i din docker-compose.yml, så vil dette betyde, at /home/myuser/folder nu vil blive monteret i dockeren. Den vil tilsidesætte alt, hvad docker har i /folder og ligesom /www også være tilgængelig fra den ting, der erklærede det. Nu kører den Linux-maskine, docker-dæmonen, på.

Så meget for teorien :), faktisk har du sikkert bare brug for følgende råd for at få gang i dine ting :):

Måden boot2docker/docker-machine/kitematic og alle disse ting håndterer problemet på er simpelthen, at de først og fremmest bare monterer et volumen i vagrant-maskinen til docker-containerne, og de monterer simpelthen også denne ting i dit Mac-filsystem , håber det hele ordner sig :P

Nu til det praktiske problem, vi alle, der bruger dette (eller bare prøver at hjælpe deres kolleger ind i en verden af ​​sød sød Docker :P) på Mac, står over for, er tilladelser. Jeg mener, tænk over det (root eller en anden bruger håndterer filer i containeren, brugeren vagrant håndterer muligvis filer i vagrant-værten og så håndterer din Mac-bruger "skalfyfan" disse filer i Mac. De har alle forskellige bruger-id'er og hvad der ikke er => der opstår mange problemer med det, og lidt afhængigt af hvad du rent faktisk kører i Docker. Mysql og Apache er især smertefulde, fordi de ikke kører som root i containeren. Det betyder, at de ofte har problemer med at skrive til Mac-filen system.

Før du prøver den anden fremgangsmåde nedenfor, skal du blot prøve at lægge dine containervolumener under din Mac-hjemmemappe. Dette vil løse problemer med MySQL i de fleste tilfælde, som jeg har fundet gennem tiden. Forresten:Ingen grund til at erklære fulde stier til bind ./folder er fin og læst i forhold til det sted, hvor din docker-compose.yml er bosat!

Bare læg compose-yml i din Mac-brugermappe, det er alt, der betyder noget. Ingen chmod 777 -R :P vil hjælpe dig her, den skal bare ligge under din hjemmemappe :)

Stadig nogle apps (Apache for eksempel) vil stadig give dig en hård tid. Det faktum, at bruger-id'et for det, der kører i containeren, adskiller sig fra dit Mac-bruger-id, vil gøre dit liv til et helvede. For at komme uden om dette, skal du justere både bruger-id'et og brugergruppen på en måde, der ikke er i konflikt med din Macs tilladelser. Den gruppe, du vil have på en Mac, er personale, et UID, der virker, ville f.eks. være 1000. Du kan derfor sætte dette i slutningen af ​​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:

Lige på, det gør det :)

Denne tog du fejl :) Som forklaret, hvis du ikke giver en værtsmappe, vil Docker fortsætte denne sti. Men kun for denne container, og alle vil forblive i docker-filsystemet. Intet er skrevet til værten overhovedet! Dette vil altid kun ske, hvis du giver en værtsmappe før containermappen!

Håber dette hjalp :)




  1. Sådan returnerer du antallet af sekunder efter midnat i Oracle-databasen

  2. C#:Objekt kan ikke castes fra DbNull til andre typer

  3. CONNECT BY eller hierarkiske forespørgsler i andre RDBMS end Oracle

  4. SQL VÆLG MAKS