آشنایی با دنیای داکر: نصب و راه اندازی سریع روی سرور
وقتی روی یه سرور مجازی (VPS) چندتا سرویس مختلف رو با هم بالا میاری، خیلی زود سر و کله چالشهای مربوط به وابستگیها و تنظیماتشون پیدا میشه. مثلاً ممکنه یه برنامه نیاز به نسخه خاصی از یه کتابخونه داشته باشه، یا بخوای یه دیتابیس و سرویس بازی رو کنار چندتا اپلیکیشن دیگه روی همون سرور اجرا کنی؛ اونم طوری که تغییرات یکی، کار بقیه رو خراب نکنه. از طرفی، امان از روزی که بخوای همین برنامهها رو به یه سرور دیگه منتقل کنی! تفاوت توی نسخهها و محیط سیستمعامل جدید میتونه حسابی کلافهت کنه. دقیقاً همینجاست که داکر (Docker) به کارت میاد.
توی این مطلب قراره خیلی ساده با داکر، دلیل استفاده از اون، نحوه کار کانتینرها و روشهای کاربردی برای راهاندازی و مدیریت سرویسها روی سرور آشنا بشی.

داکر چیه و چیکار میکنه؟
به زبون ساده، داکر یه پلتفرمه که بهت اجازه میده برنامههات رو داخل محیطهای کاملاً مستقل و جداشدهای به اسم کانتینر (Container) بسازی، اجرا و مدیریت کنی. بهجای اینکه مجبور باشی کلی وابستگی، پکیج و تنظیمات مختلف رو مستقیماً روی سیستم اصلی یا سرورت نصب کنی، همه اینها رو داخل کانتینر بستهبندی میکنی. این کار باعث میشه برنامهت توی هر محیط دیگهای هم دقیقاً به همون شکل اجرا بشه و موقع راهاندازی سرویس روی سرور، دیگه درگیر تفاوت نسخهها و نصب دستی پکیجها نشی.
داکر چجوری کار میکنه؟
Docker از یک Image برای ایجاد و اجرای Container استفاده میکنه.

حالا اگه برنامهت یه داکر فایل (Dockerfile) داشته باشه، میتونی خیلی راحت با دستور docker build از روش یه ایمیج بسازی و بعد با دستور docker run، اون ایمیج رو به شکل یه کانتینر تر و تمیز اجرا کنی:
docker build -t my-app . docker run my-app
توی دستور اول، داکر میاد با استفاده از همون داکر فایل و محتویات پوشهت، ایمیج رو میسازه و توی دستور دوم، یه کانتینر بر اساس اون ایمیج راه میندازه.
برای اینکه ببینی الان چه کانتینرهایی دارن روی سرورت کار میکنن، میتونی از دستور docker ps استفاده کنی و برای دیدن لیست ایمیجهایی که داری، دستور docker image ls رو بزنی.
حالا اگه برنامهت پیچیدهتر باشه و از چندتا سرویس مختلف مثل وباپلیکیشن، دیتابیس و ردیس (Redis) تشکیل شده باشه، داکر کامپوز (Docker Compose) به کارت میاد؛ چون باهاش میتونی تنظیمات همه این سرویسها رو یکجا تعریف کنی و چندتا کانتینرِ به هم متصل رو خیلی راحتتر مدیریت کنی.
یکی دیگه از ویژگیهای باحال داکر، استفاده از لایهها (Layers) و سیستم کَش (Build Cache) موقع ساختن ایمیجه. اگه یه سری از مراحل ساخت نسبت به قبل تغییری نکرده باشن، داکر ترجیح میده از همون فایلهای کَششده قبلی استفاده کنه تا نخواد همهچیز رو از اول بسازه؛ اینطوری سرعت کار کلی بالاتر میره.

کانتینر (Container) و ایمیج (Image) چه فرقی باهم دارن؟
ایمیج رو میتونی مثل یه الگوی آماده برای ساختن محیط اجرای برنامهت در نظر بگیری. این ایمیج تمام فایلها، کتابخونهها و چیزهایی که برای کار کردن برنامه لازمه رو تو خودش داره، اما خودش به تنهایی یه برنامه در حال اجرا نیست.
کانتینر در واقع همون نمونهایه که داکر از روی ایمیج میسازه و برنامهت داخلش شروع به کار میکنه. کانتینر وضعیت و تنظیمات مخصوص به زمان اجرای خودش رو داره و میتونه روشن (در حال اجرا) یا خاموش (متوقفشده) باشه. مثلاً اگه یه ایمیج از وبسرور انجیناکس (Nginx) داشته باشی، میتونی از روی همون یه دونه ایمیج، چندتا کانتینر مختلف بسازی و هر کدوم رو با تنظیمات و پورتهای دلخواه خودت راه بندازی.

فرق Docker با Virtual Machine چیه؟
داکر و ماشینهای مجازی هردو برای این استفاده میشن که برنامهها رو توی محیطهای مستقل و جدا از هم اجرا کنی، اما روش کارشون زمین تا آسمون با هم فرق داره. توی ماشین مجازی (VM)، شما معمولاً یه سیستمعامل کامل رو با هسته (Kernel) اختصاصی خودش بالا میاری که حجم و منابع زیادی میبره؛ اما کانتینرهای داکر در حالت معمولی از همون هسته سیستمعامل اصلی سرور (میزبان) استفاده میکنن و اون رو بین خودشون به اشتراک میذارن.
به خاطر همین، کانتینرها منابع خیلی کمتری مصرف میکنن و سرعت راهاندازیشون خیلی بالاتره. البته این رو هم بگم که داکر جایگزین کامل ماشین مجازی نیست؛ اگه یه وقت نیاز مبرم به یه سیستمعامل کاملاً مستقل یا هسته متفاوت داشته باشی، ماشین مجازی هنوزم گزینه مناسبتریه.

چجوری داکر رو روی Ubuntu 24.04 نصب کنیم؟
اگه قبلاً نسخهای از داکر یا پکیجهایی مثل docker.io، docker-compose، containerd یا runc روی سرورت نصب بوده، بهتره قبل از اینکه مراحل بعدی رو بری، وضعیتشون رو بررسی کنی و ترجیحاً حذفشون کنی تا بعداً با پکیجهای رسمی داکر تداخل پیدا نکنن.
مرحله اول: سیستمت رو آپدیت کن
قبل از اینکه بری سراغ نصب داکر، بهتره پکیجهای سیستم رو بهروز کنی. برای این کار (و مراحل بعدی) حتماً نیاز به دسترسی sudo داری:
sudo apt update && sudo apt upgrade -y
مرحله دوم: پیشنیازها رو نصب کن
برای اینکه بتونی مخزن رسمی داکر رو به سیستم اضافه کنی، لازمه اول این دوتا پکیج کاربردی رو نصب کنی:
sudo apt install ca-certificates curl -y
مرحله سوم: کلید GPG رسمی داکر رو اضافه کن
اول با این دستور، پوشه مخصوص کلیدهای APT رو بساز:
sudo install -m 0755 -d /etc/apt/keyrings
بعدش هم کلید رسمی داکر رو دانلود کن و سطح دسترسیش رو جوری تنظیم کن که سیستم بتونه راحت بخونتش:
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc
مرحله چهارم: مخزن داکر رو اضافه کن
حالا وقتش رسیده که مخزن رسمی داکر رو به منابع APT سیستم اضافه کنی تا بتونی آخرین نسخه رو بگیری:
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
بعد از اضافه کردن مخزن، حتماً لیست پکیجهای سیستم رو دوباره بهروز کن:
sudo apt update
مرحله پنجم: داکر انجین (Docker Engine) رو نصب کن
حالا میتونی با این دستور، داکر انجین و ابزارهای پرکاربردش رو یکجا نصب کنی:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
این پکیجها در واقع موتور اصلی داکر، ابزار خط فرمان، هسته مدیریت کانتینرها (Containerd)، ابزار Buildx و افزونه داکر کامپوز رو روی سرورت فعال میکنن.
مرحله ششم: از نصب داکر و کامپوز مطمئن شو
برای اینکه خیالت راحت بشه داکر و کامپوز درست نصب شدن، میتونی ورژنشون رو چک کنی:
docker --version docker compose version
بعد برای اینکه مطمئن بشی موتور داکر بدون مشکل کار میکنه و میتونه کانتینر بسازه، این تست ساده رو بزن:
sudo docker run hello-world
اگه پیام موفقیتآمیز داکر (متن مربوط به hello-world) روی صفحه اومد، یعنی همهچیز ردیفه و کانتینرها دارن به درستی اجرا میشن.
برای بررسی وضعیت خود سرویس داکر هم میتونی این دستور رو وارد کنی:
sudo systemctl status docker
اگه عبارت active (running) رو با رنگ سبز دیدی، یعنی سرویس داکر روی سرورت فعاله. آخر سر هم برای اینکه از این صفحه وضعیت خارج بشی، کافیه دکمه q رو روی کیبورد بزنی.

بعد از نصب، چطور یک کانتینر اجرا و مدیریت کنیم؟
فقط یه نکته رو یادت باشه؛ اگه هنوز داکر رو جوری تنظیم نکردی که بدون sudo کار کنه، حتماً اولِ همه دستورهایی که مینویسی یه sudo بذار که سرور بهت ارور دسترسی (Permission) نده.
برای اینکه ببینی الان چه کانتینرهایی روشن و در حال اجران:
sudo docker ps
برای دیدن لیست ایمیجهایی که روی سرورت داری:
sudo docker image ls
برای دیدن همه کانتینرها، حتی اونهایی که خاموش یا متوقف شدن:
sudo docker ps -a
واسه مدیریت کانتینرها هم این دستورات خیلی به کارت میان:
sudo docker stop <container> sudo docker start <container> sudo docker logs <container> sudo docker exec -it <container> bash

دستور stop برای متوقف کردن، start برای اجرای دوباره و logs برای دیدن خروجیها و خطاهای کانتینره. با دستور exec هم میتونی داخل کانتینر دستور اجرا کنی؛ مثلاً باهاش وارد محیط خط فرمان کانتینر بشی. فقط حواست باشه اگه ایمیجی که استفاده میکنی از bash پشتیبانی نکنه، باید به جاش کلمه sh رو بنویسی.
اجرای داکر بدون نیاز به sudo
بهصورت پیشفرض، برای نوشتن دستورات داکر باید هی کلمه sudo رو اولش بذاری. اگه میخوای هی این کارو نکنی، کافیه کاربرت رو به گروه داکر اضافه کنی:
sudo usermod -aG docker $USER
بعد از زدن این دستور، برای اینکه تغییرات اعمال بشن باید یکبار از اکانتت خارج بشی و دوباره لاگین کنی. اما اگه عجله داری و نمیخوای خارج بشی، میتونی با این دستور گروه جدید رو توی همین سشن (Session) فعلی فعال کنی:
newgrp docker
حالا برای اینکه تستش کنی، ببین این کانتینر آزمایشی بدون sudo اجرا میشه یا نه:
docker run hello-world
اگه کانتینر بدون خطای دسترسی بالا اومد، یعنی همهچیز ردیفه و تنظیمات درست انجام شده.
یک نکته امنیتی: عضویت توی گروه docker دسترسی خیلی قدرتمندی به داکر میده و دسترسیهای بالایی رو روی سرور باز میکنه. واسه همین توی سرورهایی که چندتا کاربر دارن، فقط کاربرهایی رو به این گروه اضافه کن که واقعاً به این سطح از دسترسی نیاز دارن.
پورت (Port) و ولوم (Volume) توی داکر چه کاربردی دارن؟
پورت برای برقراری ارتباط شبکهای بین کانتینر و دنیای بیرون استفاده میشه. مثلاً اگه یه وبسرویس داخل کانتینر روی پورت 80 روشن باشه، تو میتونی با نوشتن ساختار 80:80 8080- ترافیک ورودی به پورت 8080 سرور رو بفرستی روی پورت 80 داخل کانتینر. اینطوری سرویس با آیپی سرور و پورت 8080 باز میشه. حالا اگه بخوای این سرویس فقط از داخل خود سرور یا از طریق یه ریورس پروکسی (مثل Nginx) روی همین سرور قابل دسترسی باشه، میتونی پورت رو فقط روی لوکالهاست قفل کنی؛ مثلاً اینطوری:
-p 127.0.0.1:8080:80
توی این حالت، پورت 8080 فقط از داخل خود سرور باز میشه و مستقیماً از اینترنت دسترسی نداره. پس بهتره پورتهای کانتینر رو فقط وقتی روی اینترنت باز کنی که واقعاً نیاز به دسترسی عمومی داشته باشن.

ولوم (Volume) هم برای نگهداشتن دادههایی استفاده میشه که میخوای مستقل از عمر خودِ کانتینر باقی بمونن. مثلاً اگه یه دیتابیس رو داخل کانتینر اجرا کنی، میتونی اطلاعاتش رو روی یه ولوم ذخیره کنی تا اگه یه وقت کانتینر حذف شد یا تغییرش دادی، دادههای دیتابیس پاک نشن و از بین نرن. البته یادت باشه که برای اطلاعات مهم و حیاتی، داشتن ولوم اصلاً جای بکآپ (Backup) گرفتن رو نمیگیره.
نکات کلیدی موقع کار با داکر روی سرور
وقتی داکر رو روی سرور اصلی بالا میاری، برای اینکه امنیت و پایداری سرویسهات به چالش نخوره، این چندتا نکته رو حتماً رعایت کن:
- ایمیجهای ناشناس رو اجرا نکن:
قبل از اجرای هر ایمیجی، مطمئن شو که معتبره. تا جای ممکن از ایمیجهای رسمی یا منابع قابلاعتماد استفاده کن تا سرورت آلوده نشه. - پورتها رو بیدلیل روی اینترنت باز نکن:
با p- میتونی پورت کانتینر رو عمومی کنی، اما سرویسهایی مثل دیتابیس اصلاً نیازی به دسترسی مستقیم از اینترنت ندارن؛ بذار فقط توی شبکه داخلی داکر با بقیه کانتینرها در ارتباط باشن. - کانتینر رو با ماشین مجازی اشتباه نگیر:
کانتینرها کاملاً از سرور ایزوله نیستن و دارن از هسته (Kernel) مشترک سیستمعامل اصلی استفاده میکنن. پس یه کانتینر نامطمئن هنوزم میتونه امنیت کل سرورت رو به خطر بندازه. - ولوم جای بکآپ رو نمیگیره:
ولوم (Volume) جلوی پاک شدن دادههای دیتابیس رو موقع حذف کانتینر میگیره، اما بکآپ نیست! برای دادههای مهمت حتماً سیستم بکآپگیری مجزا راه بنداز و تستش کن. - بیگدار به آب نزن:
دستوراتی مثل حذف، متوقف کردن یا آپدیت کانتینر میتونن خیلی راحت سرویسهای زنده سرور رو بخوابونن. قبل از هر تغییری، اول وابستگی کانتینرها و پورتها رو چک کن.
تجربه شخصی
توی بعضی از پروژهها، وقتی کار ساخت برنامه تموم میشه، میبینی یه سری از ابزارها و پکیجهایی که موقع بیلد (Build) استفاده کردی، اصلاً توی محیط اجرای نهایی نیازی بهشون نیست. اینجاست که قابلیت مالتیاستیج بیلد (Multi-stage Build) به کارت میاد؛ این ویژگی بهت اجازه میده مراحل ساخت برنامه رو از مرحله اجراش کاملاً جدا کنی. اینطوری فقط و فقط فایلها و وابستگیهای ضروری وارد ایمیج نهایی میشن. این روش توی خیلی از پروژهها میتونه حجم ایمیج رو به شدت کم کنه و یه محیط اجرای خیلی سبک و جمعوجور بهت تحویل بده.
نتیجه گیری
خلاصه اینکه داکر فقط یه ابزار معمولی برای اجرای برنامهها نیست؛ اگه روی سرورت چندتا سرویس مختلف داری، داکر قشنگ نجاتت میده و خیالت رو راحت میکنه که برنامههات بدون اینکه کار همدیگه رو خراب کنن، کنار هم کار بکنن. فقط یادت باشه دنیای داکر پر از جزئیاته؛ پس قبل از اینکه پروژه اصلیت رو روی سرور زنده کنی، حتماً اصول پایهای و امنیتی رو که با هم مرور کردیم چک کن تا بعداً غافلگیر نشی.
نه. Docker روی سیستمهای شخصی، محیط توسعه و سرورها قابل استفاده است و محدود به VPS یا سرور نیست.
نه. خاموش یا ریاستارت شدن سرور معمولاً باعث حذف Container نمیشود. Container متوقف میشود و بعد از بالا آمدن سیستم میتوان آن را دوباره اجرا کرد. البته برای اجرای خودکار Container بعد از ریاستارت باید تنظیمات مناسب را در نظر بگیری.
نه همیشه. Docker معمولاً سربار کمتری دارد و برای اجرای سرویسهای مختلف مناسب است، اما اگر به سیستمعامل یا Kernel مستقل نیاز داشته باشی، Virtual Machine انتخاب مناسبتری است.