sql >> Databáze >  >> RDS >> Mysql

Docker Machine na Macu:Nevidíte připojené svazky na hostitelském počítači/docker-machine? Kde jsou svazky fyzicky uloženy?

Dobře, je zde několik bodů, které je třeba vyřešit.

Začněme tím, co je svazek dockerů (Snažte se v tuto chvíli nemyslet na svůj macbook nebo tulákový stroj. Jen si uvědomte, že dockery používají jiný souborový systém, ať už se v tomto okamžiku může nacházet kdekoli):Možná si představte takhle je každý svazek v Dockeru sám o sobě jen částí interního souborového systému, který docker používá. Kontejnery mohou používat tyto svazky, jako by to byly „malé pevné disky“, které mohou být připojeny a také mezi nimi sdíleny ( nebo připojené dvěma z nich současně, jako je připojení super rychlé verze nějakého ftp serveru ke dvěma klientům nebo cokoli jiného :P ).

V zásadě můžete tyto svazky deklarovat (stále nemyslet na svůj počítač/tulák sám o sobě, jen na dockery;) ) pomocí instrukce VOLUME v Dockerfile. Standardní příklad, spusťte jeden kontejner webového serveru takto:

FROM: nginx
VOLUME /www

Nyní může být vše, co jde do /www, teoreticky připojeno a odpojeno z kontejneru a také připojeno k více kontejnerům. Nyní je samotný Nginx nudný, takže chceme, aby soubory, které nginx ukládá, php produkoval zábavnější obsah. => Potřebujeme připojit tento svazek do nějakého kontejneru php-fpm. V našem souboru pro psaní bychom to udělali

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

=> voila! každá složka deklarovaná direktivou VOLUME v kontejneru nginx/web bude viditelná v php. Zde je důležité poznamenat, že cokoli je v /www nginx, přepíše to, co má php v /www. Pokud zadáte :ro, php do této složky ani nemůže zapisovat :)

Nyní se blížíme k vašemu problému, je tu druhý způsob, jak deklarovat svazky, který nevyžaduje, aby byly deklarovány v Dockerfile. To lze provést připojením svazků z hostitele (v tomto případě vašeho tuláka/boo2dockera). Pojďme o tom diskutovat, jako bychom nejprve běželi na nativním Linuxu.

Pokud byste měli dát něco jako:

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

ve vašem docker-compose.yml, pak to bude znamenat, že /home/myuser/folder bude nyní připojen k dockeru. Přepíše vše, co má docker ve složce /, a stejně jako /www bude také přístupný z věci, která jej deklarovala. Nyní běží počítač Linux, na kterém démon dockeru běží.

Tolik k teorii :), ve skutečnosti pravděpodobně budete potřebovat pouze následující rady, abyste se rozběhli :):

Způsob, jakým boot2docker/docker-machine/kitematic a všechny tyto věci řeší tento problém, je jednoduše tak, že nejprve pouze připojí svazek na tulákovském počítači do kontejnerů dockeru a jednoduše také připojí tuto věc do vašeho souborového systému Mac. , doufám, že to všechno vyjde :P

Nyní k praktickému problému, kterému všichni z nás, když toto používáme (nebo se jen snažíme pomoci svým spolupracovníkům do světa sladkého sladkého Dockera :P) na Macu, čelíme, je oprávnění. Chci o tom přemýšlet (root nebo nějaký jiný uživatel zpracovává soubory v kontejneru, uživatel vagrant může zpracovávat soubory v hostiteli vagrant a pak váš uživatel Mac "skalfyfan" zpracovává tyto soubory v Macu. Všichni mají různá uživatelská ID a co ještě => z toho plyne mnoho problémů a poněkud v závislosti na tom, co v Dockeru skutečně používáte. Mysql a Apache jsou obzvláště bolestivé, protože v kontejneru neběží jako root. To znamená, že mají často problémy se zápisem do souboru Mac systém.

Než vyzkoušíte druhý přístup níže, jednoduše zkuste umístit svazky kontejnerů do domovského adresáře Mac. To ve většině případů vyřeší problémy s MySQL, jak jsem časem zjistil. Btw:Není třeba deklarovat úplné cesty k svazkům ./folder je v pořádku a čte se relativně k místu, kde se nachází váš docker-compose.yml! silný>

Jednoduše vložte compose-yml do vaší složky Mac users, to je vše, na čem záleží. Tady vám žádný chmod 777 -R :P nepomůže, jen to musí být ve vaší domovské složce :)

Některé aplikace (například Apache) vám stále budou dělat potíže. Skutečnost, že se uživatelské ID čehokoli, co běží v kontejneru, liší od vašeho uživatelského ID Macu, vám udělá ze života peklo. Chcete-li to obejít, musíte upravit ID uživatele a skupinu uživatelů způsobem, který nebude v rozporu s oprávněními vašeho Macu. Skupina, kterou chcete na Macu, je personál, UID, které funguje, by bylo například 1000. Proto můžete toto umístit na konec svého Dockerfile:

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

nebo

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

Takže jak jste se nyní dozvěděli:

Přesně tak, dělá to :)

V tomto jste se spletli :) Jak bylo vysvětleno, pokud nezadáte hostitelskou složku, Docker tuto cestu zachová. Ale pouze pro tento kontejner a vše zůstane v systému souborů docker. Hostiteli se nepíše vůbec nic! K tomu dojde vždy pouze tehdy, pokud dáte hostitelskou složku před složku kontejneru!

Doufám, že to pomohlo :)




  1. Mám zacházet s GraphQL ID jako s řetězcem na klientovi?

  2. Změní se ID prostředku při každém spuštění aplikace

  3. Co je nového v Postgres-XL 9.6

  4. Výkon MYSQL IN