توی این پست میخوایم بررسی کنیم اگه کانتینرمون روشن باشه و به هردلیلی سرویس dockerd یا همون دیمنِ داکر پایین بیاد چه اتفاقی میفته و برای اینکه کانتینرهامون پایدارتر باشن چجوری باید داکرمون رو کانفیگ کنیم. موقعی که داکر دیمِن به دلیلی استاپ میشه، تمامی کانتینرها پایین میان مگر اینه از قبل live-restore رو فعال کرده باشیم.
خیلیامون برای اینکه کدامون رو دپلوی کنیم و یا یه سرویسی رو سریع بالا بیاریم (مثلا nginx یا mongodb) از داکر استفاده میکنیم. داکر یک فضای ایزوله رو در اختیارمون قرار میده که راحت بتونیم محیطی که در اون کد میزنیم و تنظیم کنیم، بهش شبکه متصلش کنیم، میزانی که میخوایم cpu، ram و منابع دیگه هم تخصیص بدیم و کدمون رو در اون اجرا کنیم. مثلا در اینجا قصد داریم یک وب سرور Nginx رو دپلوی کنیم. میتونیم از Docker Hub یه ایمیج Nginx برداریم و اجرا کنیم:
توجه: باید کانتینر رو با سوییچ `--restart always` اجرا کنیم تا مطمئن شیم که `live-restore` کار میکنه (خودم که تست کردم وقتی این سوییچ رو پاس نمیدم، `live-restore` برای کانتینرم کار نمیکنه (توی کامنت نظرتون و تجربتون رو بگین بهم).
کانتینرهای داکر روی Docker daemon اجرا میشن. طبق داکیومنتهای سایت داکر، داکر دیمِن یا dockerd به درخواستهایی که برای ساخته شدن آبجکتهای داکر از جمله ایمیج، کانتینر و volume ها داده میشه گوش میده و پاسخ میده:
The Docker daemon (dockerd
) listens for Docker API requests and manages Docker objects such as images, containers, networks, and volumes. A daemon can also communicate with other daemons to manage Docker services.
حالا مشکل این هستش که این container که داره روی داکر دیمِن (dockerd) اجرا میشه و خود این داکر دیمِن به هر دلیلی ممکنه ریاستارت بشه یا برای چند لحظه (جهت آپدیت شدن خود Docker Engine) در دسترس نباشه. اتفاقی که میفته اینه که سرویسی که ما روی کانتینر اجرا کردیم برای چند لحظه پایین میاد. همانطور که در پایین میبینید، بعد از ریاستارت کردن داکر دیمِن، هیچ کانتینری در حال اجرا نیست.
این اتفاق ممکنه توی development مشکلی ایجاد نکنه اما اگه کد ما روی production در حال اجرا باشه میتونه خیلی بد باشه و مشتری بیاد سراغمون.
برای حل این مشکل میتونیم docker daemon را جوری کانفیگ کنیم که بتونه وقتی حتی کانتینرهامون در حال اجرا هستن، خودش رو restore کنه (live-restore).
وارد جزییات کانفیگ کردنش خیلی نمیخوام بشم اما برای اونهایی که با داکر آشنایی دارن میگم که کافیه توی فایل /etc/docker/daemon.json برید و مقدار زیر رو اضافه کنید بهش:
حالا اگه سرویس داکر برای چن لحظه بیاد پایین، کانتنرهای در حال اجرا خاموش نمیشن... :-)
توی این پست بررسی کردیم چه کانفیگی روی docker داشته باشیم که در صورت بروز مشکل احتمالی برای dockerd، کانتینرهامون پایین نیان و با مثال دیدیم که چه اتفاقی میفته اگه live-restore رو فعال نکنیم. راستی نسخه انگلیسی این پست رو میتونید توی سایت مدیوم بخونید: https://medium.com/@thehesamgh/how-does-docker-engine-live-restore-work-a-simple-guide-16a766cb728d
منابع:
https://docs.docker.com/config/containers/live-restore/
https://docs.docker.com/get-started/overview/
امیدوارم از این پست خوشتون اومده باشه؛ با لایک و کامنتهاتون بهم انرژی میدین که بیشتر مطلب بنویسم و فیدبک بگیرم که به کدوم زمینهها بیشتر علاقه دارین.