A docker tároló (docker root) átviteli probléma története

Néhány nappal ezelőtt úgy döntöttünk, hogy az egyik szerveren a docker tárolót (az a mappa, ahol a docker az összes konténerfájlt, képet tárolja) egy külön partícióra helyezzük, amely
nagyobb kapacitással rendelkezik. A feladat, látszólag, triviálisnak tűnt, és nem ígért semmi rosszat…

Kezdjük:

1. Leállítjuk és megölünk minden konténert az alkalmazásunkból:

docker-compose down

ha sok konténer van, és különböző compose-okat használnak, akkor így:

docker rm -f $(docker ps -q)

2. Leállítjuk a docker démon-t:

systemctl stop docker

3. Áthelyezzük a mappát a megfelelő helyre:

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

4. Értesítjük a docker démont, hogy nézze az új könyvtárat. Itt van néhány lehetőség: vagy a -g kapcsolóval adjuk meg az új utat a démonnak, vagy a systemd konfigurációs fájlokat használjuk, ahogy mi is tettük. Vagy szimbolikus link. Erről nem írok részletesebben, az interneten bőven van kézikönyv a docker root új helyre történő áthelyezéséről.

5. Indítsuk el a docker démont, és figyeljük, hogy hova néz:

systemctl status docker

A kimenet egyik sorában látnunk kell:

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

Meggyőződtünk arról, hogy a démontól megkaptuk a választási lehetőséget, most ellenőrizzük, hogy alkalmazta-e (köszönet inkvizitor68sl)!

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

6. Indítsuk el az alkalmazásunkat:

docker-compose up -d

7. Ellenőrizzük

Itt kezdődik a legérdekesebb rész, az SGBD, MQ, minden rendben! Az adatbázis épen maradt, minden működik… kivéve az nginx-t. Van egy saját nginx-ünk Kerberos-szal és kurvák nélkül. A konténer naplóinak átnézése azt mutatta, hogy nem tud írni a /var/tmp könyvtárba – A hozzáférés megtagadva. Pihentetem az ujjaimat a halántékomon, és próbálom analizálni a helyzetet… Hogyan történhetett ez? A docker kép nem változott. Csak a könyvtárat helyeztük át. Mindig működött, és most… Kísérletképpen beléptem a konténerbe, és megváltoztattam a jogosultságokat a megadott mappához, volt root, root 755, adtam root, root 777. És minden elindult… A fejemben megszólalt egy gondolat – valami őrültség… Gondoltam, talán valamit elfelejtettem…

Úgy döntöttem, hogy a fájlok hozzáférési jogait elvesztettük az áthelyezés során. Leállítottuk az alkalmazást, a docker démont, töröltük az új mappát, és a /var/lib/docker mappa másolását végeztük rsync -a.

Most már biztos vagyok benne, hogy minden rendben lesz, indítom a dockert, az alkalmazást.

Hát… a probléma megmaradt… Be volt rekedve a szemem. Elrohantam a virtuális gépem konzolára, ahol különféle teszteket futtattam, volt ez az nginx kép, és beléptem a konténerbe, és ott a /var/tmp mappán a jogosultságok root, root 777. Tehát ugyanazok, amiket manuálisan kellett beállítanom. De hiszen a képek azonosak!

Mindenhol xfs fájlrendszert használtak.

Összehasonlítottam a következő paranccsal

docker inspect my-nginx:12345

Minden hash azonos, mind egy az egyben. Akár a szerveren, akár a virtuális gépemen. Töröltem a helyi nginx képet, és újra letöltöttem a registry-ből, ami különböző okok miatt ugyanazon a gépen van. És ugyanaz a probléma… Most a második szemem is elkezdett remegni.

Már nem emlékszem, mik jártak a fejemben, a „AAAAAAA” felkiáltáson kívül. Éjszaka 4 óra van, elővettem a docker forráskódot, hogy megértsem a réteg hash-elésének elvét. Megnyitottam a harmadik energiaitalos dobozt. És végül rájöttem, hogy a hash-elés csak a fájlt és annak tartalmát veszi figyelembe, de NEM A HOZZÁFÉRÉSI JOGOKAT! Tehát valami rejtélyes módon a jogosultságok megsérültek, pedig a selinux le volt kapcsolva, az acl nem volt használva, sticky bit pedig nem volt.

Töröltem a helyi képet, töröltem a registry-beli képet is és újra feltöltöttem. És minden működött. Tehát úgy tűnik, hogy a átvitel során a jogosultságok megsérültek, mind a helyi képben, mind a registry-ben található képben. Ahogy már mondtam, különböző okok miatt itt a gépen helyezkedett el. És következésképpen egy mappában /var/lib/docker.

És előre látva a kérdést, nem próbáltuk visszafordítani a dockert a régi mappába — nem, sajnos, a körülmények nem tették lehetővé. De nagyon akartam megérteni.

A cikk megírása után a probléma megoldása számomra nyilvánvalónak tűnik, de a kérdés tisztázása pillanatában nem tűnt annak. Őszintén keresgéltem a neten, és nem találtam hasonló helyzeteket.

Összegzés: a problémát megoldottam, az okot viszont nem értettem meg =(

Ha valaki tudja vagy sejtette, hogy mi lehetett a probléma okainak egyike — nagyon örülnék, ha megosztanád a kommentekben!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster