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 یا داکر مجموعه‌ای از ابزارها برای توسعه، ساخت، توزیع و اجرای برنامه‌های 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 استفاده می‌کند.

سه بخش اصلی این معماری عبارت‌اند از:

  1. Docker Client
  2. Docker Daemon
  3. Docker Objects

نمای ساده معماری:

Developer / Administrator
           |
           v
      Docker CLI
           |
           v
       Docker API
           |
           v
     Docker Daemon
        (dockerd)
           |
     +-----+------+
     |     |      |
     v     v      v
   Images Containers Networks
           |
           v
      Docker Host

Docker Client چیست؟

Docker Client همان ابزاری است که معمولاً با دستور docker در ترمینال استفاده می‌کنیم.

مثلاً:

docker ps

یا:

docker run nginx

Client درخواست را به 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 ImageDocker 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 ContainerVirtual 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-nginx

Dockerfile چیست؟

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 را بهتر درک کنیم، یک پروژه کوچک می‌سازیم.

این پروژه دو سرویس دارد:

  1. یک برنامه Python با Flask
  2. یک 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-data

Bind 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 VolumeBind 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 ls

Host 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 ComposeKubernetes
پیچیدگی راه‌اندازیکمتربیشتر
سناریوی رایجبرنامه چندکانتینری و استقرار ساده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 info

Permission 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 df

Imageها، Build Cacheها، Containerهای قدیمی و Logها ممکن است فضای زیادی مصرف کنند.

قبل از اجرای دستورهای پاک‌سازی مانند docker system prune یا حذف Volumeها، دقیقاً بررسی کنید چه داده‌هایی حذف خواهند شد.

بهترین روش یادگیری Docker برای مبتدی‌ها

اگر تازه با Docker آشنا شده‌اید، پیشنهاد می‌کنیم یادگیری را با این ترتیب ادامه دهید:

  1. درک مفهوم Container و Image
  2. نصب Docker Engine
  3. اجرای Nginx با docker run
  4. کار با docker ps و docker logs
  5. ساخت اولین Dockerfile
  6. یادگیری Docker Volume
  7. آشنایی با Docker Network
  8. ساخت یک پروژه Docker Compose
  9. پیاده‌سازی HTTPS و Reverse Proxy
  10. آشنایی با 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 است.

منابع و مستندات