تاریخچه مشکل مهاجرت ذخیره سازی داکر (روت داکر)

چند روز پیش، در یکی از سرورها تصمیم گرفته شد که ذخیره‌سازی docker (دایرکتوری که docker همه فایل‌های کانتینر و تصویر را در آن ذخیره می‌کند) به بخش جداگانه‌ای منتقل کند.
ظرفیت بیشتری داشت این کار بی اهمیت به نظر می رسید و مشکلی را پیش بینی نمی کرد...

شروع شدن:

1. تمام کانتینرهای برنامه ما را متوقف کرده و بکشید:

docker-compose down

اگر ظروف زیادی وجود دارد و آنها در ترکیبات مختلف هستند، می توانید این کار را انجام دهید:

docker rm -f $(docker ps -q)

2. داکر دیمون را متوقف کنید:

systemctl stop docker

3. دایرکتوری را به مکان مورد نظر منتقل کنید:

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

4. به داکر دیمون می گوییم که در فهرست جدید جستجو کند. چندین گزینه وجود دارد: یا از پرچم -g برای نشان دادن دیمون به یک مسیر جدید استفاده کنید یا از تنظیمات systemd که ما استفاده کردیم. یا یک پیوند نمادین من به جزئیات زیاد در این مورد نمی پردازم، این در اینترنت است. پر شده کتابچه راهنمای انتقال ریشه docker به مکان جدید.

5. Docker Daemon را راه اندازی کنید و مطمئن شوید که در جای درست به نظر می رسد:

systemctl status docker

در یکی از خطوط خروجی باید ببینیم:

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

ما مطمئن شدیم که این گزینه به دیمون منتقل شده است، حالا بیایید بررسی کنیم که آیا آن را اعمال کرده است (با تشکر inkvizitor68sl)!

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

6. بیایید برنامه خود را شروع کنیم:

docker-compose up -d

7. بررسی

و اینجا سرگرمی شروع می شود، DBMS، MQ، همه چیز خوب است! پایگاه داده دست نخورده است، همه چیز کار می کند ... به جز nginx. ما ساخت nginx خود را با Kerberos و courtesans داریم. و مشاهده گزارش های کانتینر نشان داد که نمی تواند در /var/tmp بنویسد - مجوز رد شد. شقیقه هایم را با انگشتانم ورز می دهم و سعی می کنم وضعیت را تجزیه و تحلیل کنم... این چگونه ممکن است؟ تصویر داکر تغییری نکرد. ما فقط دایرکتوری را منتقل کردیم. همیشه کار می کرد، و اینجا برای شماست... برای آزمایش، با دستانم به داخل ظرف رفتم و حقوق این فهرست را تغییر دادم، وجود داشت ریشه، ریشه 755، داد ریشه، ریشه 777. و همه چیز شروع شد ... فکری در سرم به صدا درآمد - نوعی مزخرف ... فکر کردم ، خوب ، شاید چیزی را در نظر نگرفتم ...

من تصمیم گرفتم که در حین انتقال عاشق حقوق دسترسی به پرونده ها شدیم. ما برنامه را متوقف کردیم، داکر دیمون، دایرکتوری جدید را حذف کردیم و دایرکتوری /var/lib/docker را با استفاده از آن کپی کردیم. rsync -a.

فکر می‌کنم الان همه چیز خوب است، بیایید برنامه Docker را بالا ببریم.

آآند... مشکل باقی ماند... چشمم تکان خورد. با عجله به سمت کنسول ماشین مجازی ام رفتم، جایی که تست های مختلف را اجرا کردم، این تصویر nginx را داشتم و داخل کانتینر بالا رفتم و در اینجا حقوق پوشه /var/tmp root، root 777 است. یعنی همانطور که باید به صورت دستی تنظیم می کردم. اما تصاویر یکسان هستند!

سیستم فایل xfs در همه جا استفاده شد.

من با استفاده از دستور مقایسه کردم

docker inspect my-nginx:12345

همه هش ها یکسان هستند، همه یک به یک. هم روی سرور و هم روی ماشین مجازی من. من تصویر محلی nginx را حذف کردم و دوباره آن را از رجیستری کشیدم که به دلایل مختلفی روی همان دستگاه است. و مشکل همینه... الان چشم دومم داره تکون میخوره.

دیگر به یاد نمی آورم که چه افکاری در سرم بود، به غیر از فریاد زدن "AAAAAAAA" و چیزهای دیگر. ساعت 4 صبح بود و از کد منبع Docker برای درک اصل هش کردن لایه‌های تصویر استفاده شد. سومین قوطی نوشابه انرژی زا را باز کرد. و در پایان متوجه شدم که هش کردن فقط فایل، محتویات آن را در نظر می گیرد، اما حقوق دسترسی نیست! یعنی به شکلی مرموز حقوق ما از بین رفته است، selinux غیرفعال است، acl استفاده نمی شود، و هیچ بیت چسبنده ای وجود ندارد.

من تصویر محلی را حذف کردم، همچنین تصویر را از رجیستری docker حذف کردم و دوباره آن را فشار دادم. و همه چیز کار کرد. معلوم می شود که در حین انتقال، حقوق هم در داخل تصویر محلی و هم در داخل تصویر موجود در رجیستری از بین رفته است. همانطور که قبلاً گفتم، به دلایل متعددی روی همان ماشین قرار داشت. و در نتیجه در یک پوشه /var/lib/docker.

و با پیش بینی این سوال که آیا آنها سعی کردند نگاه داکر را به فهرست قدیمی بازگردانند - نه ، آنها تلاش نکردند ، افسوس که شرایط اجازه نداد. بله، و من واقعاً می خواستم آن را بفهمم.

پس از نوشتن این مقاله، راه حل مشکل برای من واضح به نظر می رسد، اما در زمان تجزیه و تحلیل این طور به نظر نمی رسید. راستش من در گوگل سرچ کردم و موقعیت های مشابهی پیدا نکردم.

نتیجه: من مشکل را حل کردم، هنوز دلیل آن را متوجه نشدم =(

اگر کسی می داند، حدس می زند، دیدی در مورد علل احتمالی این مشکل داشته است، بسیار خوشحال خواهم شد که از شما در نظرات بشنوم!

منبع: www.habr.com

اضافه کردن نظر