Docker چیست؟ چه زمانی از داکر استفاده کنیم؟

Docker چیست؟ چه زمانی از داکر استفاده کنیم؟

آموزشی
3 فروردین 1404

 فک کنید شما یک برنامه نویس سنیور پایتون هستید یا حتی در حال یادگیری آموزش پایتون هستید و میخواید از ابزار هایی مثل Celery یا حتی با دیتابیس بخصوصی کار کنید ولی سیستم عامل شما ویندوز است و نمی تونیدبه خوبی از این ابزار ها استفاده کنید و حتی ممکنه غیر ممکن باشه.

اینجا اولین جاییه که ممکنه حس کنید نیاز به یک ابزاری دارید که به شما اجازه استفاده از تکنولوژی های مختلف رو بده.

این ابزار داکر است که در ادامه به ساده ترین شکل ممکن با اون آشنا میشیم و متوجه میشیم که چه زمانی باید از داکر استفاده کنیم.

 

مشکلاتی که قبل داکر (Docker) وجود داشت

 قبل از اینکه داکر (Docker) وجود داشته باشه انجام خیلی از کار ها انقد دردسر داشت که کابوس توسعه دهنده ها بود که دونستن اون ها به شما کمک میکنه که بفهمید داکر چه مشکلاتی رو برای توسعه دهنده ها حل کرده که در ادامه با چند تا از اون ها آشنا میشیم:

1. ناهماهنگی محیط توسعه و پروداکشن

فک کنید یک برنامه در حالت development (حالت توسعه) دارید و قبل از اینکه اون رو روی سرور دیپلوی کنید (محیط پروداکشن) می خواید برنامه رو تست کنید.

وقتی تست انجام میشه هیچ مشکلی روی سیستم شما نداره ولی وقتی برنامه رو روی سرور میبرید برنامه به مشکل بر میخوره.

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

مثال: فک کنید شما روی سیستم خودتون از پایتون 3.7 استفاده میکنید ولی سرور از پایتون 3.6 که این ممکنه توی اجرای برنامه مشکل ایجاد کنه.

 

2. تنظیمات پیچیده و وقت گیر

فک کنید میخواید یک برنامه تحت وب رو روی سرور انتقال بدید و باید بیاید کلی نرم افزار و کتابخونه رو روی سرور نصب و تنظیم کنید. مثلا برنامه های وب نیاز به وب سرور و دیتابیس و.. داره و شما مجبور بودید روی هر سیستم جدید همه این تنظیمات رو مجدد انجام بدید که هم خیلی وقت گیره و هم احتمال خطای خیلی بالایی داره .

همین مسئله مشکلی بود که تغییر سرور رو خیلی ترسناک میکرد چون باید تنظیمات از اول انجام میشد و اطمینانی وجود نداشت که حتما همه چیز مثل محیط قبلی به درستی کار کنه و ممکن بود نیاز به تنظیمات متفاوتی داشته باشه.

 

3. تداخل بین برنامه ها

وقتی چند برنامه روی یک سیستم روی سرور اجرا میشدن خیلی پیش می اومد که با هم تداخل داشته باشن. مثلا فک کنید که دوتا از این برنامه ها از یک کتابخونه استفاده میکردن ولی با نسخه های متفاوت، همین مسئله باعث میشد که یکی از این برنامه ها درست کار نکنه چون فقط یک نسخه روی کل سیستم قابل نصب بود.

 

4. استفاده از ماشین های مجازی (Virtual Machines)

 قبل از داکر راه حل معمول و رایج برای جداسازی محیط ها (در سرور)، استفاده از محیط مجازی بود که کارایی کمتری نسبت به کانتیر ها داشتن.

ماشین مجازی برخلاف داکر، سنگین و کند بود به دلیل اینکه منابع خیلی زیادی مثل CPU و RAM رو از سرور استفاده میکرد و راه اندازی کندی هم داشتن.

 

داکر (Docker) چیست؟

داکر (Docker) یک ابزار یا به اصطلاح یک پلتفرم نرم افزاری است که این امکان رو به توسعه دهنده میده که برنامه ها رو در محیط های ایزوله و جداگونه ای به اسم کانتینر (container) اجرا کنن.

این کانتینر ها مثل بسته بندی هستن که هر چیزی که اون برنامه برای اجرا نیاز داره داخلش قرار میگیره مثل:

  • -کد برنامه 
  • -کتابخونه ها
  • -ابزار ها
  • -تنظیمات و وابستگی هایی که برای اجرا نیاز داره 

الان دیگه Docker جزء مفاهیم خیلی مهم برای هر برنامه نویسی هستش و میبینیم که از ملزومات خیلی از شرکت ها و تیم ها برای استخدامی و همکاری شده.

 

مفاهیم اصلی داکر (به زبان ساده)

داکر مفاهیم و بخش های زیادی داره ولی برای درک اولیه از داکر، مفاهیمی که در ادامه گفته میشه خیلی کمک کنندس:

 

1-ایمیج (image) 

ایمیج (image) در داکر مثل یک بسته و قالب است که شامل همه موارد لازم برای اون برنامه است مثل کدها، وابستگی ها، تنظیمات و سیستم عامل مورد نیاز. 

image ها که به صورت Read-Only هستن و ساختار لایه لایه دارن و در واقع از روی اون ها کانتینر ها ساخته میشن (مثلا میشه از روی یک ایمیج چندین کانتینر ساخت ولی تغییری روی ایمیج رخ نمیده).

image ها هم میشه از روی Dockerfile ای که برنامه نویس نوشته ساخته بشن و هم از مخزن هایی مثل Docker Hub به صورت آماده گرفته بشن.

مثلا برای استفاده از پایتون در داکر از image رسمی python توی Docker Hub استفاده میکنن.

ساخت image با dockerfile

 

2-کانتینر (container)

کانتینر (container) در واقع یک نمونه درحال اجرای image است. container که به صورت ایزوله و امن اجرا میشن که مستقل از همدیگه و سیستم اصلی هستن که شامل تمام فایل های اجرایی، کتابخانه ها، و تنظیمات لازم برای اجرای برنامه هستن.

نکته: میشه هر container رو به صورت جداگونه اجرا، متوقف و حذف کرد. 

 

3-داکر فایل (Dockerfile)

داکر فایل (Dockerfile) دستورات لازم برای ساخت ایمیج (image) سفارشی در داکر رو مشخص میکنه. 

فک کنید شما یک وب اپلیکیشن با جنگو دارید (اگر نمی دونید Django چیه مقاله جنگو چیست؟ رو بخونید) و میخواید اون رو با داکر اجرا کنید.

برای این کار شما یک فایل به اسم Dockerfile دقیقا به همین اسم (بدون پسوند) ایجاد میکنید دستوراتی مثل ایمیج پایه ای (Base image) که باید استفاده بشه و اینکه کدهای برنامه کجا کپی بشن و پکیج های requirements.txt نصب بشن و همچین دستوراتی داخل داکر فایل نوشته میشن.

یک نمونه داکر فایل پروژه جنگویی به صورت زیر است:

# Use the official Python runtime image
FROM python:3.13  
 
# Create the app directory
RUN mkdir /app
 
# Set the working directory inside the container
WORKDIR /app
 
# Set environment variables 
# Prevents Python from writing pyc files to disk
ENV PYTHONDONTWRITEBYTECODE=1
#Prevents Python from buffering stdout and stderr
ENV PYTHONUNBUFFERED=1 
 
# Upgrade pip
RUN pip install --upgrade pip 
 
# Copy the Django project  and install dependencies
COPY requirements.txt  /app/
 
# run this command to install all dependencies 
RUN pip install --no-cache-dir -r requirements.txt
 
# Copy the Django project to the container
COPY . /app/
 
# Expose the Django port
EXPOSE 8000
 
# Run Django’s development server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

 

4-داکر کامپوز (docker compose)

داکر کامپوز به شما اجازه میده چندین کانتینر رو به صورت همزمان و هماهنگ مدیریت کنید که به صورت فایل YAML است که پسوند .yml یا .yaml دارد.

مثلا همون پروژه جنگویی که قبل گفتیم رو در نظر بگیرید حالا این ایمیج جنگویی که ساختید تنها یکی از کانتینر هایی است که یک برنامه کامل را تشکیل میده مثلا ما کانتینری برای دیتابیس هم داریم برای وب سروری مثل nginx داریم.

وقتی اینجوری تعداد کانتینر ها زیاد میشه منطقی نیست هر کدام رو جداگونه اجرا و مدیریت کنیم. اینجاست که همون پروژه جنگویی فایل docker compose ای مثل زیر داره:

services:
 db:
   image: postgres:17
   environment:
     POSTGRES_DB: ${DATABASE_NAME}
     POSTGRES_USER: ${DATABASE_USERNAME}
     POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
   ports:
     - "5432:5432"
   volumes:
     - postgres_data:/var/lib/postgresql/data
   env_file:
     - .env
 
 web:
   build: .
   container_name: django-docker
   ports:
     - "8000:8000"
   depends_on:
     - db
  
volumes:
  postgres_data:

 

 

5-رجیستری (registery)

رجیستری یک مخزن برای ذخیره و اشتراک گذاری و استفاده از image های داکر است. Docker Hub معروف ترین رجیستری داکر است.

نکته: تا جایی که امکان داره در Docker Hub از ایمیج های official و رسمی استفاده بشه تا ایمیج های شخصی، به دلایل امنیتی و پشتیبانی.

 

6-نتورک (network)

با استفاده از داکر میتونید یک شبکه (network) ایجاد کنید و container هایی که میخواید رو به اون network وصل کنید که با هم ارتباط برقرار کنن.

مثال: میتونید دیتابیس و پروژه ی جنگویی رو توی یک شبکه قرار بدید که اتصال اون ها راحت تر بشه و بتونید مثلا Host و password و.. دیتابیس رو به راحتی در جنگو اضافه کنید.

 

7-والیوم (volume)

داده ها در container ها موقتی هستن و با خاموش شدن داده ها هم از بین میرن. برای ذخیره دائمی اون ها از داکر والیوم (docker volume) استفاده میشه.

نکته:حتی اگر یک کانتینر حذف یا متوقف بشه اطلاعات volume ای که بهش وصل بوده از بین نمیره.

 

داکر (Docker) چه مشکلاتی رو حل کرد

docker تونست خیلی از مشکلات بزرگ رو حل کنه مثل:

 

1. ایزوله سازی محیط ها

داکر با استفاده از کانتینر ها (container) به شما این امکان رو میده که هر چیزی که برای اجرای یک برنامه نیاز دارید مثل کتابخونه، سیستم عامل و تنظیمات، به همراه تمام وابستگی های خودش توی یک محیط ایزوله اجرا بشه.

 

2. ساده سازی نصب و راه اندازی 

به جای نصب دستی همه وابستگی ها و تنظیمات اجرایی، یکبار در Dockerfile اون ها رو می نویسیم و هر بار فقط با یک دستور اون رو اجرا می کنیم. این کار خیلی راه اندازی رو راحت تر و کم دردسر تر میکنه.

 

3. سبک و سریع

برخلاف ماشین های مجازی که هر کدوم یک سیستم عامل کامل رو اجرا میکنن، کانتینر های داکر از یک سیستم عامل اشتراکی (Host) استفاده میکنن. به همین دلیل خیلی سبک تره و منابع کمتری از سرور استفاده میکنه.

 

4. انتقال پذیری راحت

چون همه چیز در کانتینر ها بسته بندی شده می تونید به هر سیستمی که داکر داره منتقل کنید و بدون تنظیمات دوباره اون رو اجرا کنید.

 

نتیجه گیری

تا اینجای مقاله با داکر (Docker) آشنا شدیم و برای اینکه مفاهیم اصلی رو یکجا داشته باشید میتونید از خلاصه زیر استفاده کنید:

اجزاءکاربرد
ایمیج (image)قالبی یا بسته ای که حاوی برنامه و وابستگی ها است
کانتینر (container)نمونه در حال اجرای image
داکر فایل (Dockerfile)فایلی برای ساخت ایمیج های سفارشی
داکر کامپوز (docker compose)مدیریت چندین کانتینر با یک فایل YAML
نتورک (network)ارتباط بین کانتینر ها با استفاده از شبکه یا network
والیوم (volume)نگهداری داده ها به صورت دائمی
رجیستری (registery)مخزن ذخیره سازی و اشتراک گذاری image ها
author-avatar
سعید امینی
نویسنده مقاله

الان بیشتر از پنج ساله که مشغول برنامه نویسی وب هستم و در طول این مدت کلی چالش رو پشت سر گذاشتم و عاشق اینم که هر چیزی رو که در این مدت یاد گرفتم رو به بقیه هم یاد بدم، الانم در بستر سایت گیک باز دارم دانشم رو با بقیه تقسیم میکنم :)

نظرات

هنوز نظری وجود ندارد! شما اولین نفر باشید...