اگر در حوزه برنامه نویسی، توسعه وب، سرور یا DevOps فعالیت کرده باشید، احتمالاً نام Docker را بارها شنیده اید. Docker یکی از ابزارهای محبوب برای ساخت، بسته بندی، انتقال و اجرای نرم افزارها در محیط های ایزوله ای به نام Container است.
یکی از مهم ترین مشکلاتی که Docker برای حل آن طراحی شده، تفاوت بین محیط توسعه و محیط اجرای واقعی برنامه است. ممکن است یک برنامه روی کامپیوتر برنامه نویس بدون مشکل اجرا شود، اما همان برنامه پس از انتقال به سرور به دلیل تفاوت نسخه PHP، Python، Node.js، کتابخانه ها یا تنظیمات سیستم عامل با خطا مواجه شود.
Docker با بسته بندی برنامه به همراه وابستگی ها و تنظیمات موردنیاز آن، اجرای نرم افزار را در محیط های مختلف ساده تر و قابل پیش بینی تر می کند.
در این مقاله بررسی می کنیم Docker چیست، Container و Image چه تفاوتی با یکدیگر دارند، Dockerfile و Docker Compose چه کاربردی دارند، داکر چه مزایایی دارد و برای اجرای آن چه نوع سروری مناسب است.

Docker یک پلتفرم متن باز برای ساخت، انتقال و اجرای برنامه های نرم افزاری در محیط هایی به نام Container است. Docker به توسعه دهندگان اجازه می دهد برنامه خود را همراه با بخش زیادی از محیط موردنیاز برای اجرای آن بسته بندی کنند. به این ترتیب، می توان همان محیط را در سیستم توسعه، سرور تست و محیط Production مورد استفاده قرار داد.
برای مثال فرض کنید یک برنامه با Python نوشته اید که به نسخه مشخصی از Python و چند کتابخانه خاص نیاز دارد.
در روش سنتی، هنگام انتقال برنامه به یک سرور جدید باید موارد مختلفی را بررسی کنید:
اما در Docker می توانید این محیط را از قبل تعریف و سپس همان Image را در محیط های مختلف اجرا کنید.
به زبان ساده:
Docker کمک می کند برنامه را همراه با محیط و وابستگی های مورد نیازش بسته بندی کنیم تا بتوانیم آن را در محیط های مختلف با تفاوت کمتر اجرا کنیم.
تصور کنید یک تیم برنامه نویسی روی یک پروژه کار می کند. برنامه روی سیستم یکی از توسعه دهندگان به درستی اجرا می شود، اما وقتی کد برای فرد دیگری ارسال می شود، با خطا مواجه می شود.
ممکن است علت، نسخه متفاوت یک کتابخانه یا حتی تفاوت در تنظیمات سیستم باشد.
همین مشکل هنگام انتقال برنامه از محیط توسعه به سرور نیز اتفاق می افتد.
برای نمونه ممکن است برنامه شما روی سیستم توسعه با PHP 8.3 اجرا شود، اما سرور از نسخه دیگری استفاده کند. یا برنامه به Redis و یک نسخه مشخص از MySQL وابسته باشد که روی سرور نصب نشده است.
Docker تلاش می کند این تفاوت ها را با استانداردسازی محیط اجرای برنامه کاهش دهد.
در چنین ساختاری، محیط برنامه را می توان به شکل زیر تصور کرد:
Application
+
Dependencies
+
Configuration
↓
Docker Image
↓
Docker Container
به همین دلیل یکی از مهم ترین کاربردهای Docker، کاهش مشکلات ناشی از تفاوت محیط های توسعه و Production است.
Container یا کانتینر یک محیط ایزوله برای اجرای نرم افزار است.

کانتینر شامل برنامه و محیط موردنیاز آن برای اجراست و از سایر فرآیندها و سرویس های سیستم تا حد مشخصی جدا نگه داشته می شود.
برای مثال ممکن است در یک پروژه چند Container داشته باشید:
Web Application
↓
Container
Database
↓
Container
Redis
↓
Container
این سرویس ها می توانند از یکدیگر جدا باشند و در عین حال از طریق شبکه Docker با یکدیگر ارتباط برقرار کنند.
یکی از نکات مهم درباره کانتینر این است که Container با ماشین مجازی یکسان نیست.
در Virtual Machine معمولاً یک سیستم عامل کامل به همراه Kernel مخصوص خودش اجرا می شود، اما Containerها معمولاً Kernel سیستم میزبان را به اشتراک می گذارند. همین تفاوت باعث می شود Containerها معمولاً سبک تر و سریع تر از Virtual Machine باشند.
برای درک بهتر Docker، مقایسه آن با Virtual Machine یا VM بسیار مفید است.
در یک ماشین مجازی، ساختار کلی تقریباً به این شکل است:
Physical Hardware
↓
Hypervisor
↓
Guest Operating System
↓
Application
اما در Docker، ساختار ساده شده به شکل زیر است:
Physical Hardware
↓
Host Operating System
↓
Docker Engine
↓
Containers
در ماشین مجازی، هر VM معمولاً سیستم عامل مستقل خود را دارد. به همین دلیل ایجاد و اجرای تعداد زیادی VM می تواند منابع بیشتری مصرف کند.
در مقابل، Containerها سبک تر هستند و معمولاً سریع تر ایجاد و اجرا می شوند.
| ویژگی | Docker Container | Virtual Machine |
| سیستم عامل مستقل | معمولاً خیر | بله |
| مصرف منابع | کمتر | بیشتر |
| سرعت راه اندازی | بسیار سریع | معمولاً کندتر |
| حجم موردنیاز | معمولاً کمتر | معمولاً بیشتر |
| Isolation | دارد | دارد |
| مناسب برای Microservices | بسیار مناسب | مناسب |
البته Docker و Virtual Machine رقیب مستقیم یکدیگر نیستند. حتی در بسیاری از زیرساخت ها Docker می تواند روی یک ماشین مجازی اجرا شود.
در واقع، یکی از سناریوهای رایج این است که یک سرور مجازی در اختیار داشته باشید و Docker و سرویس های موردنیاز پروژه را روی آن اجرا کنید.

Docker Image یک قالب یا الگوی فقط خواندنی برای ایجاد Container است.
Image شامل اطلاعات و فایل هایی است که برای اجرای برنامه موردنیاز هستند؛ مانند:
برای درک ساده تر:
Image مانند یک الگو است و Container نمونه ای اجرایی از آن الگوست.
برای مثال می توانید یک Image مربوط به Nginx داشته باشید و چند Container از روی آن ایجاد کنید.
Docker Image
/ | \
/ | \
Container Container Container
در این مدل، یک Image می تواند مبنای ایجاد چند Container باشد.
Container در واقع یک نمونه اجرایی از Docker Image است.
وقتی Image را به عنوان یک قالب در نظر بگیریم، Container همان نمونه ای است که از آن قالب ایجاد شده و برنامه داخل آن در حال اجراست.
برای مثال، دستور زیر می تواند یک Container از Image مربوط به Nginx اجرا کند:
docker run nginx
اگر Image مربوط به Nginx روی سیستم وجود نداشته باشد، Docker می تواند آن را از Registry دریافت کند و سپس Container را ایجاد و اجرا کند.
Dockerfile یک فایل متنی است که مراحل ساخت یک Docker Image را مشخص می کند.
برای مثال یک Dockerfile ساده برای یک برنامه Python می تواند به شکل زیر باشد:
FROM python:3.12
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD [“python”, “app.py”]
هر دستور در Dockerfile وظیفه مشخصی دارد.
FROM Image پایه را تعیین می کند.
WORKDIR مسیر کاری برنامه را مشخص می کند.
COPY فایل های پروژه را وارد Image می کند.
RUN دستورهای موردنیاز هنگام Build را اجرا می کند.
و CMD دستور پیش فرض برای اجرای Container را مشخص می کند.
در نتیجه می توان گفت:
Dockerfile نقشه ساخت Image است.
Docker Engine بخش اصلی Docker برای ساخت و اجرای Containerهاست.
Docker Engine وظایفی مانند موارد زیر را برعهده دارد:
در معماری Docker دو بخش مهم وجود دارد:
ابزاری است که کاربر از طریق آن با Docker تعامل می کند.
برای مثال وقتی دستور زیر را وارد می کنید:
docker run nginx
Docker Client درخواست را به Docker Daemon ارسال می کند.
Docker Daemon یا dockerd وظیفه اجرای درخواست ها و مدیریت Objectهای Docker را برعهده دارد.
ساختار ساده این ارتباط به شکل زیر است:
User
↓
Docker Client
↓
Docker Daemon
↓
Images / Containers / Networks / Volumes
Docker Hub یک Registry عمومی برای ذخیره و انتشار Docker Imageهاست.
توسعه دهندگان می توانند Imageهای خود را در آن قرار دهند و سایر کاربران نیز Imageهای موردنیاز خود را دریافت کنند.
برای مثال می توانید Image مربوط به Nginx را دریافت کنید:
docker pull nginx
و سپس آن را اجرا کنید:
docker run nginx
Docker علاوه بر Docker Hub امکان استفاده از Registryهای خصوصی را نیز فراهم می کند؛ بنابراین سازمان ها می توانند Imageهای خود را در زیرساخت اختصاصی خودشان نگهداری کنند.
در پروژه های واقعی معمولاً فقط یک سرویس وجود ندارد.
برای مثال یک برنامه ممکن است شامل این بخش ها باشد:
اجرای تک تک این سرویس ها به صورت جداگانه می تواند مدیریت پروژه را پیچیده کند.
Docker Compose برای همین سناریو استفاده می شود.
با Compose می توان سرویس ها، شبکه ها، Volumeها و وابستگی های پروژه را در یک فایل YAML تعریف کرد.
برای مثال:
services:
app:
build: .
database:
image: mysql:8
redis:
image: redis
.بعد می توان مجموعه سرویس ها را به صورت یک پروژه مدیریت کرد
Docker Compose به خصوص برای محیط توسعه و پروژه هایی که از چند سرویس تشکیل شده اند، کاربرد زیادی دارد.
یکی از نکات مهم در کار با Docker، نحوه نگهداری اطلاعات دائمی است.
Containerها برای اجرای سرویس طراحی شده اند و نباید اطلاعات مهمی که باید ماندگار باشند فقط در فایل سیستم داخلی Container ذخیره شوند. برای این کار از Volume استفاده می شود.
برای مثال اگر یک MySQL Container داشته باشید، اطلاعات دیتابیس باید در محلی ذخیره شوند که با حذف Container از بین نروند.
ساختار ساده این موضوع:
Container
↓
Volume
↓
Persistent Data
Volume می تواند برای دیتابیس، فایل های آپلودی و سایر داده هایی که باید دائمی باشند مورد استفاده قرار گیرد.
Docker امکان ایجاد شبکه های اختصاصی برای ارتباط بین Containerها را نیز فراهم می کند.
برای مثال یک برنامه Laravel می تواند در یک Container اجرا شود و MySQL در Container دیگری قرار داشته باشد.
این دو سرویس می توانند در یک Network قرار بگیرند و با یکدیگر ارتباط برقرار کنند.
Docker Network
/ \
Laravel Container MySQL Container
|
Redis Container
این ساختار کمک می کند سرویس های مختلف از یکدیگر جدا باشند، اما همچنان بتوانند به شکل کنترل شده با یکدیگر ارتباط برقرار کنند.
Docker ویژگی های مختلفی دارد که باعث شده در توسعه نرم افزار و زیرساخت های مدرن به طور گسترده مورد استفاده قرار گیرد.

یکی از مهم ترین مزایای Docker این است که می توان برنامه را همراه با محیط موردنیاز آن بسته بندی کرد.
به این ترتیب همان Image می تواند در سیستم توسعه، سرور تست یا سرور Production استفاده شود.
این قابلیت به خصوص برای تیم هایی که چند محیط مختلف دارند بسیار مفید است.
Containerها معمولاً در مقایسه با Virtual Machine سبک تر هستند؛ زیرا برای هر Container به یک سیستم عامل Guest کامل نیاز نیست.
در نتیجه در بسیاری از سناریوها می توان سرویس های بیشتری را روی منابع سخت افزاری مشخص اجرا کرد.
یکی دیگر از ویژگی های Docker، سرعت بالای ایجاد و اجرای Containerهاست.
این ویژگی زمانی اهمیت بیشتری پیدا می کند که یک برنامه به سرویس های مختلفی نیاز داشته باشد یا لازم باشد نمونه های بیشتری از یک سرویس ایجاد شود.
هر Container محیط اجرای نسبتاً جداگانه ای دارد.
این موضوع باعث می شود وابستگی های یک برنامه کمتر با برنامه های دیگر تداخل داشته باشند.
برای مثال یک پروژه می تواند به یک نسخه مشخص از Node.js و پروژه دیگری به نسخه متفاوتی از آن نیاز داشته باشد.
با Container می توان محیط اجرای این پروژه ها را از یکدیگر جدا کرد.
در معماری Microservices، برنامه به سرویس های کوچک تر تقسیم می شود.
Docker برای این معماری گزینه بسیار مناسبی است؛ زیرا می توان برای هر سرویس Container جداگانه ای در نظر گرفت.
برای مثال:
Frontend
↓
API
↓
Database
Redis
Queue
Worker
هر کدام از این بخش ها می توانند در Containerهای جداگانه اجرا شوند.
Docker با فرآیندهای Continuous Integration و Continuous Deployment نیز سازگاری بسیار خوبی دارد.
برای مثال می توان یک Pipeline ایجاد کرد که:
این فرآیند باعث می شود تفاوت محیط تست و Production کاهش پیدا کند.
فرآیند کار Docker را می توان به شکل زیر خلاصه کرد:
Dockerfile
↓
Docker Build
↓
Docker Image
↓
Docker Run
↓
Docker Container
ابتدا Dockerfile مشخص می کند Image چگونه ساخته شود.
سپس Docker با استفاده از آن Image را ایجاد می کند.
پس از آن می توان از Image یک یا چند Container ساخت و برنامه را اجرا کرد.
برای مثال:
docker build -t my-app .
دستور بالا یک Image با نام my-app ایجاد می کند.
در مرحله بعد:
docker run my-app
یک Container از روی آن Image اجرا خواهد کرد.
بله، Docker می تواند در محیط های سروری بسیار کاربردی باشد؛ اما نوع زیرساختی که برای اجرای آن انتخاب می کنید اهمیت زیادی دارد.
اگر فقط یک سایت ساده دارید و نیاز خاصی به Containerها ندارید، یک هاست لینوکس می تواند انتخاب ساده تر و اقتصادی تری باشد.
اما زمانی که بخواهید روی سیستم کنترل بیشتری داشته باشید، سرویس هایی مانند Docker، Redis، دیتابیس اختصاصی یا چند Application را مدیریت کنید، داشتن دسترسی بیشتر به سیستم عامل اهمیت پیدا می کند.
اگر هدف شما میزبانی یک وب سایت معمولی، سایت وردپرسی یا پروژه ای است که به مدیریت کامل سیستم عامل نیاز ندارد، می توانید مشخصات هاست لینوکس راست چین کلود را بررسی کنید.
در چنین سرویس هایی بخش قابل توجهی از مدیریت زیرساخت توسط سرویس میزبانی انجام می شود و کاربر نیاز ندارد کل سیستم عامل سرور را مدیریت کند.
اگر قرار است Docker را به شکل جدی اجرا کنید یا به دسترسی مدیریتی بیشتری روی سرور نیاز دارید، سرور مجازی انتخاب مناسب تری خواهد بود.
در یک VPS می توانید سیستم عامل، سرویس های موردنیاز، Network، Firewall و Docker را بر اساس نیاز پروژه مدیریت کنید.
برای پروژه هایی که چند Container دارند، داشتن کنترل بیشتر روی منابع و تنظیمات سرور اهمیت بیشتری پیدا می کند.
یکی از سناریوهای متداول برای اجرای Docker، استفاده از یک سرور مجازی لینوکس است.
در این ساختار می توانید ابتدا سیستم عامل لینوکس مناسب پروژه را روی VPS راه اندازی کنید و سپس Docker Engine را نصب کنید.
پس از آن سرویس های مختلف را در Containerهای جداگانه اجرا کنید.
برای مثال:
Linux VPS
│
└── Docker
├── Nginx
├── Laravel
├── MySQL
├── Redis
└── Worker
این مدل به شما کنترل بیشتری روی محیط اجرا می دهد و برای پروژه های توسعه ای، SaaS، APIها و برنامه های چندسرویسی کاربردی است.
سرور مجازی لینوکس می تواند محیط مناسبی برای اجرای Docker، دیتابیس، Redis و سرویس های مختلف پروژه باشد.
مشاهده پلن های سرور مجازی لینوکس
Docker برای گروه های مختلفی از کاربران کاربرد دارد.
برای ایجاد یک محیط توسعه استاندارد و کاهش مشکلات ناشی از تفاوت نسخه کتابخانه ها و Runtimeها.
برای خودکارسازی Build، Test و Deployment .
برای اجرای سرویس های مختلف و جداسازی وابستگی های آنها.
برای ایجاد محیط یکسان بین اعضای تیم و مراحل مختلف انتشار نرم افزار.
برای اجرای سرویس های مختلف و فراهم کردن زیرساختی مناسب برای توسعه و Scale کردن پروژه.
Docker و Kubernetes دو ابزار با نقش های متفاوت هستند.
Docker بیشتر برای ساخت و اجرای Containerها مورد استفاده قرار می گیرد، در حالی که Kubernetes یک سیستم Orchestration برای مدیریت تعداد زیادی Container در زیرساخت های بزرگ تر است.
به زبان ساده Docker می گوید:
برنامه را داخل Container اجرا کن.
Kubernetes می گوید:
این تعداد زیاد Container را در چندین سرور مدیریت، توزیع، مقیاس دهی و پایدار نگه دار.
بنابراین در پروژه های کوچک تر ممکن است Docker و Docker Compose کاملاً کافی باشند، اما در زیرساخت های بزرگ تر ابزارهای Orchestration اهمیت بیشتری پیدا می کنند.
Docker در کنار مزایای خود، محدودیت هایی نیز دارد.
برای کاربران تازه کار، مفاهیمی مانند Image، Container، Network و Volume ممکن است در ابتدا کمی پیچیده باشند.
همچنین Container به معنی امنیت مطلق نیست و تنظیمات اشتباه می تواند مشکلات امنیتی ایجاد کند.
در پروژه های بسیار بزرگ نیز مدیریت تعداد زیاد Containerها می تواند به ابزارهای تخصصی تر مانند Kubernetes نیاز داشته باشد.
Docker در پروژه های مختلف کاربرد دارد، اما در بعضی سناریوها مزیت بیشتری ایجاد می کند.
برای مثال:
هرچه تعداد سرویس ها و وابستگی های یک پروژه بیشتر شود، مدیریت محیط اجرا اهمیت بیشتری پیدا می کند و Docker می تواند ارزش بیشتری ایجاد کند.
خیر.
Docker و هاست لینوکس دو مفهوم متفاوت هستند.
هاست لینوکس یک سرویس میزبانی است که برای اجرای وب سایت ها و برنامه های تحت وب ارائه می شود.
اما Docker یک فناوری برای بسته بندی و اجرای نرم افزار در Container است.
به همین دلیل انتخاب بین آنها به نیاز پروژه بستگی دارد.
اگر قصد دارید یک سایت یا اپلیکیشن معمولی را با مدیریت ساده تر میزبانی کنید، هاست لینوکس می تواند گزینه مناسبی باشد.
اما اگر کنترل بیشتری روی محیط سرور، سیستم عامل و سرویس های مختلف لازم دارید، سرور مجازی گزینه انعطاف پذیرتری است.
Docker یک پلتفرم برای ساخت، بسته بندی، انتقال و اجرای نرم افزارها در Containerها است.
برای کار با Docker باید با مفاهیم اصلی آن آشنا باشید:
یکی از مهم ترین مزایای Docker این است که برنامه را تا حد زیادی از محیط زیرساخت جدا می کند و اجازه می دهد همان ساختار را در محیط های مختلف اجرا کنید.
اگر برای اجرای سایت یا پروژه خود به یک محیط میزبانی ساده نیاز دارید، می توانید هاست لینوکس راست چین کلود را بررسی کنید.
اما اگر قصد اجرای Docker، چند Container، دیتابیس، Redis یا سرویس های اختصاصی را دارید و به کنترل بیشتری روی سرور نیاز دارید، سرور مجازی لینوکس راست چین کلود گزینه مناسب تری خواهد بود.
انتخاب سرور مناسب، منابع کافی و دسترسی مدیریتی درست، بخش مهمی از راه اندازی یک محیط Docker است. پیش از انتخاب VPS بهتر است میزان RAM، CPU، فضای ذخیره سازی و تعداد سرویس هایی که قرار است اجرا شوند را مشخص کنید تا منابع سرور متناسب با نیاز پروژه انتخاب شوند.
Docker را بشناسید، محیط اجرای خود را کنترل کنید و زیرساخت مناسب پروژه تان را انتخاب کنید.