Docker چیست؟ داکر یک پلتفرم متنباز برای ساخت، بستهبندی، توزیع و اجرای برنامهها در محیطهایی به نام Container یا کانتینر است. Docker به توسعهدهندگان و مدیران سرور اجازه میدهد یک برنامه را همراه با کتابخانهها، وابستگیها و تنظیمات موردنیازش بستهبندی کنند و آن را در محیطهای مختلف، از لپتاپ شخصی تا سرور مجازی و زیرساخت ابری، با سازگاری بیشتری اجرا کنند.
اگر تجربه برنامهنویسی یا مدیریت سرور داشته باشید، احتمالاً با این مشکل آشنا هستید: برنامه روی کامپیوتر توسعهدهنده درست کار میکند، اما بعد از انتقال به سرور با خطاهای مربوط به نسخه PHP، Python، Node.js، کتابخانهها یا تنظیمات سیستمعامل مواجه میشود. Docker برای سادهتر کردن مدیریت همین تفاوتها ایجاد شده است.
با استفاده از Docker میتوان سرویسهایی مانند Nginx، PostgreSQL، MySQL، Redis، RabbitMQ و برنامههای نوشتهشده با Python، Node.js، PHP یا Go را در کانتینرهای مجزا اجرا کرد. همچنین با ابزار Docker Compose میتوان چند کانتینر مرتبط را بهعنوان یک برنامه واحد تعریف، راهاندازی و مدیریت کرد.
البته Docker فقط یک ابزار ساده برای نصب نرمافزار نیست. امروزه این فناوری یکی از اجزای مهم زیرساختهای DevOps، معماری Microservices، فرآیندهای CI/CD و سامانههای Cloud Native محسوب میشود.
در این راهنما، از پایه بررسی میکنیم Docker چیست، کانتینر چگونه کار میکند، تفاوت Docker با ماشین مجازی و VPS چیست، Docker Image و Dockerfile چه کاربردی دارند و چگونه میتوان Docker را روی Ubuntu نصب کرد. سپس یک پروژه واقعی شامل برنامه Python و پایگاه داده Redis را با Docker Compose راهاندازی میکنیم و در پایان به امنیت، ذخیرهسازی دادهها، شبکه، مانیتورینگ و اجرای Docker در محیط Production میپردازیم.
سطح مقاله: مقدماتی تا پیشرفته | مناسب برای: توسعهدهندگان، مدیران سرور، متخصصان DevOps، تیمهای نرمافزاری، مدیران زیرساخت و کاربران سرور مجازی.
فهرست مطالب
- Docker چیست؟
- چرا Docker ساخته شد؟
- کانتینر چیست؟
- معماری Docker چگونه است؟
- اجزای اصلی Docker
- تفاوت Docker Image و Container
- Docker در سطح سیستمعامل چگونه کار میکند؟
- تفاوت Docker با ماشین مجازی و VPS
- مزایا و معایب Docker
- کاربردهای Docker
- پیشنیازهای اجرای Docker
- آموزش نصب Docker روی Ubuntu
- اجرای اولین کانتینر Docker
- دستورات پرکاربرد Docker
- Dockerfile چیست؟
- Docker Compose چیست؟
- آموزش عملی Docker Compose
- Docker Volume چیست؟
- شبکه در Docker چگونه کار میکند؟
- مدیریت منابع و مانیتورینگ
- امنیت Docker
- اجرای Docker در Production
- آیا Docker روی سرور مجازی اجرا میشود؟
- تفاوت Docker و Kubernetes
- جایگزینهای Docker
- خطاهای رایج Docker
- سوالات متداول
- جمعبندی
Docker چیست؟
Docker یا داکر مجموعهای از ابزارها برای توسعه، ساخت، توزیع و اجرای برنامههای Containerized است.
به زبان ساده، Docker به شما اجازه میدهد یک برنامه را همراه با محیط نرمافزاری موردنیاز آن داخل یک بسته استاندارد قرار دهید.
این بسته را میتوان به سرور دیگری منتقل کرد و بدون نیاز به نصب دستی تمام وابستگیها، برنامه را اجرا کرد؛ البته سیستم مقصد باید از معماری پردازنده و نوع کانتینر پشتیبانی کند.
برای مثال، فرض کنید یک برنامه Python دارید که به موارد زیر نیاز دارد:
- Python 3.12
- چند کتابخانه مشخص Python
- یک وبسرور یا Application Server
- متغیرهای محیطی مشخص
- اتصال به Redis
در روش سنتی باید این وابستگیها را روی هر سرور نصب و تنظیم کنید.
اما با Docker میتوان محیط برنامه را داخل یک Image تعریف کرد و همان Image را برای ساخت کانتینر در محیطهای مختلف به کار گرفت.
Application Code
+
Dependencies
+
Runtime
+
Configuration
|
v
Docker Image
|
v
Docker Container
|
v
Running Applicationاین استانداردسازی یکی از مهمترین دلایل محبوبیت Docker در توسعه نرمافزار و مدیریت زیرساخت است.
چرا Docker ساخته شد؟
قبل از رواج Containerization، نصب و انتقال نرمافزار میان محیطهای مختلف معمولاً با چالشهای زیادی همراه بود.
برای مثال، توسعهدهنده ممکن بود برنامهای را با نسخه خاصی از Node.js اجرا کند، اما سرور Production نسخه متفاوتی داشته باشد.
یا یک برنامه به نسخه مشخصی از OpenSSL نیاز داشته باشد، در حالی که برنامه دیگری روی همان سرور با نسخه متفاوتی سازگار باشد.
این اختلافها معمولاً باعث خطاهای زیر میشدند:
- ناسازگاری نسخه کتابخانهها
- تفاوت تنظیمات Development و Production
- تداخل وابستگی برنامههای مختلف
- پیچیدگی انتقال نرمافزار میان سرورها
- زمانبر بودن راهاندازی محیط تست
- مشکل در بازتولید خطاهای Production
یکی از عبارتهای مشهور میان توسعهدهندگان این بود:
It works on my machine!
یعنی برنامه روی سیستم من کار میکند، اما روی سیستم دیگری نه.
Docker با ایجاد محیطهای اجرایی استاندارد و قابل بازتولید، بسیاری از این مشکلات را کاهش میدهد.
تاریخچه کوتاه Docker
Docker در سال ۲۰۱۳ بهعنوان یک پروژه متنباز معرفی شد. Solomon Hykes از چهرههای اصلی شکلگیری این پروژه بود.
البته Docker اولین فناوری Containerization نبود. پیش از آن فناوریهایی مانند LXC و قابلیتهای ایزولهسازی سیستمعامل لینوکس وجود داشتند.
نوآوری مهم Docker، سادهتر کردن ساخت، مدیریت، توزیع و اجرای کانتینرها با ابزارهای استاندارد بود.
کانتینر چیست؟
Container یا کانتینر محیطی ایزوله برای اجرای یک برنامه یا سرویس است.
کانتینر میتواند شامل موارد زیر باشد:
- کد برنامه
- کتابخانهها
- Runtime
- فایلهای پیکربندی
- ابزارهای موردنیاز برنامه
در اجرای معمول کانتینرهای لینوکسی، کانتینرها از Kernel سیستمعامل میزبان استفاده میکنند.
این ویژگی یکی از تفاوتهای اصلی Container با Virtual Machine است.
یک مثال ساده از کانتینر
فرض کنید یک سرور Linux دارید و میخواهید همزمان سرویسهای زیر را اجرا کنید:
Linux Server
|
+-- Nginx Container
|
+-- Python API Container
|
+-- Redis Container
|
+-- PostgreSQL Containerهر سرویس میتواند وابستگیها، تنظیمات و فرآیندهای خودش را داشته باشد.
در عین حال همه این کانتینرهای لینوکسی از Kernel میزبان استفاده میکنند.
بنابراین برای هر سرویس نیازی به راهاندازی یک سیستمعامل کامل جداگانه نیست.
آیا هر کانتینر یک سیستمعامل مستقل دارد؟
خیر.
یک Docker Image ممکن است شامل فایلها و کتابخانههای Ubuntu، Debian یا Alpine باشد، اما این موضوع به معنی اجرای Kernel مستقل برای هر کانتینر نیست.
کانتینر معمولاً فضای کاربران و ابزارهای موردنیاز برنامه را در اختیار دارد و Kernel را با میزبان به اشتراک میگذارد.
معماری Docker چگونه کار میکند؟
Docker از معماری Client-Server استفاده میکند.
سه بخش اصلی این معماری عبارتاند از:
- Docker Client
- Docker Daemon
- Docker Objects
نمای ساده معماری:
Developer / Administrator
|
v
Docker CLI
|
v
Docker API
|
v
Docker Daemon
(dockerd)
|
+-----+------+
| | |
v v v
Images Containers Networks
|
v
Docker HostDocker Client چیست؟
Docker Client همان ابزاری است که معمولاً با دستور docker در ترمینال استفاده میکنیم.
مثلاً:
docker psیا:
docker run nginxClient درخواست را به Docker Daemon ارسال میکند.
Docker Daemon چیست؟
Docker Daemon یا dockerd سرویس پسزمینهای است که مدیریت کانتینرها، Imageها، Volumeها و Networkها را انجام میدهد.
Daemon درخواستهای Docker API را دریافت و عملیات لازم را اجرا میکند.
Docker Engine چیست؟
Docker Engine هسته اصلی اجرای Docker است و اجزایی مانند Docker Daemon، API و ابزارهای مرتبط را شامل میشود.
در معماری مدرن Docker Engine، اجزایی مانند containerd و Runtimeهای مبتنی بر OCI نیز در مدیریت چرخه عمر کانتینر نقش دارند.
اجزای اصلی Docker
برای کار عملی با Docker باید چند مفهوم را بشناسید.
| مفهوم | کاربرد |
|---|---|
| Docker Engine | موتور اصلی ساخت و اجرای کانتینر |
| Docker Image | الگوی ساخت کانتینر |
| Docker Container | نمونه ایجادشده از Image |
| Dockerfile | فایل دستورالعمل ساخت Image |
| Docker Registry | محل ذخیره و توزیع Image |
| Docker Hub | یکی از Registryهای عمومی معروف |
| Docker Volume | ذخیرهسازی پایدار داده |
| Docker Network | ارتباط کانتینرها با یکدیگر و شبکه |
| Docker Compose | مدیریت برنامههای چندکانتینری |
تفاوت Docker Image و Docker Container چیست؟
این دو مفهوم بسیار مهماند و نباید با یکدیگر اشتباه گرفته شوند.
Docker Image چیست؟
Docker Image یک الگوی عمدتاً Read-Only است که فایلها، وابستگیها و اطلاعات لازم برای ساخت کانتینر را شامل میشود.
برای مثال Image رسمی Nginx را میتوان از Docker Hub دریافت کرد:
docker pull nginx:stable-alpineاین دستور Image را دریافت میکند، اما بهتنهایی وبسرور را اجرا نمیکند.
Docker Container چیست؟
وقتی از Image یک نمونه اجرایی ایجاد میکنید، Container ساخته میشود.
docker run nginx:stable-alpineیک Image میتواند مبنای ساخت چندین Container باشد.
Docker Image
|
+-------+-------+
| | |
v v v
Container Container Container
1 2 3همچنین یک Container میتواند متوقف باشد. بنابراین وجود کانتینر الزاماً به معنی اجرای فعال آن نیست.
تفاوت Image و Container در یک نگاه
| Docker Image | Docker Container |
|---|---|
| الگوی ساخت | نمونه ایجادشده از Image |
| ساختار لایهای و عمدتاً فقطخواندنی | دارای لایه قابل نوشتن در زمان اجرا |
| با Build یا Pull به دست میآید | با Create یا Run ایجاد میشود |
| قابل ذخیره در Registry | محیط اجرای برنامه |
| میتواند مبنای چند Container باشد | به یک Image وابسته است |
Docker در سطح سیستمعامل چگونه کار میکند؟
Docker روی لینوکس از مجموعهای از قابلیتهای Kernel برای ایزولهسازی و مدیریت منابع استفاده میکند.
سه مفهوم اصلی عبارتاند از:
- Namespaces
- Control Groups یا cgroups
- Union Filesystems
Namespaces چیست؟
Namespaces به فرآیندهای داخل کانتینر اجازه میدهند نمای محدود و نسبتاً مستقلی از بخشهایی از سیستم داشته باشند.
برای مثال:
- PID Namespace: ایزولهسازی شناسه و نمای فرآیندها
- Network Namespace: ایزولهسازی پشته شبکه
- Mount Namespace: ایزولهسازی نمای فایلسیستم
- UTS Namespace: جداسازی Hostname و Domain Name سیستم
- User Namespace: نگاشت و ایزولهسازی هویت کاربران
cgroups چیست؟
Control Groups برای کنترل و حسابداری مصرف منابع استفاده میشوند.
به کمک cgroups میتوان برای کانتینرها محدودیتهایی مانند مصرف CPU، حافظه و تعداد فرآیندها تعیین کرد.
این موضوع در سرورهایی که چند سرویس را همزمان اجرا میکنند اهمیت زیادی دارد.
لایههای فایلسیستم Docker
Docker Imageها معمولاً از لایههای مختلف تشکیل میشوند.
هنگام ایجاد Container، یک لایه قابل نوشتن به آن اضافه میشود.
این طراحی اجازه میدهد چند کانتینر از لایههای مشترک Image استفاده کنند و فضای ذخیرهسازی کمتری مصرف شود.
بااینحال لایه قابل نوشتن Container جای مناسبی برای اطلاعات دائمی پایگاه داده نیست. برای چنین دادههایی باید از Volume یا روش ذخیرهسازی پایدار استفاده کرد.
تفاوت Docker با ماشین مجازی و VPS چیست؟
یکی از پرسشهای رایج این است که Docker چه تفاوتی با Virtual Machine دارد.
پاسخ اصلی در سطح Virtualization است.
ساختار ماشین مجازی
Physical Server
|
Hypervisor
|
+----+----+
| |
VM 1 VM 2
| |
Guest OS Guest OS
| |
App Appهر Virtual Machine معمولاً Kernel و سیستمعامل مستقل خودش را دارد.
ساختار Docker
Physical Server / VPS
|
Host OS
|
Host Kernel
|
Docker Engine
|
+------+------+------+
| | | |
App 1 App 2 App 3 App 4در حالت معمول اجرای کانتینرهای لینوکسی، برنامهها Kernel میزبان را به اشتراک میگذارند.
مقایسه Docker و Virtual Machine
| ویژگی | Docker Container | Virtual Machine |
|---|---|---|
| سطح ایزولهسازی | فرآیند و محیط سیستمعامل | سختافزار مجازی و سیستمعامل |
| Kernel مستقل | معمولاً خیر | بله |
| سرعت راهاندازی | معمولاً بسیار سریع | معمولاً کندتر |
| Overhead | معمولاً کمتر | معمولاً بیشتر |
| اجرای سیستمعامل متفاوت | دارای محدودیت Kernel | انعطاف بیشتر |
| ایزولهسازی امنیتی | وابسته به Kernel و تنظیمات | معمولاً مرز جداسازی قویتر |
| کاربرد | اجرای برنامه و سرویس | ساخت ماشین مستقل |
البته Docker و VPS رقیب مستقیم یکدیگر نیستند.
در عمل میتوان ابتدا یک سرور مجازی (VPS) تهیه کرد و سپس Docker را روی آن نصب کرد.
این معماری یکی از متداولترین روشهای میزبانی برنامههای Containerized است.
آیا Docker روی macOS و Windows هم کار میکند؟
بله.
اما در Docker Desktop، اجرای کانتینرهای لینوکسی روی macOS و Windows معمولاً از یک محیط لینوکسی مجازیسازیشده استفاده میکند.
بنابراین نباید تصور کرد یک Linux Container مستقیماً از Kernel macOS استفاده میکند.
مزایا و معایب Docker چیست؟
مزایای Docker
۱. سازگاری بیشتر بین محیطها
برنامه با وابستگیهای مشخص بستهبندی میشود و احتمال اختلاف محیط Development و Production کاهش مییابد.
۲. راهاندازی سریع سرویسها
بسیاری از نرمافزارها را میتوان با دریافت Image آماده و اجرای یک دستور راهاندازی کرد.
۳. استفاده بهینهتر از منابع
کانتینرها معمولاً نسبت به ماشینهای مجازی کامل Overhead کمتری دارند.
۴. مناسب برای CI/CD
از یک Image میتوان در Build، Test و Deployment استفاده کرد.
۵. قابلیت جابهجایی
Imageها را میتوان میان محیطهای سازگار منتقل کرد.
۶. مدیریت سادهتر نسخهها
امکان ساخت و انتشار Imageهای نسخهدار وجود دارد.
۷. تفکیک سرویسها
بهجای نصب تمام وابستگیهای برنامهها روی Host، سرویسها در کانتینرهای مستقل اجرا میشوند.
معایب و محدودیتهای Docker
در کنار مزایا، Docker محدودیتهایی نیز دارد:
- نیاز به شناخت Network و Storage
- پیچیدگی بیشتر در برنامههای چندسرویسی
- ریسک از دست رفتن داده در صورت مدیریت نادرست Volume
- وابستگی امنیت کانتینرها به امنیت Kernel میزبان
- نیاز به مدیریت Image Updates و Vulnerabilityها
- امکان پیچیده شدن Monitoring و Troubleshooting
- محدودیت در اجرای برنامههایی که به Kernel یا سختافزار خاص نیاز دارند
بنابراین استفاده از Docker باید بر اساس نیاز واقعی پروژه باشد، نه صرفاً محبوبیت این فناوری.
Docker چه کاربردهایی دارد؟
۱. توسعه نرمافزار
توسعهدهندگان میتوانند محیط استانداردی برای اجرای پروژه بسازند.
برای مثال اعضای یک تیم بهجای نصب دستی PostgreSQL و Redis، سرویسها را با Docker Compose اجرا میکنند.
۲. میزبانی وبسایت و API
برنامههای Node.js، Python، Go و PHP را میتوان داخل کانتینر اجرا کرد.
برای مثال در یک پروژه PHP، وبسرور Nginx و PHP-FPM میتوانند در کانتینرهای مجزا اجرا شوند.
برای آشنایی با معماری این دو سرویس، راهنمای آموزش نصب و پیکربندی PHP-FPM با Nginx را نیز مطالعه کنید.
۳. اجرای دیتابیس
پایگاههای دادهای مانند MySQL، PostgreSQL و Redis را میتوان در Docker اجرا کرد.
البته برای دیتابیس Production باید ذخیرهسازی پایدار، Backup، محدودیت منابع و مانیتورینگ بهدرستی طراحی شوند.
۴. معماری Microservices
در Microservices یک برنامه به چند سرویس مستقل تقسیم میشود.
API Gateway
|
+----------+----------+
| | |
v v v
Users API Orders API Billing API
| | |
+----------+----------+
|
Databaseهر سرویس میتواند Image، چرخه انتشار و تنظیمات مستقل داشته باشد.
۵. CI/CD
Docker در Pipelineهای خودکار Build و Deployment کاربرد فراوان دارد.
برای مثال:
Git Push
|
v
CI Pipeline
|
v
Build Docker Image
|
v
Run Tests
|
v
Push to Registry
|
v
Deploy to Server۶. محیطهای آزمایشی
با Docker میتوان محیطهای تست کوتاهمدت ایجاد کرد و پس از اتمام کار آنها را حذف کرد.
۷. هوش مصنوعی و پردازش داده
بسیاری از ابزارهای Machine Learning، مدلسرورها و سرویسهای پردازش داده را میتوان در کانتینر اجرا کرد.
در صورت نیاز به GPU نیز باید سازگاری Docker Runtime، درایور GPU و ابزارهای مرتبط بررسی شود.
برای اجرای Docker چه پیشنیازهایی لازم است؟
Docker Engine معمولاً روی یک میزبان Linux با نسخه و معماری پشتیبانیشده نصب میشود.
برای آموزش این مقاله، فرض میکنیم سرور دارای موارد زیر است:
- Ubuntu 24.04 LTS
- دسترسی SSH
- دسترسی sudo یا root
- اتصال اینترنت برای دریافت Package و Image
- فضای دیسک و RAM متناسب با برنامهها
این آموزش روی نسخههای پشتیبانیشده دیگر Ubuntu نیز با توجه به مستندات رسمی قابل تطبیق است.
اگر با ورود امن به سرور آشنا نیستید، پیشنهاد میکنیم ابتدا راهنمای آموزش ساخت SSH Key را مطالعه کنید.
آموزش نصب Docker روی Ubuntu ۲۴.۰۴
برای نصب Docker Engine بهتر است از مخزن رسمی Docker استفاده کنیم.
توجه: مراحل زیر برای نصب جدید روی سروری نوشته شدهاند که از قبل Docker فعال و دارای کانتینرهای Production نیست. اگر Docker قبلاً نصب شده، ابتدا وضعیت Packageها، Repositoryها و سرویسهای موجود را بررسی کنید.
مرحله اول: نصب پیشنیازها
sudo apt update
sudo apt install -y ca-certificates curlمرحله دوم: اضافه کردن کلید رسمی Docker
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
sudo tee /etc/apt/sources.list.d/docker.sources <<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سپس فهرست Packageها را بهروزرسانی کنید:
sudo apt updateمرحله چهارم: نصب Docker Engine و Compose
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-pluginدر این مرحله Docker Engine و ابزارهای Build و Compose نصب میشوند.
مرحله پنجم: بررسی سرویس Docker
sudo systemctl status dockerاگر سرویس فعال نبود:
sudo systemctl enable --now dockerمرحله ششم: بررسی نسخه Docker
sudo docker versionبرای بررسی Compose:
sudo docker compose versionمرحله هفتم: تست نصب
sudo docker run --rm hello-worldاگر Docker درست نصب شده باشد، Image آزمایشی دریافت و اجرا میشود و پیام موفقیت نمایش داده خواهد شد.
آیا باید کاربر را به گروه docker اضافه کنیم؟
میتوان با اضافه کردن کاربر به گروه docker دستورات را بدون sudo اجرا کرد؛ اما عضویت در این گروه عملاً دسترسی بسیار قدرتمندی به Docker Daemon و میزبان میدهد و از نظر امنیتی باید آن را معادل دسترسی سطح بالا در نظر گرفت.
برای سرور Production بهتر است مدیریت دسترسیها با دقت انجام شود. در این آموزش از sudo استفاده میکنیم.
آموزش اجرای اولین کانتینر Docker
حالا یک وبسرور Nginx اجرا میکنیم.
sudo docker run -d \
--name demo-nginx \
-p 127.0.0.1:8080:80 \
nginx:stable-alpineاین دستور چند کار انجام میدهد:
- در صورت نیاز Image را دریافت میکند.
- یک Container ایجاد میکند.
- نام
demo-nginxرا به آن اختصاص میدهد. - آن را در پسزمینه اجرا میکند.
- پورت ۸۰۸۰ میزبان را به پورت ۸۰ کانتینر متصل میکند.
در این مثال پورت فقط روی 127.0.0.1 میزبان در دسترس است.
برای تست از خود سرور:
curl -I http://127.0.0.1:8080اگر اتصال موفق باشد، پاسخ HTTP وبسرور را مشاهده میکنید.
اجرای Docker با پورت عمومی
اگر بهجای:
127.0.0.1:8080:80از:
8080:80استفاده کنید، Docker معمولاً پورت را روی Interfaceهای میزبان منتشر میکند.
این موضوع ممکن است سرویس را از اینترنت قابل دسترس کند.
برای سرور Production بهتر است انتشار پورتها با آگاهی از Firewall و Reverse Proxy انجام شود.
نکته امنیتی: مستندات Docker هشدار میدهند پورتهای Publishشده توسط Docker در بعضی پیکربندیهای Linux میتوانند قواعد معمول UFW را دور بزنند. بنابراین نباید صرفاً به وضعیت UFW برای محافظت از پورتهای Docker اکتفا کرد.
مهمترین دستورات Docker
پس از نصب، این دستورات بیشترین کاربرد را دارند.
نمایش کانتینرهای فعال
sudo docker psنمایش تمام کانتینرها
sudo docker ps -aنمایش Imageها
sudo docker imagesنمایش لاگ کانتینر
sudo docker logs demo-nginxمشاهده زنده لاگها
sudo docker logs -f demo-nginxورود به Shell کانتینر
sudo docker exec -it demo-nginx shهمه Imageها Bash ندارند؛ برای همین در این مثال از sh استفاده میکنیم.
متوقف کردن کانتینر
sudo docker stop demo-nginxشروع مجدد کانتینر متوقفشده
sudo docker start demo-nginxریاستارت کانتینر
sudo docker restart demo-nginxحذف کانتینر متوقفشده
sudo docker rm demo-nginxمشاهده مصرف منابع
sudo docker statsمشاهده اطلاعات کانتینر
sudo docker inspect demo-nginxDockerfile چیست؟
Dockerfile یک فایل متنی است که دستورالعمل ساخت Docker Image را مشخص میکند.
برای مثال Dockerfile میتواند تعیین کند:
- Image پایه چیست؟
- چه وابستگیهایی نصب شوند؟
- چه فایلهایی وارد Image شوند؟
- Working Directory کجاست؟
- برنامه با چه دستوری اجرا شود؟
برخی دستورات مهم Dockerfile عبارتاند از:
| دستور | کاربرد |
|---|---|
| FROM | انتخاب Image پایه |
| WORKDIR | تعیین مسیر کاری |
| COPY | کپی فایل به Image |
| RUN | اجرای دستور هنگام Build |
| ENV | تعریف متغیر محیطی |
| EXPOSE | مستندسازی پورت سرویس |
| USER | تعیین کاربر اجرای برنامه |
| CMD | دستور پیشفرض اجرای کانتینر |
نکته مهم این است که EXPOSE بهتنهایی پورت را روی میزبان Publish نمیکند.
Docker Layer و Build Cache
Dockerfile بهصورت مرحلهای پردازش میشود.
Docker میتواند از Cache لایههای قبلی استفاده کند تا در Buildهای بعدی، مراحل بدون تغییر دوباره اجرا نشوند.
به همین دلیل ترتیب دستورات Dockerfile روی سرعت Build تأثیر دارد.
Docker Compose چیست؟
Docker Compose ابزاری برای تعریف و مدیریت برنامههایی است که از چند Container تشکیل شدهاند.
فرض کنید یک پروژه شامل سه سرویس باشد:
Web Application
|
+-- PostgreSQL
|
+-- Redisبدون Compose باید هر کانتینر، شبکه، Volume و تنظیمات آن را جداگانه مدیریت کنید.
اما با Compose میتوان ساختار برنامه را داخل فایلی مانند compose.yaml تعریف کرد.
سپس با یک دستور تمام سرویسها را اجرا کرد:
sudo docker compose up -dدر نسخههای جدید، دستور استاندارد Compose به شکل docker compose است. در آموزشهای قدیمی ممکن است docker-compose را ببینید.
آموزش عملی Docker Compose؛ اجرای Python و Redis
برای اینکه کاربرد Docker را بهتر درک کنیم، یک پروژه کوچک میسازیم.
این پروژه دو سرویس دارد:
- یک برنامه Python با Flask
- یک Redis برای ذخیره شمارنده بازدیدها
هدف این است که با هر درخواست به برنامه، شمارنده داخل Redis افزایش یابد.
مرحله اول: ساخت پوشه پروژه
mkdir docker-demo
cd docker-demoمرحله دوم: ساخت برنامه Python
فایلی به نام app.py ایجاد کنید:
import os
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis_client = Redis(
host=os.getenv("REDIS_HOST", "redis"),
port=6379,
decode_responses=True
)
@app.get("/")
def index():
visits = redis_client.incr("visits")
return f"Hello from Docker! Visits: {visits}\n"این برنامه به Redis متصل میشود و با هر درخواست مقدار visits را افزایش میدهد.
مرحله سوم: تعریف وابستگیها
فایل requirements.txt:
Flask>=3,<4
redis>=5,<7
gunicorn>=23,<25این بازهها برای ساده ماندن مثال استفاده شدهاند. برای Deployment قابل بازتولید در Production، نسخههای دقیق وابستگیها را پس از تست قفل کنید.
مرحله چهارم: ساخت Dockerfile
فایلی با نام Dockerfile بسازید:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
RUN useradd --create-home appuser
USER appuser
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "2", "app:app"]این Dockerfile:
- از Python ۳.۱۲ بهعنوان Base Image استفاده میکند.
- وابستگیها را نصب میکند.
- کد برنامه را کپی میکند.
- کاربر غیر root ایجاد میکند.
- برنامه را با Gunicorn اجرا میکند.
مرحله پنجم: ساخت فایل Docker Compose
فایلی به نام compose.yaml ایجاد کنید:
services:
web:
build: .
ports:
- "127.0.0.1:8080:8000"
environment:
REDIS_HOST: redis
depends_on:
redis:
condition: service_healthy
restart: unless-stopped
redis:
image: redis:7-alpine
command:
- redis-server
- --appendonly
- "yes"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
restart: unless-stopped
volumes:
redis_data:مرحله ششم: اجرای پروژه
sudo docker compose up -d --buildگزینه --build باعث میشود Image برنامه در صورت نیاز ساخته شود.
گزینه -d سرویسها را در پسزمینه اجرا میکند.
مرحله هفتم: بررسی وضعیت
sudo docker compose psسپس:
curl http://127.0.0.1:8080خروجی نمونه:
Hello from Docker! Visits: 1با اجرای مجدد:
Hello from Docker! Visits: 2شمارنده افزایش پیدا میکند.
مرحله هشتم: بررسی ارتباط کانتینرها
در فایل Compose، برنامه Python برای اتصال به Redis از Hostname زیر استفاده میکند:
redisچرا از localhost استفاده نکردیم؟
چون در Docker، localhost داخل کانتینر به همان کانتینر اشاره میکند.
Compose برای سرویسهای موجود در شبکه مشترک امکان Service Discovery فراهم میکند؛ بنابراین برنامه میتواند سرویس Redis را با نام redis پیدا کند.
مرحله نهم: مشاهده لاگ برنامه
sudo docker compose logs -f webمرحله دهم: توقف پروژه
sudo docker compose downاین دستور کانتینرها و شبکههای مربوط به پروژه را حذف میکند، اما بهصورت پیشفرض Named Volume تعریفشده را حذف نمیکند.
هشدار: دستور زیر متفاوت است:
sudo docker compose down -vگزینه -v میتواند Volumeهای مربوط به پروژه، از جمله دادههای Redis در مثال ما را حذف کند.
روی سرور Production از این دستور بدون بررسی دقیق استفاده نکنید.
این پروژه یک نمونه آموزشی است. برای استفاده Production باید امنیت Redis، مدیریت Secretها، تنظیمات Reverse Proxy، Backup، محدودیت منابع و مانیتورینگ را نیز تکمیل کنید.
Docker Volume چیست و چرا اهمیت دارد؟
یکی از مهمترین مفاهیم در Docker، ذخیرهسازی دادههای پایدار است.
بهصورت پیشفرض، تغییرات ذخیرهشده در لایه قابل نوشتن کانتینر به چرخه عمر همان کانتینر وابستهاند.
اگر کانتینر را حذف و دوباره ایجاد کنید، دادههایی که فقط در آن لایه قرار داشتهاند از دست میروند.
برای حل این مشکل از Docker Volume استفاده میشود.
Named Volume چیست؟
Docker میتواند یک فضای ذخیرهسازی مستقل از چرخه عمر Container ایجاد کند.
مثلاً:
sudo docker volume create app-dataمشاهده Volumeها:
sudo docker volume lsمشاهده جزئیات:
sudo docker volume inspect app-dataBind Mount چیست؟
Bind Mount یک مسیر مشخص از فایلسیستم میزبان را داخل کانتینر در دسترس قرار میدهد.
برای مثال:
sudo docker run --rm \
-v "$PWD/site:/usr/share/nginx/html:ro" \
nginx:stable-alpineدر این مثال یک پوشه از Host داخل کانتینر Mount میشود.
پسوند :ro نشاندهنده Read-Only بودن Mount است.
Volume بهتر است یا Bind Mount؟
| معیار | Named Volume | Bind Mount |
|---|---|---|
| مدیریت توسط Docker | بله | خیر؛ مسیر میزبان تعیین میشود |
| وابستگی به مسیر Host | کمتر | بیشتر |
| دسترسی مستقیم به فایل از Host | کمتر و غیرمستقیمتر | سادهتر |
| کاربرد رایج | داده برنامه و دیتابیس | فایل توسعه، پیکربندی و محتوا |
آیا Docker Volume جای Backup است؟
خیر.
Volume فقط داده را از چرخه عمر کانتینر جدا میکند.
خرابی دیسک، حذف اشتباه Volume، فساد دیتابیس یا از دست رفتن Host همچنان میتواند دادهها را نابود کند.
بنابراین برای سرویسهای مهم باید Backup مستقل، نگهداری خارج از سرور و آزمایش Restore داشته باشید.
شبکه Docker چگونه کار میکند؟
Docker سیستم Networking مخصوص خود را دارد.
چند Driver رایج عبارتاند از:
- Bridge
- Host
- None
- Overlay
Bridge Network
در یک Docker Host، شبکه Bridge یکی از روشهای رایج ارتباط کانتینرهاست.
روی User-defined Bridge Network، کانتینرها میتوانند با نام یکدیگر ارتباط برقرار کنند.
ساخت Network:
sudo docker network create app-networkمشاهده Networkها:
sudo docker network lsHost Network
در حالت Host Networking، کانتینر از Network Namespace میزبان استفاده میکند.
این حالت میتواند برای برخی Workloadهای خاص مناسب باشد، اما جداسازی شبکه را کاهش میدهد.
Overlay Network
Overlay برای بعضی سناریوهای ارتباطی چند Host، از جمله شبکههای Docker Swarm، کاربرد دارد.
تفاوت EXPOSE و Publish Port
این دو موضوع را نباید یکسان در نظر گرفت.
EXPOSE در Dockerfile بیشتر نقش مستندسازی پورت مورد انتظار برنامه را دارد.
اما -p هنگام اجرای Container، Port Mapping واقعی ایجاد میکند.
برای مثال:
-p 127.0.0.1:8080:80پورت ۸۰ کانتینر را از طریق پورت ۸۰۸۰ روی Loopback میزبان در دسترس قرار میدهد.
اگر درباره IP Address، Subnet و محدودههای شبکه آشنایی کافی ندارید، مطالعه مقالات شبکه در وبلاگ پویاسازان میتواند در طراحی Docker Network و ارتباط بین سرورها کمککننده باشد.
مدیریت CPU و RAM کانتینرهای Docker
کانتینرها از منابع میزبان استفاده میکنند.
اگر برای آنها محدودیت مناسبی تعیین نشود، یک سرویس پرمصرف میتواند روی سایر سرویسهای همان Host اثر بگذارد.
محدود کردن مصرف حافظه
sudo docker run -d \
--name limited-nginx \
--memory=512m \
nginx:stable-alpineمحدود کردن CPU
sudo docker run -d \
--name cpu-limited-nginx \
--cpus=1.5 \
nginx:stable-alpineمحدود کردن تعداد فرآیندها
--pids-limit=100مقادیر واقعی باید با توجه به نوع برنامه و مصرف آن انتخاب شوند.
مشاهده مصرف کانتینرها
sudo docker statsاین دستور اطلاعاتی مانند مصرف CPU، Memory، Network I/O و Block I/O را نمایش میدهد.
برای بررسی سلامت کلی سیستم نیز بهتر است مصرف منابع Host را جداگانه مانیتور کنید.
امنیت Docker؛ آیا کانتینرها امن هستند؟
Docker امکانات مختلفی برای ایزولهسازی و کنترل دسترسی ارائه میکند، اما Container بهتنهایی یک مرز امنیتی مطلق نیست.
کانتینرهای لینوکسی معمولاً Kernel میزبان را به اشتراک میگذارند؛ بنابراین امنیت Kernel و Docker Engine اهمیت زیادی دارد.
برای آشنایی با نمونهای از ریسکهای Kernel در محیطهای Containerized میتوانید مقاله آسیبپذیری Copy Fail در کرنل لینوکس را مطالعه کنید.
۱. از Imageهای معتبر استفاده کنید
ترجیحاً Imageها را از ناشران معتبر و Registryهای مورد اعتماد دریافت کنید.
Image ناشناس میتواند شامل نرمافزار آسیبپذیر یا مخرب باشد.
۲. Docker و Host را بهروزرسانی کنید
بهروزرسانی امنیتی Docker Engine، Kernel و سیستمعامل میزبان را جدی بگیرید.
۳. کانتینر را بدون نیاز با root اجرا نکنید
در صورت امکان از کاربر غیر root استفاده کنید.
میتوانید در Dockerfile از دستور USER استفاده کنید.
۴. از Privileged Container بدون ضرورت استفاده نکنید
اجرای کانتینر با:
--privilegedمیتواند دسترسیهای گستردهای به کانتینر بدهد و سطح حمله را افزایش دهد.
۵. Docker Socket را عمومی نکنید
Docker Socket معمولاً در مسیر زیر قرار دارد:
/var/run/docker.sockدسترسی نوشتن به Docker Socket میتواند عملاً به کنترل میزبان منجر شود.
بنابراین اتصال این Socket به کانتینرهای ناشناس یا ارائه آن روی شبکه بدون کنترل امنیتی خطرناک است.
۶. دسترسی شبکه را محدود کنید
دیتابیسها، Redis و سرویسهای مدیریتی را بدون نیاز روی اینترنت منتشر نکنید.
برای سرویسهای داخلی، Network خصوصی Docker انتخاب بهتری است.
۷. Secretها را داخل Image قرار ندهید
رمز دیتابیس، Token و API Key نباید داخل Dockerfile یا لایههای Image قرار گیرند.
برای محیط Production باید از روشهای مناسب مدیریت Secret استفاده کنید.
۸. Resource Limit تعریف کنید
محدودیت CPU، Memory و PID میتواند به کاهش اثر بعضی خطاهای نرمافزاری و مصرف غیرمنتظره منابع کمک کند.
۹. قابلیتهای امنیتی Kernel را حفظ کنید
Docker از امکاناتی مانند Linux Capabilities، Seccomp و سایر سازوکارهای امنیتی استفاده میکند.
این محدودیتها را بدون دلیل مشخص غیرفعال نکنید.
۱۰. از دادهها Backup مستقل داشته باشید
امنیت فقط جلوگیری از نفوذ نیست؛ امکان بازیابی داده پس از حادثه نیز بخشی از امنیت عملیاتی محسوب میشود.
نکات مهم اجرای Docker در Production
اجرای موفق یک Container در محیط آزمایشی با آماده بودن آن برای Production متفاوت است.
در محیط عملیاتی باید موضوعات زیر بررسی شوند.
Health Check
روشن بودن Container الزاماً به معنی سالم بودن Application نیست.
یک برنامه ممکن است فرآیند فعال داشته باشد، اما به درخواستها پاسخ ندهد.
با Health Check میتوان وضعیت واقعی سرویس را دقیقتر بررسی کرد.
Restart Policy
برای سرویسهای مناسب میتوان Restart Policy تعریف کرد.
مثلاً:
restart: unless-stoppedاین تنظیم باعث میشود Docker تحت شرایط مشخص کانتینر را دوباره اجرا کند.
البته Restart Policy جایگزین مانیتورینگ یا High Availability نیست.
Log Management
لاگها باید مدیریت شوند تا فضای دیسک بیرویه مصرف نشود.
برای محیطهای جدی، Log Rotation و ارسال لاگ به سیستم مانیتورینگ مرکزی اهمیت دارد.
Backup و Recovery
از دادههای پایدار، فایلهای پیکربندی و Secretهای لازم برای بازیابی سرویس نسخه پشتیبان تهیه کنید.
Image Versioning
برای Production بهتر است نسخه Imageها کنترل شود.
استفاده بدون برنامه از Tagهای متغیر مانند latest میتواند باعث تغییر ناخواسته نسخه هنگام Deployment شود.
برای بازتولید دقیقتر Image میتوان از Image Digest نیز استفاده کرد.
Vulnerability Scanning
Imageها را از نظر کتابخانهها و Packageهای آسیبپذیر بررسی کنید.
Reverse Proxy و HTTPS
در پروژههای وب معمولاً بهتر است یک Reverse Proxy ورودیهای HTTP/HTTPS را مدیریت کند.
سرویسهای داخلی میتوانند پشت Reverse Proxy باقی بمانند.
برای ارتباط HTTPS نیز داشتن گواهی SSL معتبر و تنظیم صحیح TLS ضروری است.
استفاده از Multi-stage Build
در پروژههایی که نیاز به Build دارند، Multi-stage Build کمک میکند ابزارهای کامپایل و وابستگیهای غیرضروری از Image نهایی حذف شوند.
این کار میتواند اندازه Image و سطح حمله را کاهش دهد.
استفاده از .dockerignore
با فایل .dockerignore میتوان فایلهای غیرضروری را از Build Context حذف کرد.
برای مثال:
.git
.env
__pycache__
node_modules
*.logاین فایل کمک میکند دادههای اضافی یا حساس بهاشتباه وارد Image نشوند.
آیا Docker روی سرور مجازی اجرا میشود؟
بله؛ اجرای Docker روی VPS یکی از رایجترین سناریوهای استفاده از آن است.
برای این کار معمولاً به موارد زیر نیاز دارید:
- دسترسی root یا sudo
- سیستمعامل و Kernel سازگار
- منابع CPU و RAM کافی
- فضای ذخیرهسازی مناسب
- امکان مدیریت Firewall و Network
برای اجرای Docker میتوانید از یک سرور مجازی آلمان یا سرور مجازی ایران با منابع متناسب استفاده کنید.
در انتخاب موقعیت سرور باید محل کاربران، وابستگی برنامه به سرویسهای خارجی و کیفیت ارتباط شبکه را در نظر گرفت.
برای Docker چه مقدار RAM و CPU لازم است؟
Docker بهخودیخود تعیینکننده اصلی مصرف منابع نیست؛ سرویسهایی که اجرا میکنید منابع مصرف میکنند.
برای شروع میتوان این برآوردهای اولیه را در نظر گرفت:
| نوع پروژه | CPU اولیه | RAM اولیه |
|---|---|---|
| محیط تست و چند کانتینر بسیار سبک | ۲ vCPU | ۴ GB |
| API کوچک همراه Redis یا دیتابیس سبک | ۴ vCPU | ۸ GB |
| چند Microservice با مصرف متوسط | ۸ vCPU | ۱۶ GB |
| Workload پرترافیک و چند دیتابیس | بر اساس Benchmark | بر اساس مصرف واقعی |
این مقادیر فقط نقطه شروع تخمینی هستند و تضمین عملکرد محسوب نمیشوند.
برای مثال، اجرای Nginx سبک با اجرای PostgreSQL، Elasticsearch یا یک مدل هوش مصنوعی تفاوت بسیار زیادی دارد.
آیا روی هاست اشتراکی میتوان Docker نصب کرد؟
در بیشتر سرویسهای هاست اشتراکی امکان نصب و مدیریت Docker Engine وجود ندارد؛ زیرا کاربر دسترسی لازم به Docker Daemon و تنظیمات سطح سیستمعامل را ندارد.
اگر فقط یک سایت وردپرسی یا PHP دارید و نیازی به سرویس سفارشی ندارید، هاست لینوکس ممکن است انتخاب سادهتر و اقتصادیتری باشد.
اما اگر میخواهید چند سرویس را با Docker Compose اجرا کنید، بهطور معمول سرور مجازی یا اختصاصی انتخاب مناسبتری است.
تفاوت Docker و Kubernetes چیست؟
Docker و Kubernetes معمولاً در کنار یکدیگر مطرح میشوند، اما نقش یکسانی ندارند.
Docker ابزارها و استانداردهایی برای ساخت، توزیع و اجرای کانتینر فراهم میکند.
در مقابل، Kubernetes پلتفرمی برای Orchestration برنامههای Containerized در مقیاس بزرگتر است.
Kubernetes میتواند موارد زیر را مدیریت کند:
- زمانبندی Workloadها روی Nodeهای مختلف
- افزایش یا کاهش تعداد Replicaها
- Service Discovery
- Rolling Update
- Self-healing
- مدیریت Configuration
آیا Kubernetes به Docker Engine نیاز دارد؟
خیر.
Kubernetes مدرن برای اجرای کانتینرها از Runtimeهای سازگار با Container Runtime Interface، مانند containerd یا CRI-O، استفاده میکند.
بااینحال Imageهایی که با Docker ساخته میشوند، در صورت سازگاری با استانداردهای مربوط، میتوانند روی Kubernetes اجرا شوند.
Docker Compose یا Kubernetes؟
| ویژگی | Docker Compose | Kubernetes |
|---|---|---|
| پیچیدگی راهاندازی | کمتر | بیشتر |
| سناریوی رایج | برنامه چندکانتینری و استقرار ساده | Orchestration پیشرفته |
| مدیریت چند Node | محدود | بله |
| Auto-scaling پیشرفته | محدود | بله |
| مناسب تیم کوچک | اغلب بله | بسته به نیاز |
برای بسیاری از پروژههای کوچک و متوسط، Docker Compose میتواند کاملاً کافی باشد و نیازی به پیچیدگی Kubernetes وجود نداشته باشد.
جایگزینهای Docker کداماند؟
Docker تنها ابزار اکوسیستم Containerization نیست.
Podman
Podman ابزاری برای اجرای کانتینر است که معماری آن در بسیاری از سناریوها به Daemon مرکزی دائمی نیاز ندارد.
همچنین قابلیت Rootless Container از ویژگیهای مهم آن است.
containerd
containerd یکی از Runtimeهای مهم اکوسیستم کانتینر است و در زیرساختهای مختلف استفاده میشود.
LXC
LXC بیشتر به مفهوم System Container نزدیک است و برای بعضی سناریوهای محیطهای لینوکسی ایزوله استفاده میشود.
CRI-O
CRI-O یک Container Runtime برای Kubernetes است.
انتخاب میان این ابزارها به نوع Workload، معماری زیرساخت و نیاز عملیاتی بستگی دارد.
خطاهای رایج Docker و روش عیبیابی
Cannot connect to the Docker daemon
این خطا ممکن است به توقف Docker Service یا مشکل Permission مربوط باشد.
بررسی کنید:
sudo systemctl status dockerو:
sudo docker infoPermission denied هنگام اجرای docker
اگر دستور بدون sudo خطا میدهد، ممکن است کاربر به Docker Socket دسترسی نداشته باشد.
برای تشخیص، دستور را با sudo تست کنید. عضویت در گروه docker باید با در نظر گرفتن ریسک امنیتی انجام شود.
Port is already allocated
این خطا معمولاً یعنی پورت موردنظر قبلاً توسط سرویس دیگری اشغال شده است.
روی Linux:
sudo ss -lntpسپس Port Mapping را بررسی کنید.
Container بلافاصله متوقف میشود
اگر فرآیند اصلی کانتینر پایان یابد، کانتینر نیز معمولاً متوقف میشود.
لاگها را بررسی کنید:
sudo docker logs CONTAINER_NAMEاطلاعات بعد از حذف کانتینر از بین رفتهاند
احتمالاً داده فقط در Writable Layer کانتینر ذخیره شده بوده یا Volume مربوط حذف شده است.
برای دادههای مهم از Volume و Backup مستقل استفاده کنید.
کانتینر به دیتابیس متصل نمیشود
موارد زیر را بررسی کنید:
- نام سرویس دیتابیس
- Docker Network مشترک
- پورت داخلی دیتابیس
- آماده بودن سرویس
- رمز و اطلاعات اتصال
در Docker Compose معمولاً باید از نام سرویس بهجای localhost استفاده شود.
فضای دیسک سرور پر شده است
برای بررسی مصرف Docker:
sudo docker system dfImageها، Build Cacheها، Containerهای قدیمی و Logها ممکن است فضای زیادی مصرف کنند.
قبل از اجرای دستورهای پاکسازی مانند docker system prune یا حذف Volumeها، دقیقاً بررسی کنید چه دادههایی حذف خواهند شد.
بهترین روش یادگیری Docker برای مبتدیها
اگر تازه با Docker آشنا شدهاید، پیشنهاد میکنیم یادگیری را با این ترتیب ادامه دهید:
- درک مفهوم Container و Image
- نصب Docker Engine
- اجرای Nginx با docker run
- کار با docker ps و docker logs
- ساخت اولین Dockerfile
- یادگیری Docker Volume
- آشنایی با Docker Network
- ساخت یک پروژه Docker Compose
- پیادهسازی HTTPS و Reverse Proxy
- آشنایی با CI/CD و امنیت Production
برای شروع لازم نیست از ابتدا Kubernetes یا معماریهای پیچیده Microservices را یاد بگیرید.
درک درست Image، Container، Volume، Network و Compose پایه محکمی برای ورود به مباحث پیشرفتهتر ایجاد میکند.
سوالات متداول درباره Docker
Docker چیست و چه کاربردی دارد؟
Docker پلتفرمی برای ساخت، بستهبندی، توزیع و اجرای برنامهها در کانتینرهاست. از آن در توسعه نرمافزار، میزبانی برنامه، Microservices، CI/CD و زیرساختهای ابری استفاده میشود.
Docker مخفف چیست؟
Docker نام محصول و پروژه است و برخلاف اصطلاحهایی مانند VPS، مخفف یک عبارت فنی مشخص نیست.
آیا Docker رایگان است؟
Docker Engine دارای اجزای متنباز است و استفاده از آن در بسیاری از سناریوها رایگان است. بااینحال Docker Desktop، سرویسهای تجاری و بعضی امکانات سازمانی میتوانند شرایط لایسنس یا هزینه جداگانه داشته باشند.
تفاوت Docker و Container چیست؟
Container محیط اجرای ایزوله برنامه است، اما Docker مجموعهای از ابزارها برای ساخت، توزیع و مدیریت کانتینرها ارائه میکند.
Docker Image چیست؟
Image قالبی شامل فایلها، وابستگیها و دستورالعملهای لازم برای ایجاد کانتینر است.
تفاوت Docker Image و Container چیست؟
Image الگوی ساخت است و Container نمونه ایجادشده از آن Image محسوب میشود.
Dockerfile چیست؟
Dockerfile فایلی متنی است که مراحل ساخت Docker Image را مشخص میکند.
Docker Compose چیست؟
Compose ابزاری برای تعریف و اجرای برنامههای چندکانتینری با استفاده از فایل YAML است.
آیا Docker جایگزین Virtual Machine است؟
در بعضی Workloadها میتواند جایگزین مناسبی باشد، اما Docker و VM دقیقاً یک کار انجام نمیدهند. ماشین مجازی سیستمعامل و Kernel مستقل دارد، در حالی که کانتینرهای لینوکسی معمولاً Kernel میزبان را به اشتراک میگذارند.
آیا Docker روی VPS اجرا میشود؟
بله. اگر VPS دارای Kernel سازگار و دسترسی مدیریتی لازم باشد، میتوان Docker Engine را روی آن نصب کرد.
برای Docker چقدر RAM لازم است؟
مقدار RAM به برنامهها وابسته است. یک سرویس سبک ممکن است با حافظه کمی اجرا شود، اما چند دیتابیس یا برنامه پرترافیک به منابع بیشتری نیاز دارند.
آیا Docker روی Windows و macOS اجرا میشود؟
بله. Docker Desktop امکان توسعه و اجرای کانتینر را فراهم میکند. اجرای کانتینرهای لینوکسی معمولاً از یک محیط Linux مجازیسازیشده استفاده میکند.
آیا Docker از دیتابیس پشتیبانی میکند؟
بله. MySQL، PostgreSQL، Redis و بسیاری از سرویسهای دیتابیس را میتوان در کانتینر اجرا کرد. برای Production باید ذخیرهسازی و Backup بهدرستی طراحی شوند.
آیا با حذف Container اطلاعات پاک میشود؟
دادههایی که فقط در لایه قابل نوشتن همان Container قرار دارند با حذف آن از بین میروند. دادههای ذخیرهشده در Volume مستقل میتوانند باقی بمانند، مگر اینکه خود Volume نیز حذف شود.
آیا Docker امن است؟
Docker امکانات ایزولهسازی و کنترل امنیتی دارد، اما امنیت آن به تنظیمات Container، Image، Docker Engine و Kernel میزبان وابسته است.
Docker بهتر است یا Kubernetes؟
این دو نقش متفاوتی دارند. Docker برای ساخت و اجرای کانتینر کاربرد دارد؛ Kubernetes بیشتر برای Orchestration و مدیریت Workloadهای Containerized در مقیاس بزرگ استفاده میشود.
آیا برای اجرای Docker باید برنامهنویس باشیم؟
خیر. بسیاری از Imageهای آماده را میتوان بدون برنامهنویسی اجرا کرد، اما برای ساخت برنامه اختصاصی و مدیریت Production دانش Linux، Network و مفاهیم توسعه نرمافزار مفید است.
آیا Docker برای سایت وردپرسی مناسب است؟
بله، وردپرس را میتوان با Docker اجرا کرد؛ اما برای یک سایت معمولی، هاست وردپرس مدیریتشده ممکن است سادهتر باشد. Docker بیشتر زمانی جذاب است که کنترل مستقیم روی معماری و سرویسهای جانبی نیاز داشته باشید.
جمعبندی؛ آیا استفاده از Docker ارزش دارد؟
Docker یکی از مهمترین فناوریهای توسعه و اجرای نرمافزارهای مدرن است. این پلتفرم به توسعهدهندگان و مدیران زیرساخت اجازه میدهد برنامهها را همراه با وابستگیهایشان در قالب Image بستهبندی و در Containerهای ایزوله اجرا کنند.
مهمترین مزیت Docker، استانداردسازی محیط اجرا و سادهتر شدن انتقال برنامه میان Development، Testing و Production است.
در این مقاله آموختیم:
- Docker چیست و چه کاربردهایی دارد.
- Container چگونه از Kernel میزبان استفاده میکند.
- Docker Image چه تفاوتی با Container دارد.
- Dockerfile چگونه Image میسازد.
- Docker Compose چگونه چند سرویس را مدیریت میکند.
- Volume و Network چه نقشی دارند.
- Docker چه تفاوتی با VPS و ماشین مجازی دارد.
- چگونه Docker را روی Ubuntu نصب کنیم.
- چه نکات امنیتی برای اجرای Docker در Production ضروری هستند.
اگر پروژه شما به چند سرویس مستقل، محیط توسعه قابل بازتولید، Deployment خودکار یا معماری Microservices نیاز دارد، Docker میتواند گزینه بسیار مناسبی باشد.
برای میزبانی چنین پروژههایی معمولاً به سروری با دسترسی مدیریتی نیاز دارید. در پویاسازان میتوانید متناسب با تعداد کانتینرها، میزان مصرف منابع و موقعیت کاربران، سرویسهای سرور مجازی ایران، سرور مجازی آلمان یا سایر سرورهای مجازی و اختصاصی پویاسازان را بررسی کنید.
برای شروع، لازم نیست معماری پیچیدهای بسازید. یک پروژه کوچک Docker Compose بهترین راه برای آشنایی عملی با Container، Image، Volume و Network است.
