Historie problému migrace úložiště dockeru (kořen dockeru)

Ne více než před pár dny bylo na jednom ze serverů rozhodnuto přesunout úložiště dockeru (adresář, kde docker ukládá všechny soubory kontejnerů a obrázků) do samostatné sekce, která
měl větší kapacitu. Úkol se zdál triviální a nepředpovídal potíže...

Začínáme:

1. Zastavte a zabijte všechny kontejnery naší aplikace:

docker-compose down

pokud je kontejnerů hodně a jsou v různém složení, můžete to udělat:

docker rm -f $(docker ps -q)

2. Zastavte démona docker:

systemctl stop docker

3. Přesuňte adresář na požadované místo:

cp -r /var/lib/docker /docker/data/storage

4. Řekneme démonovi docker, aby se podíval do nového adresáře. Existuje několik možností: buď použijte parametr -g k nasměrování démona na novou cestu, nebo systémové konfigurace, které jsme použili. Nebo symbolický odkaz. Nebudu se o tom moc rozepisovat, je to na internetu. plný příručky o přesunutí kořenového adresáře dockeru do nového umístění.

5. Spusťte démona dockeru a ujistěte se, že vypadá na správném místě:

systemctl status docker

V jednom z výstupních řádků bychom měli vidět:

├─19493 /usr/bin/dockerd --data-root=/docker/data/storage

Ujistili jsme se, že možnost byla předána démonovi, nyní zkontrolujeme, zda ji použil (díky inkvizitor68sl)!

docker info | awk '/Root Dir/ {print $NF}' 

6. Začněme naši aplikaci:

docker-compose up -d

7. Kontrola

A tady začíná zábava, DBMS, MQ, všechno je v pořádku! Databáze je neporušená, vše funguje... kromě nginx. Máme vlastní sestavení nginx s Kerberos a kurtizány. A prohlížení protokolů kontejneru ukázalo, že nemůže zapisovat do /var/tmp - Povolení odepřeno. Hnětím si spánky prsty a snažím se analyzovat situaci... Jak je to možné? Obraz Dockeru se nezměnil. Právě jsme přesunuli adresář. Vždy to fungovalo a tady je to pro vás... Kvůli experimentu jsem šel do kontejneru rukama a změnil práva k tomuto adresáři. kořen, kořen 755, dal kořen, kořen 777. A všechno začalo... V hlavě se mi začala ozývat myšlenka - nějaký nesmysl... Říkal jsem si, no, možná jsem něco nevzal v úvahu...

Rozhodl jsem se, že jsme se při přenosu zamilovali do přístupových práv k souborům. Zastavili jsme aplikaci, démona docker, smazali nový adresář a zkopírovali adresář /var/lib/docker pomocí rsync -a.

Myslím, že nyní je vše v pořádku, zvedneme aplikaci Docker.

Aaa... problém přetrvával... Zacukalo mi oko. Spěchal jsem do konzole svého virtuálního stroje, kde jsem spouštěl různé testy, měl jsem tento obraz nginx a vlezl jsem dovnitř kontejneru a zde jsou práva k adresáři /var/tmp root, root 777. stejně jako jsem musel nastavit ručně. Ale obrázky jsou stejné!

Všude se používal souborový systém xfs.

Porovnal jsem pomocí příkazu

docker inspect my-nginx:12345

Všechny hashe jsou identické, všechny jedna ku jedné. Jak na serveru, tak na mém virtuálním počítači. Smazal jsem místní obraz nginx a znovu jej vytáhl z registru, který je z mnoha důvodů na stejném počítači. A problém je stejný... Teď mi cuká druhé oko.

Už si nepamatuji, jaké myšlenky se mi honily hlavou, kromě křiku „AAAAAAAAA“ a dalších věcí. Byly 4 hodiny ráno a zdrojový kód Dockeru byl použit k pochopení principu hashování obrazových vrstev. Otevřel třetí plechovku energetického nápoje. A nakonec mi došlo, že hašování bere v úvahu pouze soubor, jeho obsah, ale NEPŘÍSTUPOVÁ PRÁVA! To znamená, že nějakým záhadným způsobem byla ztracena naše práva, selinux je zakázán, acl se nepoužívá a není tam žádný lepivý kousek.

Smazal jsem místní bitovou kopii, smazal jsem ji také z registru dockeru a znovu jsem ji poslal. A vše fungovalo. Ukázalo se, že během převodu došlo ke ztrátě práv, a to jak uvnitř místního obrazu, tak uvnitř obrazu ležícího v registru. Jak jsem již řekl, z mnoha důvodů byl umístěn na stejném autě. A ve výsledku v jednom adresáři /var/lib/docker.

A předvídání otázky, zda se pokusili vrátit pohled dockeru do starého adresáře - ne, nezkoušeli to, bohužel, okolnosti to nedovolily. Ano, a opravdu jsem na to chtěl přijít.

Po napsání tohoto článku se mi řešení problému zdá zřejmé, ale v době analýzy se nezdálo. Upřímně, hledal jsem na Googlu a nenašel jsem podobné situace.

Výsledek: Problém jsem vyřešil, stále nechápu důvod =(

Pokud někdo ví, tuší, měl představu o možných příčinách tohoto problému, budu velmi rád, když se ozvete v komentářích!

Zdroj: www.habr.com

Přidat komentář