اگر برنامه‌نویس باشید، احتمالاً حداقل یک بار با جمله معروف «روی سیستم من که درست کار می‌کند!» مواجه شده‌اید. یکی از مهم‌ترین دلایلی که Docker محبوب شد، حل همین مشکل است.

Docker ابزاری برای بسته‌بندی و اجرای برنامه‌ها در محیط‌هایی ایزوله به نام Container است. با استفاده از Docker می‌توان کد برنامه، کتابخانه‌ها، وابستگی‌ها و تنظیمات موردنیاز را در یک محیط مشخص قرار داد و همان محیط را تقریباً بدون تغییر در سیستم توسعه، سرور تست و محیط Production اجرا کرد.

در این مقاله بررسی می‌کنیم داکر چیست، Container و Image چه تفاوتی دارند، Dockerfile چیست، Docker Compose چه کاربردی دارد و چرا Docker به یکی از ابزارهای مهم برنامه‌نویسان و تیم‌های DevOps تبدیل شده است.

Docker چیست؟

Docker یک پلتفرم متن‌باز برای ساخت، بسته‌بندی، توزیع و اجرای نرم‌افزارها در قالب Container است.

به زبان ساده، Docker کمک می‌کند برنامه‌ای که روی سیستم شما اجرا می‌شود، همراه با وابستگی‌های موردنیازش داخل یک بسته استاندارد قرار بگیرد تا بتوان همان برنامه را روی سیستم‌های دیگر نیز با شرایط تقریباً یکسان اجرا کرد.

برای مثال تصور کنید یک پروژه Node.js دارید که به نسخه مشخصی از Node، چند پکیج NPM و یک دیتابیس نیاز دارد. به جای اینکه تمام این موارد را روی هر سرور به صورت دستی نصب کنید، می‌توانید محیط اجرای پروژه را با Docker تعریف کنید.

وب‌سایت رسمی Docker: docker.com

Docker چه مشکلی را حل می‌کند؟

در توسعه نرم‌افزار، یکی از مشکلات رایج تفاوت میان محیط‌های مختلف است. ممکن است پروژه روی لپ‌تاپ برنامه‌نویس بدون مشکل اجرا شود اما روی سیستم هم‌تیمی، سرور تست یا سرور اصلی با خطا مواجه شود.

علت این اتفاق می‌تواند تفاوت در نسخه PHP، Node.js، MySQL، کتابخانه‌ها، Environment Variableها یا حتی تنظیمات سیستم‌عامل باشد.

Docker تلاش می‌کند این اختلاف‌ها را کاهش دهد. شما محیط اجرای برنامه را تعریف می‌کنید و Docker همان ساختار را در سیستم‌های مختلف ایجاد می‌کند.

هدف اصلی Docker این است که محیط اجرای برنامه قابل تکرار، قابل انتقال و قابل کنترل باشد.

Container چیست؟

Container یک محیط ایزوله برای اجرای یک برنامه است. هر Container می‌تواند برنامه، وابستگی‌ها، تنظیمات و فایل‌های موردنیاز خودش را داشته باشد.

برای مثال می‌توانید در یک سیستم چند Container داشته باشید:

  • یک Container برای برنامه Node.js
  • یک Container برای MySQL
  • یک Container برای Redis
  • یک Container برای Nginx

این سرویس‌ها از یکدیگر جدا هستند اما می‌توانند از طریق شبکه Docker با هم ارتباط برقرار کنند.

تفاوت Docker Container با ماشین مجازی چیست؟

یکی از سوالات رایج این است که Docker چه تفاوتی با Virtual Machine دارد.

در ماشین مجازی معمولاً یک سیستم‌عامل کامل روی Hypervisor اجرا می‌شود. بنابراین هر VM می‌تواند منابع قابل‌توجهی از RAM، CPU و فضای ذخیره‌سازی مصرف کند.

Containerها سبک‌تر هستند و معمولاً از Kernel سیستم میزبان استفاده می‌کنند. به همین دلیل راه‌اندازی آن‌ها سریع‌تر است و در بسیاری از سناریوها منابع کمتری مصرف می‌کنند.

ویژگیDocker ContainerVirtual Machine
سرعت راه‌اندازیمعمولاً بسیار سریعمعمولاً کندتر
سیستم‌عامل کاملخیربله
مصرف منابعکمتربیشتر
قابلیت جابه‌جاییبالابسته به ساختار VM
کاربرد رایجاپلیکیشن و سرویسسیستم‌عامل کامل و محیط مجازی

Docker Image چیست؟

Image را می‌توان قالب اولیه یک Container در نظر گرفت.

یک Docker Image شامل اطلاعاتی است که برای ساخت محیط اجرای برنامه نیاز داریم؛ برای مثال سیستم پایه، فایل‌های برنامه، کتابخانه‌ها و دستور شروع برنامه.

وقتی از روی یک Image برنامه را اجرا می‌کنیم، Docker یک Container ایجاد می‌کند.

به صورت ساده:

Docker Image → Docker Container

برای مثال Image رسمی Node.js را می‌توان دریافت کرد:

docker pull node:20-alpine

Dockerfile چیست؟

Dockerfile یک فایل متنی است که مراحل ساخت Docker Image را مشخص می‌کند.

برای مثال فرض کنید یک پروژه Node.js داریم. یک Dockerfile ساده می‌تواند به شکل زیر باشد:

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

در این مثال:

  • FROM مشخص می‌کند Image پایه چیست.
  • WORKDIR مسیر کاری برنامه را مشخص می‌کند.
  • COPY فایل‌ها را وارد Image می‌کند.
  • RUN دستورات زمان Build را اجرا می‌کند.
  • EXPOSE پورت مورد استفاده برنامه را مشخص می‌کند.
  • CMD دستور اجرای اصلی Container را تعریف می‌کند.

ساخت Docker Image

بعد از ساخت Dockerfile می‌توانیم Image پروژه را بسازیم:

docker build -t my-app .

در این دستور:

my-app

نام Image است و نقطه انتهای دستور به Docker می‌گوید Dockerfile را از مسیر فعلی بخواند.

اجرای Container

بعد از ساخته شدن Image می‌توان برنامه را اجرا کرد:

docker run -p 3000:3000 my-app

پارامتر -p پورت سیستم میزبان را به پورت Container متصل می‌کند.

حالا برنامه از طریق آدرس زیر قابل دسترس خواهد بود:

http://localhost:3000

Docker Compose چیست؟

در پروژه‌های واقعی معمولاً فقط یک Container نداریم. ممکن است پروژه از موارد زیر تشکیل شده باشد:

  • Backend
  • Database
  • Redis
  • Nginx

مدیریت دستی چند Container می‌تواند سخت شود. اینجاست که Docker Compose کاربرد پیدا می‌کند.

با Docker Compose می‌توان چند سرویس را در یک فایل تعریف و با یک دستور اجرا کرد.

مثال:

services:

  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - database

  database:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

سپس کافی است اجرا کنیم:

docker compose up -d

Docker برنامه و دیتابیس را ایجاد کرده و شبکه لازم برای ارتباط بین آن‌ها را مدیریت می‌کند.

Docker Volume چیست؟

Containerها برای اجرای برنامه عالی هستند، اما همیشه نباید داده‌های مهم را مستقیماً داخل فایل‌سیستم Container نگهداری کرد.

برای مثال اگر MySQL داخل Container اجرا شود و Container حذف شود، نمی‌خواهیم اطلاعات دیتابیس نیز از بین برود.

برای این کار Docker از Volume استفاده می‌کند.

docker volume create my-data

Volume داده را مستقل از چرخه عمر Container نگهداری می‌کند.

Docker Network چیست؟

Docker برای ارتباط Containerها شبکه‌های مجازی ایجاد می‌کند.

برای مثال اگر Backend و MySQL هر دو در Docker Compose تعریف شده باشند، Backend می‌تواند از طریق نام سرویس به دیتابیس متصل شود.

مثلاً:

database:3306

به جای اینکه آدرس IP هر Container را به صورت دستی پیدا کنیم.

کاربرد Docker در برنامه‌نویسی Frontend

شاید در نگاه اول Docker بیشتر یک ابزار Backend یا DevOps به نظر برسد، اما برای توسعه‌دهندگان Frontend هم کاربرد زیادی دارد.

برای مثال اگر روی پروژه React یا Next.js کار می‌کنید، می‌توانید نسخه Node، پکیج‌ها و محیط پروژه را داخل Docker ثابت نگه دارید.

در این حالت اعضای تیم نیازی ندارند دقیقاً همان نسخه Node را روی سیستم خود نصب کنند.

Docker همچنین می‌تواند برای اجرای موارد زیر مفید باشد:

  • Next.js
  • React
  • Angular
  • Node.js
  • Nginx

کاربرد Docker در Backend

در پروژه‌های Backend استفاده از Docker بسیار رایج است.

برای مثال می‌توان محیطی شامل PHP، Laravel، MySQL و Redis را با Docker ایجاد کرد.

یا در پروژه Node.js:

Node.js
PostgreSQL
Redis
Nginx

هر سرویس می‌تواند Container مستقل خودش را داشته باشد.

کاربرد Docker در تیم تست نرم‌افزار

Docker برای تیم‌های QA و Software Testing نیز بسیار کاربردی است.

تیم تست می‌تواند محیطی تقریباً مشابه محیط Production ایجاد کند و تست‌ها را در یک محیط تکرارپذیر انجام دهد.

برای مثال می‌توان برای هر نسخه برنامه یک محیط جدید ایجاد کرد، تست‌ها را اجرا کرد و بعد از پایان تست کل محیط را حذف کرد.

این ویژگی به‌خصوص برای Automated Testing و CI/CD بسیار مفید است.

Docker در CI/CD چه کاربردی دارد؟

یکی از مهم‌ترین کاربردهای Docker در فرآیند CI/CD است.

به عنوان مثال Pipeline می‌تواند مراحل زیر را انجام دهد:

Git Push
   ↓
Build Docker Image
   ↓
Run Tests
   ↓
Push Image to Registry
   ↓
Deploy

در این ساختار همان Image که تست شده است می‌تواند در محیط Production نیز استفاده شود.

اگر با Git و GitHub آشنایی کافی ندارید، می‌توانید دوره آموزش Git و GitHub در MyTag را نیز مشاهده کنید.

Docker Registry چیست؟

Registry محلی برای ذخیره و توزیع Docker Imageها است.

معروف‌ترین سرویس عمومی در این زمینه Docker Hub است.

برای مثال:

docker pull nginx

Image رسمی Nginx را از Registry دریافت می‌کند.

سازمان‌ها همچنین می‌توانند Registry خصوصی خودشان را داشته باشند.

مزایای Docker

قابلیت حمل

برنامه همراه با محیط اجرای خودش بسته‌بندی می‌شود و می‌توان آن را در محیط‌های مختلف اجرا کرد.

سرعت راه‌اندازی

Containerها معمولاً بسیار سریع ایجاد و اجرا می‌شوند.

ایزوله‌سازی سرویس‌ها

هر سرویس می‌تواند محیط و وابستگی‌های خودش را داشته باشد.

تکرارپذیری محیط

توسعه‌دهندگان، تیم QA و سرور Production می‌توانند محیط‌های بسیار مشابهی داشته باشند.

مناسب برای معماری Microservices

هر Microservice می‌تواند در Container جداگانه اجرا شود و مستقل از سایر سرویس‌ها توسعه پیدا کند.

معایب Docker

Docker در کنار مزایای زیاد، چالش‌هایی نیز دارد.

  • برای افراد مبتدی مفاهیم اولیه آن ممکن است کمی پیچیده باشد.
  • مدیریت Volume و Network نیاز به یادگیری دارد.
  • پیکربندی اشتباه می‌تواند مشکلات امنیتی ایجاد کند.
  • مدیریت تعداد بسیار زیادی Container بدون ابزار Orchestration دشوار می‌شود.

Docker و Kubernetes چه تفاوتی دارند؟

Docker و Kubernetes رقیب مستقیم یکدیگر نیستند.

Docker بیشتر روی ساخت و اجرای Container تمرکز دارد، در حالی که Kubernetes برای مدیریت تعداد زیادی workload کانتینری در چند سرور طراحی شده است.

DockerKubernetes
ساخت Imageمدیریت workloadهای کانتینری
اجرای ContainerScaling
مدیریت محیط توسعهLoad Balancing
Docker Composeمدیریت چند Node

آیا Docker برای مقیاس‌پذیری مناسب است؟

Docker اجرای چند نمونه از یک سرویس را ساده می‌کند، اما مدیریت سیستم‌های بزرگ و مقیاس‌پذیر معمولاً در کنار ابزارهایی مانند Kubernetes انجام می‌شود.

بنابراین بهتر است Docker را به عنوان زیرساخت بسته‌بندی و اجرای برنامه در نظر بگیریم و Orchestration را وظیفه ابزارهایی مانند Kubernetes بدانیم.

چند دستور پرکاربرد Docker

نمایش Containerهای فعال:

docker ps

نمایش تمام Containerها:

docker ps -a

نمایش Imageها:

docker images

توقف Container:

docker stop container_name

حذف Container:

docker rm container_name

حذف Image:

docker rmi image_name

مشاهده Log:

docker logs container_name

ورود به Container:

docker exec -it container_name sh

Docker برای چه کسانی مناسب است؟

یادگیری Docker برای افراد زیر می‌تواند بسیار ارزشمند باشد:

  • Frontend Developer
  • Backend Developer
  • Full Stack Developer
  • DevOps Engineer
  • Software Tester و QA Engineer
  • System Administrator

حتی اگر DevOps Engineer نیستید، آشنایی با Docker می‌تواند فرآیند توسعه، تست و Deploy پروژه‌های شما را بسیار ساده‌تر کند.

آیا برای یادگیری Docker باید Linux بلد باشیم؟

دانستن دستورات پایه Linux کمک زیادی می‌کند اما برای شروع Docker لازم نیست متخصص Linux باشید.

آشنایی با مفاهیمی مثل Terminal، Port، Process، File System و Environment Variable برای شروع کافی است.

مسیر پیشنهادی یادگیری Docker

اگر می‌خواهید Docker را اصولی یاد بگیرید، پیشنهاد می‌شود ابتدا مفاهیم زیر را به ترتیب تمرین کنید:

  1. Container و Image
  2. Docker CLI
  3. Dockerfile
  4. Volume
  5. Network
  6. Docker Compose
  7. Docker Registry
  8. اجرای یک پروژه واقعی
  9. استفاده در CI/CD

اشتباهات رایج هنگام استفاده از Docker

استفاده از Imageهای بسیار بزرگ

بهتر است در صورت امکان از Imageهای سبک و مناسب استفاده شود و فایل‌های غیرضروری وارد Image نشوند.

قرار دادن اطلاعات حساس داخل Dockerfile

Password، API Key و اطلاعات حساس نباید مستقیماً داخل Dockerfile قرار داده شوند.

ذخیره اطلاعات دیتابیس داخل Container

برای داده‌های دائمی بهتر است از Volume استفاده شود.

اجرای همه سرویس‌ها در یک Container

در اکثر پروژه‌ها بهتر است هر سرویس اصلی در Container جداگانه اجرا شود.

سوالات متداول درباره Docker

Docker چیست؟

Docker پلتفرمی برای ساخت، بسته‌بندی و اجرای نرم‌افزارها در محیط‌های ایزوله‌ای به نام Container است.

Container چیست؟

Container محیطی سبک و ایزوله برای اجرای یک برنامه و وابستگی‌های آن است.

Docker Image چیست؟

Image قالبی است که Docker برای ساخت Container از آن استفاده می‌کند.

Dockerfile چیست؟

Dockerfile فایلی است که مراحل ساخت Docker Image را مشخص می‌کند.

Docker Compose چیست؟

Docker Compose ابزاری برای تعریف و اجرای چند سرویس Docker در کنار یکدیگر است.

آیا Docker فقط برای Backend است؟

خیر. توسعه‌دهندگان Frontend، Backend، QA و DevOps می‌توانند از Docker استفاده کنند. برای مثال یک پروژه Next.js نیز می‌تواند کاملاً داخل Docker اجرا شود.

آیا Docker جای Kubernetes را می‌گیرد؟

خیر. این دو ابزار وظایف متفاوتی دارند. Docker برای Containerization استفاده می‌شود و Kubernetes بیشتر برای مدیریت workloadهای کانتینری در مقیاس بزرگ کاربرد دارد.

آیا یادگیری Docker برای برنامه‌نویسان ضروری است؟

اجباری نیست، اما در بسیاری از پروژه‌های حرفه‌ای آشنایی با Docker یک مهارت بسیار ارزشمند محسوب می‌شود و فرآیند توسعه و Deployment را ساده‌تر می‌کند.

جمع‌بندی

در این مقاله بررسی کردیم Docker چیست و چرا به یکی از ابزارهای مهم در توسعه نرم‌افزار تبدیل شده است.

Docker به توسعه‌دهندگان اجازه می‌دهد برنامه‌ها را همراه با وابستگی‌هایشان داخل Container اجرا کنند و محیط توسعه، تست و Production را تا حد زیادی یکسان نگه دارند.

مفاهیمی مثل Docker Image، Container، Dockerfile، Volume، Network و Docker Compose پایه‌های اصلی کار با Docker هستند.

اگر برنامه‌نویس Frontend، Backend یا Full Stack هستید، یادگیری Docker می‌تواند قدم مهمی برای ورود به پروژه‌های حرفه‌ای‌تر، CI/CD و DevOps باشد.

برای ادامه مسیر یادگیری برنامه‌نویسی و مشاهده دوره‌های پروژه‌محور می‌توانید دوره‌های برنامه‌نویسی MyTag را مشاهده کنید.