آشنایی با دنیای داکر: نصب و راه اندازی سریع روی سرور
وقتی روی یک VPS چند سرویس مختلف داری، خیلی زود بحث وابستگیها و تنظیمات هرکدوم پیش میاد. مثلاً ممکنه یک برنامه به نسخه خاصی از یک کتابخانه نیاز داشته باشه یا بخوای یک دیتابیس و سرویس بازی رو کنار چند برنامه دیگه روی همون سرور اجرا کنی، بدون اینکه تغییرات یکی روی بقیه دردسر ایجاد کنه. از طرفی، اگه همین برنامه رو بخوای روی یک سرور دیگه هم بالا بیاری، تفاوت محیطها و نسخهها میتونه کار رو سخت کنه. Docker برای همین موقعیتها کاربردیه؛ با اجرای هر سرویس داخل Container، محیط اجرای اون تا حد زیادی از بقیه سرویسها جدا میشه و راهاندازی و مدیریت برنامهها روی سرور راحتتر میشه.
توی این مطلب قراره با Docker، دلیل استفاده از اون، نحوه کار Containerها و روش استفاده از Docker برای راهاندازی و مدیریت سرویسها روی سرور آشنا بشی.
داکر چیه و چیکار میکنه؟
Docker یک پلتفرم برای اجرای برنامهها و سرویسها در محیطهای جداشدهای به اسم Container هست. وقتی یه برنامه رو مستقیم روی سرور نصب میکنی، وابستگیها و تنظیماتش روی محیط اصلی سرور قرار میگیرن و ممکنه با سرویسهای دیگه تداخل پیدا کنن. Docker کمک میکنه محیط اجرای هر برنامه رو جدا از بقیه مدیریت کنی و وابستگیهای موردنیازش رو هم همراه با محیط اجرای برنامه در اختیار داشته باشی.
این روش باعث میشه اجرای برنامهها در محیطهای مختلف قابلتکرارتر باشه. مثلاً اگر برنامهای روی سیستم توسعه درست اجرا شده، میتونی همون محیط اجرای تعریفشده برای برنامه رو روی سرور هم استفاده کنی و کمتر درگیر تفاوت نسخهها و نصب دستی وابستگیها بشی.
داکر چجوری کار میکنه؟
روند کار Docker، در سادهترین حالت، از ساخت یک Image و اجرای اون بهعنوان Container تشکیل میشه. اگر برای برنامه Dockerfile داشته باشی، با docker build از روی اون یک Image میسازی و بعد با docker run یک Container بر اساس اون Image ایجاد و اجرا میکنی.
مثلاً:
docker build -t my-app .
docker run my-app
در دستور اول، Docker با استفاده از Dockerfile و Build Context، Image با نام my-app رو میسازه. دستور دوم هم یک Container بر اساس همین Image ایجاد و اجرا میکنه. برای دیدن Containerهای در حال اجرا میتونی از docker ps استفاده کنی و docker image ls هم Imageهای موجود روی سیستم رو نمایش میده.
اگر برنامه از چند سرویس تشکیل شده باشه، مثلاً یک اپلیکیشن بههمراه دیتابیس و Redis، میتونی پیکربندی این سرویسها رو با Docker Compose تعریف کنی تا راهاندازی و مدیریت چند Container مرتبط راحتتر انجام بشه.
Docker هنگام Build، مراحل ساخت Image رو به شکل Layerهای مختلف مدیریت میکنه. در Buildهای بعدی، اگر بعضی از این مراحل تغییر نکرده باشن، Docker میتونه در شرایط مناسب از Build Cache استفاده کنه و لازم نباشه اون مراحل رو دوباره از ابتدا اجرا کنه. مثلاً اگر وابستگیهای برنامه ثابت مونده باشن و فقط کد برنامه تغییر کرده باشه، ممکنه بخشی از لایههای قبلی قابل استفاده باشن و زمان Build کمتر بشه.
کانتینر (Container) و ایمیج (Image) چه فرقی باهم دارن؟
Image رو میتونی مثل یک الگوی آماده برای ایجاد محیط اجرای برنامه در نظر بگیری. این Image شامل فایلها، کتابخانهها و سایر موارد موردنیاز برای ایجاد اون محیطه، اما خودش یک برنامه در حال اجرا نیست.
Container نمونهایه که Docker از روی Image ایجاد میکنه و برنامه داخل اون اجرا میشه. هر Container وضعیت و تنظیمات runtime خودش رو داره و میتونه در حال اجرا یا متوقفشده باشه.
مثلاً فرض کن یک Image برای Nginx داری. این Image موارد لازم برای ایجاد محیط اجرای Nginx رو در اختیار Docker قرار میده. وقتی Image رو اجرا میکنی، Docker یک Container ایجاد میکنه و Nginx داخل اون اجرا میشه. از یک Image هم میتونی چند Container مختلف بسازی و هرکدوم رو با تنظیمات runtime متفاوت اجرا کنی.
فرق Docker با Virtual Machine چیه؟
Docker و Virtual Machine هر دو برای اجرای برنامهها در محیطهای جداشده استفاده میشن، اما معماری متفاوتی دارن. در VM معمولاً یک سیستمعامل مهمان کامل همراه با Kernel خودش اجرا میشه، در حالی که Containerهای Docker در حالت معمول Kernel سیستم میزبان رو به اشتراک میذارن و فرایندهای برنامه رو در محیط جداشده اجرا میکنن.
به همین دلیل Containerها معمولاً نسبت به VM سربار منابع کمتری دارن و سریعتر راهاندازی میشن. البته این به معنی جایگزینشدن کامل Docker با VM نیست؛ اگر به یک سیستمعامل یا Kernel مستقل نیاز داشته باشی، VM گزینه مناسبتریه.
چجوری داکر رو روی Ubuntu 24.04 نصب کنیم؟
مرحله اول: سیستمتو آپدیت کن
باید کاربر دسترسی sudo داشته باشد، سیستم بهروز باشد و اتصال اینترنت برقرار باشد.
sudo apt update && sudo apt upgrade -y
مرحله دوم: وابستگی هایی که لازم داره رو نصب کن
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
فهرست پکیجها را بهروز کن و سپس بستههای موجود را ارتقا بده.
پکیج هایی که به عنوان پیش نیاز روی سیستم نصب شدن:
1. apt-transport-https
2. ca-certificates
3. curl
4. software-properties-common
مرحله سوم: کلید GPG رسمی داکر رو نصب کن
اول پوشه مربوط به کلیدها رو باز کن:
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
مرحله چهارم: مخزن داکر رو اضافه کنین
برای اضافه کردن مخزن رسمی Docker، فایل docker.sources را ایجاد کنید:
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 “$VERSION_CODENAME”)
Components: stable
Architectures: $(dpkg –print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
در این مرحله Ubuntu باید repository رسمی Docker رو بشناسه و پکیجهای آن را برای نصب در دسترس قرار دهد.
مرحله پنجم: نصب داکر انجین (Docker Engine)
این دستور علاوه بر Docker Engine، ابزار خط فرمان Docker، containerd، افزونه Buildx و Docker Compose را هم نصب میکند.
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
پکیج هایی که نصب میشن:
1. docker-ce
موتور اصلی داکر واسه اجرای کانتینرها- مدیریت کانتینرها و تصاویر
2. docker-ce-cli
رابط خط فرمان داکر- شامل دستور `docker` هست که واسه اجرای کانتینرها، درست کردن ایمیجها و.. توی ترمینال سرور تایپ میشن.
این بخش از موتور اصلی (docker-ce) جدا شده تا بتونید داکر رو از راه دور مدیریت کنین یا CLI را بهطور مستقل ارتقا بدین.
3. containerd.io
containerd.io یکی از اجزای اصلی اجرای Containerهاست و وظایفی مثل مدیریت چرخه عمر Containerها و Imageها را در سطح Runtime بر عهده دارد.
مرحله ششم: از نصب داکر و کمپوز (Compose) مطمئن بشین
docker –version
docker compose version
واسه بررسی وضعیت نصب هم:
sudo systemctl status docker
اگه خروجیش این باشه:
active (running)
این وضعیت یعنی سرویس Docker در حال اجراست. برای خارجشدن از صفحه status هم میتوانی کلید q را بزنید.
Docker Compose چیه؟
اگر یک برنامه فقط یک Container نداشته باشد و مثلاً شامل:
Web App
Database
Redis
باشد، مدیریت تکتک Containerها سختتر میشود. Compose کمک میکند سرویسها، Imageها، Portها، Volumeها، Networkها و تنظیمات مرتبط را در یک فایل تعریف و با هم مدیریت کنی.
بعد از نصب، چطور یک Container اجرا و مدیریت کنیم؟
مثلاً:
docker ps
برای مشاهده Containerهای در حال اجرا
docker image ls
برای Imageها
docker run hello-world
برای اجرای یک Container آزمایشی
اگر بخواهی Containerهای متوقفشده را هم ببینی:
docker ps -a
و در صورت نیاز:
docker stop <container>
docker start <container>
docker logs <container>
docker exec -it <container> bash
اجرای داکر بدون sudo
بهصورت پیشفرض، کاربر معمولی برای اجرای دستورات Docker ممکن است به sudo نیاز داشته باشد. اگر میخواهید Docker را بدون sudo اجرا کنید، میتوانید کاربر فعلی را به گروه docker اضافه کنید:
sudo usermod -aG docker $USER
بعد از اجرای این دستور، برای اعمال تغییرات باید از Session خارج شوید و دوباره وارد شوید. همچنین میتوانید برای اعمال گروه جدید در Session فعلی از دستور زیر استفاده کنید:
newgrp docker
حالا برای بررسی، یک Container آزمایشی اجرا کنید:
docker run hello-world
نکته امنیتی: عضویت در گروه docker دسترسی قدرتمندی به Docker daemon ایجاد میکند؛ بنابراین در سرورهای چندکاربره، فقط کاربرانی را به این گروه اضافه کنید که به این سطح دسترسی نیاز دارند.
Port و Volume در Docker چه کاربردی دارند؟
Port برای اینه که سرویسی که داخل Container اجرا میشه، از طریق سرور در دسترس قرار بگیره. مثلاً اگر Nginx داخل Container روی پورت 80 اجرا بشه، با دستور `docker run -p 8080:80 nginx` میتونی پورت 8080 سرور رو به پورت 80 داخل Container وصل کنی؛ در این حالت درخواستهایی که به پورت 8080 سرور میرسن، به سرویس داخل Container هدایت میشن. این قابلیت وقتی چند سرویس روی یک سرور داری اهمیت بیشتری پیدا میکنه، چون میتونی برای هر سرویس Port مناسب تعریف کنی و در صورت نیاز دسترسی به اون رو با Firewall محدود کنی.
Volume برای نگهداری دادههاییه که نباید به عمر یک Container وابسته باشن. مثلاً اگه یک دیتابیس داخل Container اجرا کنی و اطلاعات رو فقط داخل خود Container ذخیره کنی، حذف یا جایگزین شدن Container میتونه باعث از دست رفتن دادهها بشه. با Volume، دادهها جدا از چرخه عمر Container نگهداری میشن و میتونی اونها رو برای سرویسهایی مثل دیتابیس، فایلهای برنامه یا دادههای دائمی استفاده کنی. البته Volume بهتنهایی جای Backup رو نمیگیره و برای اطلاعات مهم سرور همچنان باید بکاپ جداگانه داشته باشی.
نکات مهم هنگام استفاده از Docker روی سرور
- Imageهای ناشناس را بدون بررسی اجرا نکن.
- Portهای Container را بیدلیل روی اینترنت منتشر نکن.
- Container را لزوماً معادل یک VM کاملاً ایزوله فرض نکن.
- برای دادههای مهم از Volume و Backup مناسب استفاده کن.
تجربه شخصی
میتوان خروجی مرحله Build را به یک Image نهایی جدا منتقل کرد و ابزارها و وابستگیهای لازم برای Build را وارد Image نهایی نکرد. در Multi-stage Build، فرایند ساخت Image به چند مرحله تقسیم میشود و میتوان ابزارها و فایلهای موردنیاز مرحله Build را در Image نهایی قرار نداد. این کار در بعضی پروژهها باعث میشود Image نهایی کوچکتر شود و فقط اجزای موردنیاز برای اجرای برنامه را داشته باشد.
نتیجه گیری
Docker در توسعه نرمافزار، استقرار برنامهها و مدیریت سرویسهای مختلف روی سرور کاربرد زیادی پیدا کرده.