آموزش مقدماتی داکر برای برنامه‌نویس‌ها

آموزش مقدماتی داکر برای برنامه‌نویس‌ها

سعید رجبی•
1405/02/26 - 18:35

آموزش مقدماتی داکر برای برنامه‌نویس‌ها

اگر برنامه‌نویس باشید، احتمالا حداقل یک‌بار با این مشکل روبه‌رو شده‌اید: پروژه روی سیستم شما بدون مشکل اجرا می‌شود، اما روی سیستم همکارتان، سرور تست یا محیط production خطا می‌دهد. تفاوت نسخه زبان برنامه‌نویسی، کتابخانه‌ها، تنظیمات سیستم‌عامل، دیتابیس، متغیرهای محیطی و ابزارهای جانبی می‌تواند باعث شود اجرای یک پروژه در محیط‌های مختلف دردسرساز شود.

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

داکر چیست؟

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

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

کانتینر چیست؟

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

به همین دلیل کانتینرها معمولا:

  • سبک‌تر از ماشین‌های مجازی هستند

  • سریع‌تر اجرا می‌شوند

  • منابع کمتری مصرف می‌کنند

  • برای توسعه، تست و استقرار نرم‌افزار بسیار مناسب هستند

تفاوت داکر با ماشین مجازی

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

اما در داکر، کانتینرها از کرنل سیستم‌عامل میزبان استفاده می‌کنند و فقط وابستگی‌ها و فضای اجرایی مورد نیاز برنامه را جدا می‌کنند. به همین دلیل راه‌اندازی کانتینرها بسیار سریع‌تر و کم‌هزینه‌تر است.

البته این به معنی جایگزینی کامل ماشین مجازی نیست. VM و Docker هر کدام کاربردهای خودشان را دارند؛ اما برای بسیاری از نیازهای توسعه نرم‌افزار، داکر گزینه‌ای سریع، سبک و کاربردی است.

چرا برنامه‌نویس‌ها باید داکر یاد بگیرند؟

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

  • اجرای یکسان پروژه در سیستم‌های مختلف

  • ساده‌تر شدن نصب وابستگی‌ها

  • کاهش خطاهای مربوط به تفاوت محیط توسعه و سرور

  • راه‌اندازی سریع سرویس‌هایی مثل دیتابیس، Redis، RabbitMQ و Elasticsearch

  • ساده‌تر شدن همکاری تیمی

  • آمادگی برای کار با DevOps، CI/CD و معماری میکروسرویس

  • نزدیک‌تر شدن محیط development به production

مفاهیم اصلی در Docker

برای شروع کار با داکر، بهتر است چند مفهوم پایه را بشناسید.

Image

ایمیج یک قالب آماده برای ساخت کانتینر است. Image شامل فایل‌ها، تنظیمات، وابستگی‌ها و دستورهای لازم برای اجرای برنامه است.

برای مثال، ایمیج رسمی nginx شامل همه چیزهایی است که برای اجرای وب‌سرور Nginx نیاز دارید.

Container

کانتینر نمونه اجراشده یک Image است. اگر Image را مثل یک کلاس در برنامه‌نویسی در نظر بگیریم، Container شبیه شیء ساخته‌شده از آن کلاس است.

شما می‌توانید از یک Image چندین کانتینر مختلف اجرا کنید.

Dockerfile

Dockerfile فایلی متنی است که در آن مراحل ساخت Image تعریف می‌شود. مثلا مشخص می‌کنید برنامه بر اساس چه ایمیجی ساخته شود، چه فایل‌هایی داخل آن کپی شود، چه پکیج‌هایی نصب شود و هنگام اجرا چه دستوری اجرا گردد.

Docker Hub

Docker Hub یک مخزن آنلاین برای نگهداری و دریافت Docker Imageهاست. بسیاری از ابزارهای معروف مثل MySQL، PostgreSQL، Redis، Nginx، Node.js و Python ایمیج رسمی در Docker Hub دارند.

Volume

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

Network

Docker Network امکان ارتباط بین کانتینرها را فراهم می‌کند. مثلا یک کانتینر اپلیکیشن می‌تواند از طریق شبکه داخلی Docker به کانتینر دیتابیس متصل شود.

نصب Docker

برای شروع، باید Docker را روی سیستم خود نصب کنید. ساده‌ترین روش استفاده از Docker Desktop است که برای Windows، macOS و Linux در دسترس است.

بعد از نصب، می‌توانید با دستور زیر بررسی کنید که Docker درست نصب شده است یا نه:

docker --version

برای مشاهده اطلاعات بیشتر از وضعیت Docker نیز می‌توانید از این دستور استفاده کنید:

docker info

اجرای اولین کانتینر

یکی از ساده‌ترین تست‌ها برای شروع، اجرای ایمیج hello-world است:

docker run hello-world

اگر همه چیز درست نصب شده باشد، Docker ایمیج مورد نظر را دانلود می‌کند، یک کانتینر از آن می‌سازد و پیام خوش‌آمدگویی نمایش می‌دهد.

اجرای یک وب‌سرور با Docker

برای اینکه کاربرد Docker را بهتر ببینید، می‌توانید یک وب‌سرور Nginx را با دستور زیر اجرا کنید:

docker run -d -p 8080:80 nginx

در این دستور:

  • docker run یعنی اجرای یک کانتینر جدید

  • -d یعنی اجرای کانتینر در پس‌زمینه

  • -p 8080:80 یعنی اتصال پورت 8080 سیستم شما به پورت 80 داخل کانتینر

  • nginx نام ایمیجی است که اجرا می‌شود

حالا اگر در مرورگر وارد آدرس زیر شوید، صفحه پیش‌فرض Nginx را می‌بینید:

http://localhost:8080

مشاهده کانتینرهای در حال اجرا

برای دیدن کانتینرهای فعال از دستور زیر استفاده کنید:

docker ps

برای مشاهده همه کانتینرها، حتی کانتینرهای متوقف‌شده:

docker ps -a

توقف و حذف کانتینر

برای توقف یک کانتینر ابتدا شناسه یا نام آن را با docker ps پیدا کنید، سپس دستور زیر را اجرا کنید:

docker stop container_name_or_id

برای حذف کانتینر:

docker rm container_name_or_id

و برای حذف یک Image:

docker rmi image_name_or_id

ساخت Dockerfile ساده

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

FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

توضیح کوتاه این فایل:

  • FROM node:20 یعنی Image پایه، نسخه 20 نود است

  • WORKDIR /app مسیر کاری داخل کانتینر را مشخص می‌کند

  • COPY package*.json ./ فایل‌های پکیج را کپی می‌کند

  • RUN npm install وابستگی‌ها را نصب می‌کند

  • COPY . . کل پروژه را داخل کانتینر کپی می‌کند

  • EXPOSE 3000 اعلام می‌کند برنامه روی پورت 3000 اجرا می‌شود

  • CMD ["npm", "start"] دستور اجرای برنامه است

ساخت Image از Dockerfile

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

docker build -t my-node-app .

در این دستور:

  • build یعنی ساخت Image

  • -t my-node-app یعنی نام Image برابر my-node-app باشد

  • . یعنی Dockerfile در مسیر فعلی قرار دارد

اجرای Image ساخته‌شده

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

docker run -d -p 3000:3000 my-node-app

حالا برنامه شما داخل کانتینر اجرا می‌شود و از طریق پورت 3000 در دسترس است.

Docker Compose چیست؟

وقتی پروژه فقط یک سرویس دارد، استفاده از دستورهای ساده Docker کافی است. اما بسیاری از پروژه‌های واقعی شامل چند سرویس هستند؛ مثلا:

  • اپلیکیشن اصلی

  • دیتابیس PostgreSQL

  • Redis

  • سرویس صف پیام

  • وب‌سرور

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

نمونه ساده فایل docker-compose.yml برای یک اپلیکیشن و دیتابیس:

services:

app:

build: .

ports:

- "3000:3000"

depends_on:

- db

db:

image: postgres:16

environment:

POSTGRES_USER: app

POSTGRES_PASSWORD: secret

POSTGRES_DB: app_db

ports:

- "5432:5432"

برای اجرای سرویس‌ها:

docker compose up -d

برای توقف آن‌ها:

docker compose down

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

در ادامه چند دستور پرکاربرد را می‌بینید:

docker images

نمایش Imageهای موجود روی سیستم.

docker logs container_name_or_id

مشاهده لاگ‌های یک کانتینر.

docker exec -it container_name_or_id bash

ورود به محیط داخلی کانتینر.

docker pull image_name

دریافت یک Image از Docker Hub.

docker system prune

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

اشتباهات رایج افراد تازه‌کار

در شروع کار با Docker، چند اشتباه بسیار رایج وجود دارد:

  • ذخیره کردن داده‌های مهم فقط داخل کانتینر بدون استفاده از Volume

  • قرار دادن فایل‌های غیرضروری داخل Image

  • استفاده نکردن از .dockerignore

  • ساخت Imageهای بسیار بزرگ

  • استفاده از تگ latest در محیط‌های حساس

  • قرار دادن رمز عبور و اطلاعات محرمانه داخل Dockerfile

  • نداشتن درک درست از تفاوت Image و Container

فایل .dockerignore چیست؟

فایل .dockerignore مشخص می‌کند چه فایل‌ها و پوشه‌هایی هنگام ساخت Image وارد کانتینر نشوند. این فایل شبیه .gitignore است.

برای یک پروژه Node.js، نمونه ساده آن می‌تواند این باشد:

node_modules

npm-debug.log

.git

.env

dist

استفاده از .dockerignore باعث می‌شود Image سبک‌تر ساخته شود و اطلاعات غیرضروری یا حساس وارد آن نشود.

بهترین مسیر یادگیری Docker

برای یادگیری Docker بهتر است به ترتیب زیر پیش بروید:

  1. آشنایی با مفهوم Container و Image

  2. نصب Docker و اجرای چند Image آماده

  3. یادگیری دستورهای پایه مثل run، ps، stop، rm و logs

  4. نوشتن Dockerfile برای یک پروژه ساده

  5. کار با Volume و Network

  6. استفاده از Docker Compose

  7. اتصال Docker به فرآیند توسعه و تست پروژه‌ها

  8. آشنایی مقدماتی با CI/CD و Deployment

جمع‌بندی

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

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

اگر تازه شروع کرده‌اید، لازم نیست از همان ابتدا همه مفاهیم پیشرفته Docker را یاد بگیرید. کافی است ابتدا بتوانید یک کانتینر اجرا کنید، Dockerfile بنویسید و با Docker Compose چند سرویس ساده را کنار هم بالا بیاورید. همین مهارت‌ها در بسیاری از پروژه‌های واقعی بسیار کاربردی و ارزشمند هستند.

آیا این مقاله مفید بود؟

نظرات

پرسش‌ها و دیدگاه‌های خود را درباره این مقاله ثبت کنید.

امتیاز شما

در حال دریافت دیدگاه‌ها...