
آموزش مقدماتی داکر برای برنامهنویسها
آموزش مقدماتی داکر برای برنامهنویسها
اگر برنامهنویس باشید، احتمالا حداقل یکبار با این مشکل روبهرو شدهاید: پروژه روی سیستم شما بدون مشکل اجرا میشود، اما روی سیستم همکارتان، سرور تست یا محیط 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:20WORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["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 بهتر است به ترتیب زیر پیش بروید:
آشنایی با مفهوم Container و Image
نصب Docker و اجرای چند Image آماده
یادگیری دستورهای پایه مثل
run،ps،stop،rmوlogsنوشتن Dockerfile برای یک پروژه ساده
کار با Volume و Network
استفاده از Docker Compose
اتصال Docker به فرآیند توسعه و تست پروژهها
آشنایی مقدماتی با CI/CD و Deployment
جمعبندی
داکر یکی از مهمترین ابزارهای دنیای توسعه نرمافزار مدرن است. با استفاده از Docker میتوانید پروژهها را در محیطی مستقل، قابل حمل و قابل تکرار اجرا کنید و بسیاری از مشکلات مربوط به تفاوت محیطها را کاهش دهید.
برای برنامهنویسها، یادگیری داکر به معنی سادهتر شدن اجرای پروژهها، همکاری بهتر با تیم، آمادهتر شدن برای بازار کار و درک بهتر فرآیندهای توسعه و استقرار نرمافزار است.
اگر تازه شروع کردهاید، لازم نیست از همان ابتدا همه مفاهیم پیشرفته Docker را یاد بگیرید. کافی است ابتدا بتوانید یک کانتینر اجرا کنید، Dockerfile بنویسید و با Docker Compose چند سرویس ساده را کنار هم بالا بیاورید. همین مهارتها در بسیاری از پروژههای واقعی بسیار کاربردی و ارزشمند هستند.
آیا این مقاله مفید بود؟
نظرات
پرسشها و دیدگاههای خود را درباره این مقاله ثبت کنید.
در حال دریافت دیدگاهها...