در این مطلب به بررسی این موضوع میپردازیم که Docker Swarm چیست و چرا باید از آن استفاده کنیم. Docker Swarm ابزاری است که توسط توسعهدهندگان و مهندسین نرم افزار برای مدیریت فضای کاری استفاده میشود. شناخت ویژگیهای این ابزار، به شما کمک میکند تا بتوانید استفادهی هدفمند و موثرتری از آن داشته باشید و بهترین بهره را ببرید.
در این مقاله، ابتدا به طور مختصر به این سوال پاسخ میدهیم که داکر سوارم چیست و سپس، با مفاهیم رایج و نحوهی ایجاد، استقرار و دستورات مهم آن آشنا میشویم.
Docker Swarm چیست؟
Docker Swarm (داکر سوارم)، یک ابزار ارکستراتوار کانتینری است که توسط داکر برای مدیریت گرههای چندگانه، فیزیکی و یا مجازی، مورداستفاده قرار میگیرد. واژهی ارکستراتوار به ابزارهایی اشاره دارد که برای مدیریت، گسترش و نگهداری برنامههای کانتینری، استفاده میشوند. Docker Swarm یکی از رایجترین ارکستراتورهای موجود است که مانند یک سیستم کامل و به طور بومی، در Docker مستقر میشود.
گرههای سوآرم که میتوانند مجازی یا فیزیکی باشند، به یکدیگر متصل هستند و میتوانند نقشهای متفاوتی داشته باشند. این نقشها عبارتنداز:
- گرههای مدیر (Manager nodes): گرههای مدیر حاوی Swarm Manager و شامل فرآیندهایی هستند که وظیفهی مدیریت دستورات Swarm را برعهده داشته و کارشان این است که حالت موردنظر را با حالت کلاسترینگ واقعی، مطابقت دهند.
- گرههای کارگر (Worker nodes): این گرهها، شامل بارهای کاری سیستم شما هستند. در تصویر بالا، گرههای کارگر را در قسمت Gossip network مشاهده میکنید.
میتوانید این گرهها را با استفاده از Swarmkit که مجموعهای از ابزارها برای هماهنگی سیستمهای توزیع شده بوده و در Docker ادغام شده است، دریافت کنید.
چرا باید از Docker Swarm استفاده کنم؟
اجرای Docker با حالت داکر سوآرم نسبت به اجرای آن بدون این ابزار، مزایای بسیار زیادی برای اجرای بارهای کاری تولید دارد که در این قسمت، به مهمترین آنها میپردازیم:
- دسترسپذیری بالا: اجرای Docker Swarm با استفاده از Swarm گرههای مدیر و کارگر، باعث میشود محیط کاری شما دسترسپذیری بالایی داشته باشد. اما این به چه معناست؟ Docker Swarm از Raft consensus برای ایجاد ارتباط قابل اعتماد و بالابردن تحمل خطا بین گرهها استفاده میکند. اگر میخواهید یک محیط با دسترسپذیری بالا داشته باشید، باید حداقل 3 گره مدیر که حداکثر شکست 1 گره را تضمین کند، دراختیار داشته باشید. توصیه میشود که برای رسیدگی به 3 شکست گره در یک زمان واحد، حداقل 7 گره مدیر داشته باشید.
- لود بالانسینگ (تعادل بار): از آنجایی که در هر داکر سوآرم چندین گرهی کارگر وجود دارد، میتوانید چندین نمونه از اپلیکیشنها را در سوآرم مستقر کنید. با ویژگی لود بالانسینگ داخلی این ابزار که توسط گرههای مدیر استفاده میشود، تمام درخواستها به طور مساوی بین تمام گرههای کارگر توزیع میشوند و پاسخگویی خدمات بهبود مییابد.
- سادگی و راحتی در استفاده: به طور کلی، فناوری Docker باعث راحتی در انجام کارها، قابلیت حمل راحت و صرفه جویی در هزینههای کلی پروژه میشود. در این مورد، ابزار Docker Swarm با Docker یکپارچه شده است و توسعه دهندگان تمام ابزارهای لازم را دراختیار دارند. ابزار Docker CLI تمام دستورات و گزینههای لازم برای مدیریت راحت برنامهها و کانتینرها را در حالت سوآرم و غیر سوآرم فراهم کرده است.
موارد استفاده از داکر سوآرم
حال که با Docker Swarm آشنا شدیم، شاید برایتان جالب باشد بدانید که موارد استفاده از Docker Swarm چیست و این ابزار در کجا استفاده نمیشود؟
توسعه دهندگان از حالت Docker Swarm برای استقرار تنظیمات استقرار کوچک تا متوسط استفاده میکنند. برای مثال، استقرار یک استک کوچک از برنامههای کاربردی که از پایگاه داده، وب اپلیکیشن، سرویس cache و چند سرویس کوچک دیگر تشکیل شده، با این ابزار امکان پذیر است. از آنجایی که در استقرارهای بزرگتر به تعمیر و نگهداری، سفارشیسازی و بازیابی فاجعه در سطح بزرگتری نیاز دارند، استفاده از Docker Swarm گزینهی خوبی به شمار نمیرود.
هم چنین، در صورتی که میخواهید دردسترس بودن خدمات بالا و متعادل کردن بار خودکار را در اولویت بالاتری نسبت به خودکارسازی و تحمل خطا قرار دهید، استفاده از Docker Swarm برایتان مناسب است.
به طور کلی، تمام سازمانهایی که میخواهند به محیط کانتینری کوچ کنند، میتوانند از داکر سوآرم برای مدیریت و سادهسازی کارهایشان، استفاده کنند.
مقایسه Docker Swarm با Kubernetes
Docker Swarm و کوبرنتیز دو پلتفرم محبوب برای مدیریت و اجرای برنامههای کانتینریزه شده در مقیاس بزرگ هستند. هر دو ابزار ویژگیهای مشابهی مانند استقرار خودکار، مقیاسپذیری، و مدیریت چرخه عمر کانتینرها را ارائه میدهند. با این حال، تفاوتهای کلیدی نیز بین آنها وجود دارد که میتواند بر انتخاب پلتفرم مناسب برای نیازهای شما تأثیر بگذارد.
در ادامه به بررسی و مقایسه ویژگیهای این دو پلتفرم مدیریت برنامههای کانتینری میپردازیم:
پیچیدگی: Docker Swarm به طور کلی سادهتر از Kubernetes برای نصب، پیکربندی و استفاده است. این به دلیل معماری سبکتر و تعداد کمتری از مؤلفهها است. Kubernetes از سوی دیگر، دارای معماری پیچیدهتری با مؤلفههای بیشتر است که میتواند یادگیری و مدیریت آن را دشوارتر کند.
یادگیری: به دلیل سادگی Docker Swarm، یادگیری آن آسانتر از Kubernetes است. منابع آموزشی زیادی برای هر دو پلتفرم موجود است، اما منحنی یادگیری Kubernetes به دلیل پیچیدگی بیشتر آن، شیب تندتری دارد.
قابلیتهای پیشرفته: Kubernetes طیف گستردهتری از قابلیتهای پیشرفته را نسبت به Docker Swarm ارائه میدهد. این شامل ویژگیهایی مانند برنامهریزی پیچیده، مدیریت شبکه، و قابلیت visibality یا مشاهده پذیری است. Docker Swarm برای برنامههای سادهتر و تیمهای کوچکتر که به مجموعه ویژگیهای کاملی نیاز ندارند، مناسبتر است.
کامیونیتی: Kubernetes از کامیونیتی بزرگتر و فعالتری نسبت به Docker Swarm برخوردار است. این به این معنی است که منابع آموزشی بیشتر، پشتیبانی بهتر و مشارکت فعالتر در توسعه وجود دارد.
موارد استفاده: Docker Swarm برای برنامههای سادهتر و تیمهای کوچکتر که به یک پلتفرم آسان برای استفاده و مدیریت نیاز دارند، مناسب است. Kubernetes برای برنامههای پیچیدهتر و تیمهای بزرگتر که به مجموعه ویژگیهای گستردهتر و جامعه فعالتر نیاز دارند، مناسبتر است.
در نهایت، انتخاب بین Docker Swarm و Kubernetes به نیازهای خاص شما بستگی دارد. اگر به دنبال یک پلتفرم ساده برای استفاده برای برنامههای خود هستید، Docker Swarm یک انتخاب خوب است. با این حال، اگر به قابلیتهای پیشرفتهتر و جامعه بزرگتر نیاز دارید، Kubernetes گزینه بهتری است.
چرا بهتر است به جای استفاده از سایر ابزارهای ارکستراتوار کانتینری، از Docker Swarm استفاده کنیم؟
همان طور که در بالا اشاره کردیم، Docker Swarm نسبت به سایر ابزارهای مشابهاش، بسیار ساده است و درنتیجه، یادگیری آن به زمان کمتری نیاز دارد. به عنوان مثال، K8s یا kubernetes یکی از راه حلهای پیشرفتهتر ارکستراسیون کانتینر است که ابزارها و خدماتش، فقط به واسطهی نصب Docker دردسترس هستند. درصورتی که میخواهید چندین گره را بچرخانید، میتوانید این کار را با ابزارهایی نظیر VirtualBox یا Vagrant انجام دهید.
یکی از ویژگیهای داکر سوآرم این است که نیازی به تغییرات پیکربندی ندارد و به دلیل تعمیر و نگهداری بسیار کمی که دارد، برای حجمهای کاری کم تا متوسط، بسیار مناسب است. برای حجمهای کاری بزرگتر، میتوانید از kubernetes و سایر ابزارهایی که پشتیبانی و مستندات بیشتری ارائه میدهند، استفاده کنید.
مفاهیم کلیدی Docker Swarm
فهمیدن مفاهیم کلیدی Docker Swarm به شما کمک میکند تا در زمان استفاده از آن، با روش کارش بهتر ارتباط برقرار کنید. برخی از رایجترین مفاهیم کلیدی این ابزار عبارتند از:
سوآرم (Swarm)
سوآرم به مجموعهای از گرهها که به یکدیگر متصل هستند و هماهنگ میشوند تا از قابل اطمینان بودن یک عملیات مطمئن شوند، گفته میشود. اگر در یک گروه از سوآرم، گرهها در یک توافق باشند، ریسک نقطهی شکست نیز کاهش مییابد. در هر زمان، یک گره رهبر (که خارج از لیست گرههای مدیر است) وجود دارد که تمام تصمیمات کلیدی سوآرم توسط آن گرفته میشوند. در صورتی که گره رهبر از دسترس خارج شود، بقیهی گرههای توافق، بر سر یک رهبر جدید توافق میکنند تا رهبر جدید، مسئولیتهای گره شکست خورده را برعهده بگیرد.
گره (Node)
هر گره، میتواند یک ماشین (سیستم-رایانه) فیزیکی یا مجازی باشد که Docker Engine را در حالت سوآرم اجرا میکند. این گره بر اساس پیکربندیاش، میتواند به عنوان یک گره کارگر و یا یک گره مدیر اجرا شود. گرههای کارگر، مسئولیت پذیرش بار کاری که همان استقرار و خدمات است را برعهده دارند. گرههای مدیر نیز همان صفحهی کنترل سوآرم هستند و مسئولیت هماهنگی خدمات، مشارکت توافقی و زمانبندی حجم کار را برعهده دارند. برای اطمینان از دردسترس بودن و قابلیت اطمینان بالای خدمات، لازم است که هر دو نوع گره بدون مشکل اجرا شوند.
خدمات و وظایف
بارهای کاری یا همان اقدامات انجام شده در داکر سوآرم به دو نوع مختلف تقسیم میشوند: خدمات و وظایف.
خدمات یا سرویسها (Service) تعاریفی از کانتینرها هستند که باید براساس معیارهای خاصی مستقر شوند. شما میتوانید در حالت سوآرم، سرویسهایی که به صورت سراسری اجرا میشوند را به عنوان نمونه در هر گره و یا به عنوان سرویسهای تکراری، مستقر کنید. سرویس تکراری، نشان دهندهی یک برنامهی کاربردی معمولی است که برای مدیریت بارهای کاری، باید با چندین نمونه (کپی ها) افزایش پیدا کند. میتوانید خدماتی که در سوآرم مستقر میشوند را با استفاده از دستور مقیاس سرویس docker، بزرگ یا کوچک کرده و از طریق وضوح DNS، به هر گره از همان خوشه دسترسی داشته باشید.
وظایف (task) به یک بار کاری واحد گفته میشود که به یک گره اختصاص مییابد. زمانی که یک کار به داکر سوآرم ارسال میشود، این کار بر روی یک گره اجرا میشود. این کار نمیتواند بر روی یک گره متفاوت با همان شناسه اجرا شود. در صورتی که میخواهید یک کار را ایجاد کنید، باید یک سرویس ایجاد کنید که استقرار موردنظر را توصیف کند تا وظیفهی موردنظر انجام شود. هر کدام از وظایف، دارای یک وضعیت “طول عمر” یا “Life Cycle” هستند که حالتهای مختلفی به آنها اختصاص داده میشود. به عنوان مثال، حالت NEW برای وظایف تازه ایجاد شده، PENDING برای وظایفی که در انتظار تخصیص هستند، COMPLETE برای زمانی که وظیفه با موفقیت به اتمام رسیده است.
لود بالانسینگ
لود بالانسینگ یا تعادل بار، جریان درخواستها را به خدمات، به صورت یکنواخت توزیع میکند. در صورتی که تعداد درخواستها بسیار زیاد باشد و افراد زیادی از یک وبسایت بازدید میکنند، معقولانهترین کار این است که تعداد بازدیدها به چندین نمونه که وبسایت را اجرا میکنند، تقسیم شوند. این کار به این دلیل انجام میشود که احتمال این که هر بازدیدکننده، کیفیت خدمات یکسانی را دریافت کند، افزایش یابد.
داکر سوآرم کار متعادلسازی بار را به روشی ایدهآل و نوآورانه (به اصطلاح Out Of the Box) انجام میدهد و پورتها را برای خدمات به متعادل کنندههای بار خارجی مانند HAProxy یا NGINX منتشر و توزیع میکند.
یک مثال از استفاده از Docker Swarm
برای اینکه سوآرم را بااستفاده از Docker ایجاد کنیم، باید حداقل یک گره مدیر و 2 گره کارگر داشته باشیم. در این مثال، فرض کنید ابتدا یک Vagrantfile ساده ایجاد کردهایم که یک پشته از 4 ماشین مجازی را ارائه میدهد که این ماشینها، Docker را به عنوان بخشی از اسکریپت init خود نصب میکنند.
در قدم اول، بااستفاده از دستور زیر، باید ماشینهای مجازیتان را راه اندازی کنید:
$ vagrant up
زمانی که همهی ماشینها آماده شدند، با دستورات زیر به گره مدیر وصل میشوید:
$ vagrant status Current machine states: manager running (virtualbox) worker01 running (virtualbox) worker02 running (virtualbox) worker03 running (virtualbox) $ vagrant ssh manager vagrant@manager: ~$ docker info
ساخت سوآرم
میتوانید از دستور زیر، برای مقداردهی اولیهی داکر سوآرم استفاده کنید:
vagrant@manager: ~$ docker swarm init --listen-addr 10.10.10.2: 2377 --advertise-addr 10.10.10.2: 2377 Swarm initialized: current node (r9xym5ymmzmm7e7ux3f4sxcs9) is now a manager.
در کد دستوری بالا، از آدرس 10.10.10.2 برای IP خصوصی مدیر استفاده شده است. در همان شبکه، لیست آدرس IP گرههای کارگر با آدرسهای (10.10.10.21, 10.10.10.22, 10.10.10.23) تعریف شدهاند.
اگر میخواهید یک گره کارگر را به این سوآرم اضافه کنید، باید دستور زیر را اجرا کنید:
$ docker swarm join --token SWMTKN-1-4w74yys9pihkl9qhmdrk0zlqtca9xrihan36cktdt2du251qxmbw60iu884vettl2ay65m0y1uy 10.10.10.2: 2377 This node joined a swarm as a worker.
پس از ایجاد اولین گره مدیر، توکن join نمایش داده میشود. در این مرحله، باید مطمئن شوید که برای تمام گرههای کارگر، از یک دستور استفاده میکنید: worker01، worker02 و worker03.
در مرحلهی بعد، باید با استفاده از دستور زیر، لیست گرهها را از گره مدیر بررسی کنید:
vagrant@manager: ~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION r9xym5ymmzmm7e7ux3f4sxcs9 * manager Ready Active Leader 20.10.12 r1l8jn1ot24hfzs0f7e9te5u3 worker01 Ready Active 20.10.12 wi7uq4jpcoh8rd7hlej6xuc4b worker02 Ready Active 20.10.12 p7paeu2d72rqu4dr1dllvcdys worker03 Ready Active 20.10.12
تا اینجا، شما موفق شدید که یک سوآرم را در داکر سوآرم ایجاد کنید.
استقرار خدمات به سوآرم
حال که یک سوآرم را با موفقیت ایجاد کردید، برای استقرار یک سرویس یا خدمات در آن، میتوانید از دستور docker service برای push کردن یک برنامهی کانتینری استفاده کنید. در این مرحله، میتوانید یک سری پارامترها مانند تعداد کپیها را مشخص کرده و یا پورتهای سرویس را خارج از سوآرم منتشر کنید. در صورتی که میخواهید کانتینرهای NGINX که در همهی گرهها پخش شدهاند را مستقر کنید، دستور زیر را در خط فرمان اجرا کنید:
vagrant@manager: ~$ docker service create –name my_nginx –replicas 8 –publish published=8080,target=80 nginx
اگر استقرار با موفقیت انجام شده باشد، با اجرای دستور زیر (خط اول)، باید بتوانید کانتینرهای در حال اجرا در یک گره را بررسی کنید و به localhost: 8080 دسترسی داشته باشید:
vagrant@worker02: ~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de396992a942 nginx: latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my_nginx.2.enp8yy55f0j1u1y8tm44lpxjq 935eea500ce6 nginx: latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my_nginx.6.f8zl2oh530rvfe15cr6fcmae0
همچنین، میتوانید از دستور docker stack با یک فایل yml استفاده کرده تا سرویسهایی که میخواهید اجرا کنید را با با توضیحاتشان مشاهده کنید. به عنوان مثال، دستور قبلی دارای مشخصات زیر است:
# Dockerfile version: '3.7' services: my_nginx: image: nginx: latest deploy: replicas: 8 ports: - "8080: 8080"
سایر دستورات مفید
در این قسمت، میخواهیم به معرفی دستورات مفید دیگری که میتوانید در حالت سوآرم استفاده کنید، بپردازیم:
بررسی وضعیت گره: با استفاده از دستور docker node inspect میتوانید اطلاعات گره را بررسی کنید:
vagrant@manager: ~$ docker node inspect worker02 [ { "ID": "wi7uq4jpcoh8rd7hlej6xuc4b", "Version": { "Index": 35 }, "CreatedAt": "2023-02-15T12: 28: 39.485382607Z", "UpdatedAt": "2023-02-16T10: 16: 47.28165702Z", …
تنزل مقام یک گره مدیر به کارگر: با اجرای دستور docker node demote <manager_node_id> میتوانید گره مدیر را به گره کارگر تبدیل کنید
ارتقای مقام یک گره کارگر به گره مدیر: با اجرای دستور docker node promote میتوانید یک گره کارگر با به گره مدیر ارتقا دهید.
vagrant@manager: ~$ docker node promote worker01 Node worker01 promoted to a manager in the swarm. vagrant@manager: ~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION r9xym5ymmzmm7e7ux3f4sxcs9 * manager Ready Active Leader 20.10.12 r1l8jn1ot24hfzs0f7e9te5u3 worker01 Ready Active Reachable 20.10.12 wi7uq4jpcoh8rd7hlej6xuc4b worker02 Ready Active 20.10.12 p7paeu2d72rqu4dr1dllvcdys worker03 Ready Active 20.10.12
خالیکردن یک گره: منظور از تخلیهی یک گره این است که Swarm engine هر کانتینر در حال اجرا را از گرهی موردنظر به بقیهی گرههای کارگر منتقل کند. این کار برای زمانی که میخواهید گرههای خود را ارتقا دهید و مطمئن شوید که یک گره قبل از پذیرش بارهای کاری، عملکرد سالمی دارد، بسیار مفید است. دستور زیر، این کار را انجام میدهد:
vagrant@manager: ~$ docker node update --availability drain worker02 vagrant@manager: ~$ docker node inspect worker02 --format '{{ .Spec.Availability }}' Drain
در صورتی که میخواهید گره را به حالت فعال برگردانید، دستور زیر را اجرا کنید:
vagrant@manager: ~$ docker node update --availability active worker02 worker02
سخن پایانی
در این مطلب، مروری کوتاه بر این موضوع داشتیم که Docker Swarm چیست و چه ویژگیها و کاربردهایی دارد. از آنجایی که حالت Swarm در Docker بهصورت پیشفرض تعبیه شده است، میتوانید بدون نیاز به یادگیری فناوریهای اضافی، مستقیماً به آزمایش آن بپردازید. Docker Swarm به دلیل سادگی، توزیع بار خودکار و راهاندازی ساده و روان، جایگزین جذابی برای Kubernetes به شمار میآید.