آنچه در این مقاله میخوانید
نحوه پیادهسازی High Availability در داکر
۱ آذر ۱۴۰۴
این روزها کسبوکارها و سرویسهای آنلاین باید همیشه در دسترس کاربران باشند و کوچکترین قطعی میتواند مشکلات بزرگی ایجاد کند. در چنین شرایطی، داشتن یک سیستم با High Availability یک ضرورت است. داکر به عنوان یک راهکار ساده و کاربردی این امکان را فراهم میکند که بتوانید کلاستری مقاوم در برابر خرابی بسازید، بدون اینکه پیچیدگیهای سیستمهای مشابه شما را سردرگم کند. البته Kubernetes امکانات پیشرفتهتری ارائه میدهد، اما برای پروژههایی که میخواهند سریع یک محیط پایدار و قابل اعتماد داشته باشند، داکر گزینهای مناسب و عملی است.
در این راهنما از لیارا، قدم به قدم نحوه راهاندازی یک کلاستر Docker را بررسی میکنیم. با همراه باشید تا یاد بگیریم چطور میتوانیم سرویسهایی پایدار و همیشگی داشته باشیم.
آنچه در این مقاله میخوانید:
- پیش نیازها
- گام اول: آماده سازی سرورها (نودها) برای کلاستر
- گام دوم: افزودن ریپازیتوری Docker
- گام سوم: استقرار اولین Stack از طریق رابط وب
- جمع بندی
- سوالات متداول

پیش نیازها
برای دنبال کردن بهتر این آموزش، موارد زیر را بایستی داشته باشید.
- حداقل ۳ نود مدیریتی: برای حفظ پایداری کلاستر و تحمل خطا، حداقل ۳ سرور لازم است.
- شبکه خصوصی بین نودها: ارتباط بین نودهای مدیریتی و کاری باید از طریق شبکه داخلی برقرار باشد.
- دسترسی اینترنت: تمام نودها باید به اینترنت برای نصب و بهروزرسانی دسترسی داشته باشند.
- ساختار پیشنهادی: ۳ نود مدیریتی و ۲ نود کاری، هرکدام با IP عمومی و خصوصی
- نکات امنیتی: فقط پورتهای مورد نیاز را باز نگه دارید؛ دسترسی به نودهای مدیریتی را محدود و ایمن کنید.
گام اول: آماده سازی سرورها (نودها) برای کلاستر
نکته: این مرحله باید روی تمامی نودها (چه مدیریتی و چه کاری) انجام شود.
پیش از راهاندازی کلاستر داکر، لازم است تمامی نودها آمادهسازی شوند. این فرایند شامل نصب آخرین نسخهی Docker است که مطابق با مستندات رسمی انجام میشود و برای کاربران آشنا با داکر، کاملا ساده و شناخته شده است.
در گام اول، پیشنیازهای لازم را با دستور زیر نصب میکنیم:
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
در مراحل بعد، مخزن رسمی داکر اضافه شده و پکیجهای مورد نیاز نصب خواهند شد.
گام دوم: افزودن ریپازیتوری Docker
برای اینکه بتوانیم آخرین نسخهی Docker CE را نصب کنیم، ابتدا باید ریپازیتوری رسمی داکر را به سیستم اضافه کنیم:
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
بعد از اضافه کردن ریپازیتوری، حالا میتوانیم پکیج Docker CE را نصب کنیم:
$ sudo yum install -y docker-ce
برای اینکه هر بار بعد از ریبوت دوباره لازم نباشد دستی Docker را run کنیم، کافیست سرویس را فعال کنیم و سپس استارت بزنیم:
$ sudo systemctl enable docker
$ sudo systemctl start docker
تا این مرحله، داکر روی سیستم بالا آمده است. حالا نوبت میرسد به بخش جذابتر ماجرا: ایجاد اولین Cluster Manager.
این مرحله مثل آمادهسازی زمین بازی برای ساخت سرویسهای مقیاسپذیر هست. با این کار پایهی اصلی یک Swarm Cluster ساخته میشود و سیستم آماده مدیریت چندین نود (Node) میشود.
۱. مقداردهی اولیه (Initialize) برای اولین Manager Node
نکته: این بخش فقط روی یکی از نودهای مدیریتی (manager node) اجرا میشود. تویدر مثال ما این کار روی manager1 انجام میشود.
برای شروع، Swarm Cluster را مقداردهی اولیه میکنیم. دقت کنید که هر دو پارامتر --advertise-addr و --data-path-addr روی eth1 تنظیم شدهاند تا مطمئن شویم که تمام ارتباطات فقط از طریق شبکهی خصوصی (private network) انجام میشوند:
$ sudo docker swarm init --advertise-addr=eth1 --data-path-addr=eth1
بعد از اجرای موفق دستور بالا، پیامی مشابه دستور زیر مشاهده خواهید کرد:
Swarm initialized: current node (ppp9aa6itx4r3e4u4rsbb6u7g) is now a manager.
برای اضافه کردن Worker یا Manager جدید، دستورهای مورد نیاز داده میشوند. بهطور مثال برای Worker:
docker swarm join --token <WORKER_TOKEN> 10.136.166.159:2377
و برای Manager جدید:
docker swarm join-token manager
برای بررسی وضعیت خوشه (cluster) هم میتوانید لیست نودها را ببینید:
$ sudo docker node ls
۲. اضافه کردن Managerهای بیشتر
نکته: این مرحله فقط روی نودهای مدیریتی دیگر (مثل manager2 و manager3) اجرا میشود.
ابتدا روی manager1 دستور زیر را اجرا کنید تا توکن پیوستن مدیرهای جدید را ببینید:
manager1$ sudo docker swarm join-token manager
پس از آن روی manager2 و manager3 دستور را به همراه همان --advertise-addr و --data-path-addr اجرا کنید:
$ sudo docker swarm join --advertise-addr=eth1 --data-path-addr=eth1 --token <MANAGER_TOKEN> 10.136.166.159:2377
اگر همه چیز درست پیش رفته باشد، خروجی سادهای مانند زیر مشاهده خواهید کرد:
This node joined a swarm as a manager.
و با یک docker node ls میتوانید ببینید که در حال حاضر سه Manager دارید که یکی Leader و دوتای دیگر Reachable هستند.
۳. اضافه کردن Worker Nodes
دقت کنید که این مرحله فقط روی نودهای Worker مثل worker1 و worker2 انجام میشود.
روی یکی از Managerها دستور زیر را اجرا کنید تا توکن Worker را بگیرید:
$ sudo docker swarm join-token worker
روی هر Worker نود، دستور زیر را به همراه پارامترهای شبکهی خصوصی اجرا کنید:
$ sudo docker swarm join --advertise-addr=eth1 --data-path-addr=eth1 --token <WORKER_TOKEN> 10.136.166.220:2377
اگر موفقیتآمیز باشد، پیام زیر را مشاهده خواهید کرد:
This node joined a swarm as a worker.
و حالا با اجرای دستور docker node ls همهچیز مشخص میشود: Managerها با وضعیت Leader یا Reachable و Workerها با وضعیت Active.
۴. راهاندازی رابط وب مدیریتی (Portainer)
برای مدیریت سادهتر کلاستر، بهترین ابزار Portainer هست. این ابزار تقریباً همهچیز برای مدیریت Swarm را در اختیارتان میگذارد. ابتدا فایل استک رسمی Portainer را روی یکی از Managerها دانلود کنید:
$ curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
به صورت پیشفرض روی پورت 9000 بالا میآید. اگر میخواهید آن را عوض کنید، در فایل مقدار 9000:9000 را تغییر دهید.
حالا استک را دیپلوی کنید:
$ sudo docker stack deploy --compose-file=portainer-agent-stack.yml portainer
سپس چند ثانیه صبر کنید تا سرویسها بالا بیایند، پس از آن میتوانید از مرورگر روی آدرس زیر به داشبورد مدیریتی دسترسی داشته باشید:
http://<manager1_ip>:9000
بار اول از شما میخواهد پسورد ادمین را تنظیم کنید و پس از آن میتوانید وارد داشبورد شوید.
در پایان این مرحله، یک Docker HA Cluster همراه با رابط کاربری (UI) کاربرپسند و کامل دارید.

گام سوم: استقرار اولین Stack از طریق رابط وب
یکی از جذابترین مزیتهای رابط وب Portainer این است که مدیریت و استقرار Stackها در Docker Swarm HA Cluster را بسیار ساده میکند بهعنوان نمونه، ما میخواهیم اپلیکیشن معروف Example Voting App را دیپلوی کنیم (با چند تغییر کوچیک برای تخصیص درست منابع). در ادامه مراحل دیپلوی را بررسی میکنیم:
۱. اضافه کردن Stack جدید
در داشبورد روی بخش Stacks رفته و گزینهی Add Stack را انتخاب کنید. سپس روی Web Editor کلیک کنید تا بتوانید فایل YAML مربوط به استک را مستقیم وارد کنید.
حالا یک اسم برای Stack وارد کنید (مثلاً votingapp) و محتوای زیر را در ادیتور کپی کنید:
version: "3"
services:
redis:
image: redis:alpine
networks:
- backend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
placement:
constraints: [node.role == worker]
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == worker]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
placement:
constraints: [node.role == worker]
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
placement:
constraints: [node.role == worker]
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == worker]
networks:
frontend:
backend:
volumes:
db-data:
روی Deploy Stack کلیک کنید تا اپلیکیشن راهاندازی شود.
۲. بررسی وضعیت Stack
اکنون روی استکی که ساختهاید، کلیک کنید. Portainer وضعیت سرویسهای در حال استقرار را نشان میدهد. چند ثانیه صبر کنید تا همهی کامپوننتها بالا بیایند.
نکات پایانی:
برخلاف Kubernetes که راهاندازی HA Cluster آن پروسهی نسبتاً پیچیدهای دارد، دیپلوی کردن یک Docker Swarm HA Cluster خیلی سادهتر است. اما چند نکتهی مهم را نباید فراموش کنید:
- حتماً حداقل ۳ نود Manager داشته باشید. زیرا اگر بیش از نصف آنها را از دست بدهید، کل Cluster غیرقابل استفاده میشود.
- طراحی HA را از همان ابتدا در نظر بگیرید: از Zoneهای مختلف استفاده کنید و نودها را درست Label بزنید.
- Managerها را ایزوله کنید. روی آنها اپلیکیشنهای Production اجرا نکنید، فقط سرویسهای مدیریتی مثل همین Web UI مجاز میباشد.
- سطح حمله را برای Managerها کم کنید: دسترسی اینترنتی را ببندید.
- مطمئن شوید که ارتباطات Control Plane و Data Plane از طریق شبکهی خصوصی انجام میشوند. اگر Cluster در دیتاسنترهای مختلف پخش شده است، حتماً از SSL Encryption برای Overlay Network استفاده کنید.
- یاد بگیرید چطور Managerها را درست اضافه یا حذف کنید.
جمع بندی
در این مقاله قدمبهقدم دیدیم که چطور میتوان یک Docker Swarm HA Cluster پایدار و مقاوم در برابر خطا راهاندازی کرد؛ از آمادهسازی نودها و نصب Docker گرفته تا راهاندازی اولین Manager، افزودن Workerها، و در نهایت استفاده از Portainer برای مدیریت سادهتر. با همین مراحل ساده، میتوان محیطی قابل اعتماد و مقیاسپذیر ساخت که بدون نیاز به پیچیدگیهای Kubernetes، پاسخگوی بسیاری از نیازهای عملیاتی کسبوکارها باشد. نکته کلیدی در طراحی چنین سیستمی، توجه به اصول High Availability است: حداقل سه Manager، جداسازی نودهای مدیریتی از نودهای کاری، محدود کردن دسترسیها و اطمینان از برقراری ارتباطات روی شبکه خصوصی. با رعایت این موارد، شما یک بستر امن و همیشه در دسترس برای اجرای سرویسهای حیاتی خود خواهید داشت.
سوالات متداول
۱. تفاوت Docker با Kubernetes در چیست؟
Docker راهکاری سادهتر و سبکتر برای ساخت کلاستر و مدیریت سرویسهاست و راهاندازی آن در چند مرحلهی ساده انجام میشود. در حالی که Kubernetes امکانات پیشرفتهتر، انعطافپذیری بیشتر و اکوسیستم گستردهتری دارد اما پیچیدگی زیادی دارد.
۲. برای داشتن High Availability در Docker چند Manager نیاز داریم؟
حداقل به ۳ نود Manager نیاز دارید تا در صورت از دست دادن یک نود، کلاستر همچنان پایدار بماند.
۳. آیا میتوان روی Managerها اپلیکیشنهای Production را اجرا کرد؟
خیر، توصیه نمیشود. نودهای Manager باید فقط برای کارهای مدیریتی استفاده شوند و اپلیکیشنها باید روی Workerها اجرا شوند.
۴. چطور میتوان امنیت کلاستر Docker را افزایش داد؟
برای بالابردن امنیت کلاستر، حتماً ارتباطات بین نودها را از طریق شبکه خصوصی برقرار کنید، دسترسی مستقیم اینترنتی به Managerها را ببندید، فقط پورتهای ضروری را باز نگه دارید و در صورت امکان برای دسترسی مدیریتی از VPN یا فایروال با آیپیهای محدود استفاده کنید.