<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>بایگانی‌های آموزش داکر | نوین هاب</title>
	<atom:link href="https://tarahanenovin.ir/blog/tag/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AF%D8%A7%DA%A9%D8%B1/feed/" rel="self" type="application/rss+xml" />
	<link>https://tarahanenovin.ir/blog/tag/آموزش-داکر/</link>
	<description>بلاگ طراحان نوین</description>
	<lastBuildDate>Fri, 17 Jul 2026 15:25:43 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>
	<item>
		<title>آموزش Docker از صفر تا اجرای پروژه واقعی با داکر</title>
		<link>https://tarahanenovin.ir/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-docker-%d8%a7%d8%b2-%d8%b5%d9%81%d8%b1-%d8%aa%d8%a7-%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%be%d8%b1%d9%88%da%98%d9%87-%d9%88%d8%a7%d9%82%d8%b9%db%8c-%d8%a8/</link>
					<comments>https://tarahanenovin.ir/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-docker-%d8%a7%d8%b2-%d8%b5%d9%81%d8%b1-%d8%aa%d8%a7-%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%be%d8%b1%d9%88%da%98%d9%87-%d9%88%d8%a7%d9%82%d8%b9%db%8c-%d8%a8/#respond</comments>
		
		<dc:creator><![CDATA[TNVN]]></dc:creator>
		<pubDate></pubDate>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[بک‌اند]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<category><![CDATA[فرانت‌اند]]></category>
		<category><![CDATA[معرفی ابزار]]></category>
		<category><![CDATA[موبایل]]></category>
		<category><![CDATA[ویندوز]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[آموزش]]></category>
		<category><![CDATA[آموزش Docker]]></category>
		<category><![CDATA[آموزش داکر]]></category>
		<category><![CDATA[داکر]]></category>
		<guid isPermaLink="false">https://tarahanenovin.ir/blog/?p=112</guid>

					<description><![CDATA[<p>آموزش داکر یکی از بهترین نقاط شروع برای توسعه دهندگانی است که می خواهند پروژه های خود را در محیطی استاندارد، قابل انتقال و مستقل اجرا کنند. Docker کمک می کند نرم افزار، کتابخانه ها و تنظیمات مورد نیاز آن را داخل یک بسته مشخص قرار دهید و همان بسته را روی سیستم شخصی، سرور یا زیرساخت ابری اجرا کنید. در این آموزش، ابتدا با مفاهیم اصلی Docker آشنا می شویم و سپس نصب داکر، ساخت Image، اجرای Container، مدیریت داده ها و استفاده از Docker Compose را به صورت مرحله به مرحله بررسی می کنیم. داکر چیست؟ داکر یک پلتفرم متن باز برای ساخت، بسته بندی، توزیع و اجرای نرم افزار در محیط هایی به نام Container است. هر Container شامل برنامه و وابستگی های مورد نیاز آن می شود و می تواند بدون وابستگی مستقیم به تنظیمات سیستم میزبان اجرا شود. برای مثال، فرض کنید یک برنامه تحت وب با Python، Node.js یا PHP توسعه داده اید. اجرای این برنامه ممکن است به نسخه مشخصی از زبان برنامه نویسی، پایگاه داده، وب سرور و چند کتابخانه نیاز داشته باشد. با Docker می توانید تمام این موارد را در قالب یک Image تعریف کنید تا اعضای تیم و سرور اصلی دقیقا از همان محیط استفاده کنند. برای مطالعه تعاریف و راهنماهای رسمی می توانید به مستندات Docker مراجعه کنید. چرا باید Docker را یاد بگیریم؟ مشکل معروف «روی سیستم من اجرا می شود» معمولا زمانی به وجود می آید که محیط توسعه با محیط آزمایش یا سرور اصلی تفاوت دارد. ممکن است نسخه زبان برنامه نویسی، کتابخانه ها، متغیرهای محیطی یا تنظیمات سیستم عامل یکسان نباشند. داکر این تفاوت ها را تا حد زیادی کاهش می دهد. مهم ترین مزایای استفاده از Docker عبارت هستند از: ایجاد محیط توسعه یکسان برای تمام اعضای تیم انتقال آسان نرم افزار میان سیستم شخصی، سرور و فضای ابری کاهش مشکلات مربوط به نسخه کتابخانه ها و وابستگی ها راه اندازی سریع محیط توسعه و آزمایش جداسازی سرویس های مختلف از یکدیگر استفاده بهتر از منابع در مقایسه با بسیاری از ماشین های مجازی ساده تر شدن فرآیند استقرار و انتشار نرم افزار امکان بازگشت سریع به نسخه قبلی برنامه یادگیری داکر برای توسعه دهندگان وب، برنامه نویسان بک اند، کارشناسان DevOps، مدیران سرور و تیم های توسعه نرم افزار کاربردی است. تفاوت Docker و ماشین مجازی چیست؟ ماشین مجازی یا Virtual Machine معمولا یک سیستم عامل کامل را همراه با برنامه ها اجرا می کند. هر ماشین مجازی به حافظه، پردازنده و فضای ذخیره سازی جداگانه نیاز دارد و راه اندازی آن ممکن است زمان بیشتری ببرد. Container برخلاف ماشین مجازی، معمولا از هسته سیستم عامل میزبان استفاده می کند. به همین دلیل سبک تر است، سریع تر اجرا می شود و منابع کمتری مصرف می کند. تفاوت های مهم این دو فناوری را می توان به شکل زیر خلاصه کرد: ویژگی Docker Container ماشین مجازی زمان راه اندازی معمولا چند ثانیه معمولا بیشتر مصرف منابع کمتر بیشتر سیستم عامل کامل ندارد دارد قابلیت انتقال بسیار مناسب مناسب جداسازی در سطح فرآیند در سطح سیستم عامل کاربرد رایج توسعه، آزمایش و استقرار سرویس اجرای سیستم عامل مستقل داکر همیشه جایگزین ماشین مجازی نیست. انتخاب میان این دو به سطح جداسازی، امنیت، نوع نرم افزار و معماری زیرساخت بستگی دارد. مفاهیم اصلی در آموزش داکر قبل از اجرای دستورات Docker باید با چند مفهوم پایه آشنا شوید. Docker Image چیست؟ Image یک الگوی فقط خواندنی است که فایل های برنامه، وابستگی ها، تنظیمات و دستور اجرای نرم افزار را در خود نگه می دارد. می توانید Image را مانند نقشه ساخت یک محیط اجرایی در نظر بگیرید. برای مثال، Image رسمی Nginx شامل فایل ها و تنظیمات لازم برای اجرای وب سرور Nginx است. Docker Container چیست؟ Container نمونه در حال اجرا یا متوقف شده یک Image است. از یک Image می توان چند Container مستقل ایجاد کرد. برای نمونه، امکان دارد سه Container از Image یک برنامه بسازید و هر کدام را روی پورت متفاوتی اجرا کنید. Dockerfile چیست؟ Dockerfile یک فایل متنی شامل دستوراتی است که Docker برای ساخت Image اجرا می کند. در این فایل می توانید Image پایه، مسیر کاری، فایل های پروژه، وابستگی ها و فرمان اجرای برنامه را مشخص کنید. Docker Registry چیست؟ Registry محلی برای ذخیره و توزیع Imageها است. Docker Hub یکی از شناخته شده ترین Registryهای عمومی محسوب می شود. سازمان ها نیز می توانند Registry خصوصی خود را راه اندازی کنند. Docker Volume چیست؟ اطلاعات داخل لایه قابل نوشتن Container با حذف Container از دسترس خارج می شوند. Volume برای نگهداری پایدار داده ها استفاده می شود و چرخه عمر آن از Container مستقل است. Volume به ویژه برای پایگاه داده، فایل های بارگذاری شده توسط کاربران و اطلاعاتی که نباید با حذف Container از بین بروند اهمیت دارد. Docker Network چیست؟ Network امکان ارتباط میان Containerها و همچنین ارتباط Container با شبکه بیرونی را فراهم می کند. در پروژه های چند سرویسه، برنامه می تواند از طریق نام سرویس به پایگاه داده یا سرویس های دیگر متصل شود. آموزش نصب Docker روش نصب Docker به سیستم عامل شما بستگی دارد. نصب Docker در ویندوز برای استفاده از Docker در ویندوز معمولا Docker Desktop نصب می شود. در نسخه های جدید ویندوز، استفاده از WSL 2 می تواند تجربه مناسب تری برای اجرای Containerهای لینوکسی فراهم کند. مراحل کلی عبارت هستند از: فعال کردن قابلیت مجازی سازی در BIOS یا UEFI نصب و فعال سازی WSL 2 در صورت نیاز دریافت Docker Desktop از وب سایت رسمی نصب و اجرای برنامه بررسی فعال بودن Docker Engine نصب Docker در macOS کاربران macOS نیز می توانند Docker Desktop را متناسب با پردازنده Intel یا Apple Silicon دریافت و نصب کنند. پس از نصب، Docker Engine از طریق محیط Docker Desktop مدیریت می شود. نصب Docker در لینوکس در توزیع های لینوکسی می توان Docker Engine را از مخزن رسمی Docker نصب کرد. دستورهای نصب براساس توزیع و نسخه سیستم عامل متفاوت هستند. بهتر است به جای استفاده از بسته های قدیمی، مراحل موجود در راهنمای رسمی نصب Docker Engine را دنبال کنید. بعد از نصب، برای بررسی نسخه Docker دستور زیر را اجرا کنید: docker --version سپس برای آزمایش عملکرد Docker از دستور زیر استفاده کنید: docker run hello-world Docker در صورت نبودن Image روی سیستم، آن را دریافت می کند و یک Container آزمایشی می سازد. نمایش پیام موفقیت نشان می دهد نصب اولیه به درستی انجام شده است. اولین Container را اجرا کنید برای اجرای وب سرور Nginx می توانید دستور زیر را وارد کنید: docker run -d --name my-nginx -p 8080:80 nginx اجزای این دستور عبارت هستند از: docker run: ساخت و اجرای Container جدید -d: اجرای Container در پس زمینه --name my-nginx: تعیین نام برای Container -p 8080:80: اتصال پورت 8080 سیستم میزبان به پورت 80 Container nginx: نام Image مورد استفاده پس از اجرا، آدرس زیر را در مرورگر باز کنید: http://localhost:8080 اگر صفحه پیش فرض Nginx نمایش داده شود، اولین Container شما با موفقیت اجرا شده است. دستورات مهم Docker برای شروع در ادامه تعدادی از پرکاربردترین دستورات Docker را بررسی می کنیم. نمایش Containerهای در حال اجرا docker ps برای نمایش تمام Containerها، از جمله موارد متوقف شده، از گزینه -a استفاده کنید: docker ps -a نمایش Imageهای موجود docker images متوقف کردن Container docker stop my-nginx اجرای مجدد Container docker start my-nginx حذف Container docker rm my-nginx Container باید پیش از حذف متوقف شود. برای توقف و حذف اجباری می توان از دستور زیر استفاده کرد: docker rm -f my-nginx حذف Image docker rmi nginx مشاهده گزارش اجرای Container docker logs my-nginx برای دنبال کردن گزارش ها به صورت زنده از گزینه -f استفاده کنید: docker logs -f my-nginx اجرای دستور داخل Container docker exec -it my-nginx sh این دستور یک پوسته تعاملی داخل Container باز می کند. البته نوع پوسته موجود به Image مورد استفاده بستگی دارد. آموزش ساخت Dockerfile برای درک بهتر فرآیند ساخت Image، یک برنامه ساده Node.js را در نظر بگیرید. ساختار پروژه می تواند به صورت زیر باشد: docker-demo/ ├── Dockerfile ├── package.json └── server.js محتوای فایل server.js: const http = require("http"); const server = http.createServer((request, response) =&#62; { response.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" }); response.end("Hello from Docker"); }); server.listen(3000, "0.0.0.0", () =&#62; { console.log("Server is running on port 3000"); }); محتوای فایل package.json: { "name": "docker-demo", "version": "1.0.0", "scripts": { "start": "node server.js" } } اکنون یک فایل بدون پسوند با نام Dockerfile ایجاد کنید: FROM node:22-alpine WORKDIR /app COPY package*.json ./ COPY . . EXPOSE 3000 CMD ["npm", "start"] هر دستور وظیفه مشخصی دارد: FROM: تعیین Image پایه WORKDIR: مشخص کردن مسیر کاری داخل Image COPY: کپی کردن فایل ها به Image EXPOSE: مستند کردن پورت مورد استفاده برنامه CMD: تعیین فرمان پیش فرض هنگام اجرای Container ساخت Image اختصاصی در مسیر پروژه دستور زیر را اجرا کنید: docker build -t docker-demo:1.0 . گزینه -t نام و برچسب Image را تعیین می کند. نقطه انتهای دستور نیز نشان می دهد که Docker باید فایل های مورد نیاز را از مسیر فعلی دریافت کند. بعد از پایان ساخت، Image را اجرا کنید: docker run -d --name docker-demo-app -p 3000:3000 docker-demo:1.0 اکنون برنامه از آدرس زیر در دسترس است: http://localhost:3000 استفاده از فایل .dockerignore هنگام ساخت Image لازم نیست تمام فایل های پروژه به Docker ارسال شوند. فایل هایی مانند پوشه وابستگی ها، اطلاعات Git، گزارش ها و فایل های موقت می توانند فرآیند ساخت را کند کنند یا حجم Image را افزایش دهند. برای پروژه Node.js یک فایل .dockerignore با محتوای زیر بسازید: node_modules npm-debug.log .git .gitignore .env فایل های حساس مانند .env نباید بدون دلیل داخل Image کپی شوند. اطلاعات محرمانه باید از روش های امن مدیریت متغیرهای محیطی و Secretها در اختیار برنامه قرار بگیرند. مدیریت داده ها با Docker Volume اگر یک Container پایگاه داده را حذف کنید، نباید اطلاعات اصلی برنامه نیز حذف شوند. Volume راهکار پیشنهادی Docker برای نگهداری پایدار داده ها است. برای ساخت Volume از دستور زیر استفاده کنید: docker volume create app-data فهرست Volumeها را مشاهده کنید: docker volume ls سپس Volume را هنگام اجرای Container متصل کنید: docker run -d \ --name my-nginx \ -p 8080:80 \ -v app-data:/usr/share/nginx/html \ nginx برای مشاهده اطلاعات کامل Volume نیز می توانید دستور زیر را اجرا کنید: docker volume inspect app-data جزئیات بیشتر درباره روش های ذخیره سازی در مستندات رسمی Docker Volume در دسترس است. تفاوت Volume و Bind Mount در Bind Mount یک مسیر مشخص از سیستم میزبان مستقیما به Container متصل می شود. این روش در محیط توسعه مفید است؛ زیرا تغییر فایل های پروژه بلافاصله داخل Container دیده می شود. نمونه اتصال پوشه فعلی به Nginx: docker run -d \ --name local-web \ -p 8080:80 \ -v "$(pwd)":/usr/share/nginx/html:ro \ nginx در این مثال، گزینه ro دسترسی Container را به حالت فقط خواندنی محدود می کند. به طور کلی: Volume توسط Docker مدیریت می شود و برای داده های پایدار انتخاب مناسبی است. Bind Mount به مسیر مشخصی از سیستم میزبان وابسته است و بیشتر در محیط توسعه کاربرد دارد. شبکه در Docker چگونه کار می کند؟ برای ایجاد یک شبکه اختصاصی دستور زیر را اجرا کنید: docker network create app-network سپس می توانید Containerها را روی همان شبکه اجرا کنید: docker run -d \ --name database \ --network app-network \ -e POSTGRES_PASSWORD=change-this-password \ postgres Container دیگری که عضو app-network باشد، می تواند با استفاده از نام database به این سرویس متصل شود. این قابلیت نیاز به استفاده از آدرس IP ثابت برای ارتباط داخلی سرویس ها را کاهش می دهد. در پروژه های واقعی نباید رمز عبور پایگاه داده را مستقیما در تاریخچه دستورات، فایل Dockerfile یا مخزن Git ثبت کنید. Docker Compose چیست؟ بسیاری از پروژه ها فقط از یک Container تشکیل نمی شوند. یک سامانه تحت وب ممکن است شامل برنامه اصلی، پایگاه داده، Redis، وب سرور و سرویس های جانبی باشد. Docker Compose امکان تعریف و مدیریت چند سرویس را در یک فایل YAML فراهم می کند. به جای اجرای چند دستور طولانی، تمام سرویس ها، شبکه ها و Volumeها را در فایل compose.yaml مشخص می کنید. برای اطلاعات تکمیلی می توانید مستندات Docker Compose را مطالعه کنید. آموزش Docker Compose با یک مثال کاربردی در مثال زیر یک برنامه Node.js در کنار پایگاه داده PostgreSQL اجرا می شود: services: app: build: . container_name: demo-app ports: - "3000:3000" environment: DATABASE_HOST: db DATABASE_PORT: 5432 DATABASE_NAME: appdb DATABASE_USER: appuser DATABASE_PASSWORD: ${DATABASE_PASSWORD} depends_on: db: condition: service_healthy db: image: postgres:17-alpine container_name: demo-db environment: POSTGRES_DB: appdb POSTGRES_USER: appuser POSTGRES_PASSWORD: ${DATABASE_PASSWORD} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"] interval: 5s timeout: 5s retries: 10 volumes: postgres-data: رمز عبور را در فایل .env قرار دهید: DATABASE_PASSWORD=replace-with-a-strong-password فایل .env را به .gitignore اضافه کنید تا اطلاعات حساس وارد مخزن Git نشوند. برای ساخت و اجرای سرویس ها از دستور زیر استفاده کنید: docker compose up -d --build برای مشاهده وضعیت سرویس ها: docker compose ps برای مشاهده گزارش ها: docker compose logs -f برای توقف و حذف Containerها و شبکه ایجاد شده: docker compose down دستور بالا Volume را حذف نمی کند. اگر قصد حذف Volume و داده های آن را دارید، می توانید از دستور زیر استفاده کنید: docker compose down -v این دستور اطلاعات ذخیره شده در Volumeهای پروژه را پاک می کند؛ بنابراین باید با دقت اجرا شود. یک نمونه کامل تر نیز در راهنمای شروع سریع Docker Compose ارائه شده است. بهترین روش ها برای نوشتن Dockerfile یک Dockerfile نامناسب ممکن است Image بسیار حجیم، ناامن یا کند تولید کند. رعایت نکات زیر کیفیت خروجی را بهتر می کند. از Image پایه مناسب استفاده کنید Imageهای سبک مانند نسخه های Alpine یا Slim در بعضی پروژه ها حجم نهایی را کاهش می دهند. با این حال، کوچک ترین Image همیشه بهترین انتخاب نیست. سازگاری کتابخانه ها، ابزارهای عیب یابی و نیازهای امنیتی را نیز بررسی کنید. ترتیب دستورها را بهینه کنید Docker برای افزایش سرعت ساخت از کش لایه ها استفاده می کند. فایل هایی که کمتر تغییر می کنند باید قبل از کدهای اصلی کپی شوند. برای نمونه، بهتر است ابتدا فایل وابستگی ها کپی و نصب شود و سپس کد برنامه داخل Image قرار بگیرد. در این حالت، تغییر یک فایل کد باعث نصب دوباره تمام وابستگی ها نمی شود. نسخه Imageها را مشخص کنید استفاده بدون بررسی از برچسب latest می تواند نتیجه ساخت را در زمان های مختلف تغییر دهد. بهتر است نسخه مشخص و متناسب با پروژه را انتخاب کنید: FROM node:22-alpine برنامه را با کاربر root اجرا نکنید در محیط عملیاتی بهتر است یک کاربر با دسترسی محدود بسازید و برنامه را با همان کاربر اجرا کنید. این کار بخشی از ریسک های امنیتی را کاهش می دهد. اطلاعات حساس را وارد Image نکنید رمز عبور، کلید API، گواهی خصوصی و فایل های تنظیمات حساس نباید داخل Dockerfile یا لایه های Image قرار بگیرند. حذف یک Secret در دستور بعدی نیز لزوما آن را از لایه قبلی پاک نمی کند. از Multi-stage Build استفاده کنید Multi-stage Build اجازه می دهد ابزارهای ساخت را از Image نهایی جدا کنید. این روش به ویژه برای پروژه های Go، Java، .NET و برنامه های فرانت اند مفید است. نمونه ساده برای یک پروژه فرانت اند: FROM node:22-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 در مرحله اول پروژه ساخته می شود و در مرحله دوم فقط فایل های خروجی وارد Image نهایی می شوند. خطاهای رایج هنگام کار با Docker Container بلافاصله متوقف می شود Container تا زمانی فعال می ماند که فرآیند اصلی آن در حال اجرا باشد. برای بررسی علت توقف از دستور زیر استفاده کنید: docker logs container-name همچنین مقدار CMD یا ENTRYPOINT را در Dockerfile بررسی کنید. پورت برنامه در دسترس نیست موارد زیر را کنترل کنید: اتصال پورت با گزینه -p انجام شده باشد. برنامه داخل Container روی 0.0.0.0 گوش دهد، نه فقط localhost. پورت مورد نظر توسط برنامه دیگری اشغال نشده باشد. دیوار آتش یا تنظیمات شبکه مانع اتصال نباشد. تغییرات کد در Container دیده نمی شود اگر Image را از روی کد ساخته اید، بعد از تغییر کد باید Image دوباره ساخته شود: docker compose up -d --build در محیط توسعه می توانید از Bind Mount یا قابلیت های مخصوص توسعه Compose استفاده کنید. نام سرویس پایگاه داده اشتباه است در Docker Compose، برنامه معمولا باید با نام سرویس به پایگاه داده متصل شود. اگر نام سرویس db است، مقدار میزبان پایگاه داده نیز باید db باشد، نه localhost. فضای ذخیره سازی Docker پر شده است Imageها، Containerهای متوقف شده و کش ساخت می توانند فضای زیادی مصرف کنند. ابتدا میزان مصرف را بررسی کنید: docker system df برای پاک سازی منابع بدون استفاده می توان از دستورهای docker container prune، docker image prune و docker builder prune استفاده کرد. پیش از پاک سازی، مطمئن شوید داده یا منبع مورد نیاز پروژه حذف نمی شود. کاربرد Docker در پروژه های طراحی سایت و نرم افزار داکر فقط یک ابزار مخصوص مدیران سرور نیست. تیم های طراحی سایت و توسعه نرم افزار می توانند از آن در مراحل مختلف پروژه استفاده کنند. برخی از کاربردهای مهم عبارت هستند از: ساخت محیط توسعه یکسان برای اعضای تیم اجرای نسخه مشخص PHP، Node.js، Python یا .NET راه اندازی سریع MySQL، PostgreSQL، Redis و Elasticsearch آزمایش پروژه در نسخه های مختلف پایگاه داده اجرای تست های خودکار در فرآیند CI/CD آماده سازی نسخه آزمایشی برای کارفرما استقرار کنترل شده برنامه روی سرور جداسازی پروژه های مختلف روی یک سیستم توسعه ساده کردن فرآیند ورود اعضای جدید به تیم برای مثال، یک تیم طراحی سایت می تواند WordPress، MySQL و ابزار مدیریت پایگاه داده را در یک فایل Compose تعریف کند. در نتیجه، راه اندازی محیط پروژه برای عضو جدید تیم به جای چند ساعت تنظیم دستی، با چند دستور مشخص انجام می شود. آیا Docker برای محیط عملیاتی مناسب است؟ Docker می تواند در محیط عملیاتی استفاده شود، اما نصب داکر به تنهایی یک زیرساخت پایدار و امن ایجاد نمی کند. برای استفاده حرفه ای باید موضوعات زیر نیز بررسی شوند: امنیت Imageها و بررسی آسیب پذیری ها مدیریت Secretها و اطلاعات حساس ثبت و نگهداری گزارش ها تهیه نسخه پشتیبان از داده ها مانیتورینگ مصرف منابع و سلامت سرویس ها محدود کردن...</p>
<p>نوشته <a href="https://tarahanenovin.ir/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-docker-%d8%a7%d8%b2-%d8%b5%d9%81%d8%b1-%d8%aa%d8%a7-%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%be%d8%b1%d9%88%da%98%d9%87-%d9%88%d8%a7%d9%82%d8%b9%db%8c-%d8%a8/">آموزش Docker از صفر تا اجرای پروژه واقعی با داکر</a> اولین بار در <a href="https://tarahanenovin.ir/blog">نوین هاب</a>. پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p dir="rtl" lang="fa">آموزش داکر یکی از بهترین نقاط شروع برای توسعه دهندگانی است که می خواهند پروژه های خود را در محیطی استاندارد، قابل انتقال و مستقل اجرا کنند. Docker کمک می کند نرم افزار، کتابخانه ها و تنظیمات مورد نیاز آن را داخل یک بسته مشخص قرار دهید و همان بسته را روی سیستم شخصی، سرور یا زیرساخت ابری اجرا کنید.</p>
<p dir="rtl" lang="fa">در این آموزش، ابتدا با مفاهیم اصلی Docker آشنا می شویم و سپس نصب داکر، ساخت Image، اجرای Container، مدیریت داده ها و استفاده از Docker Compose را به صورت مرحله به مرحله بررسی می کنیم.</p>
<h2 dir="rtl" lang="fa">داکر چیست؟</h2>
<p dir="rtl" lang="fa">داکر یک پلتفرم متن باز برای ساخت، بسته بندی، توزیع و اجرای نرم افزار در محیط هایی به نام Container است. هر Container شامل برنامه و وابستگی های مورد نیاز آن می شود و می تواند بدون وابستگی مستقیم به تنظیمات سیستم میزبان اجرا شود.</p>
<p dir="rtl" lang="fa">برای مثال، فرض کنید یک برنامه تحت وب با Python، Node.js یا PHP توسعه داده اید. اجرای این برنامه ممکن است به نسخه مشخصی از زبان برنامه نویسی، پایگاه داده، وب سرور و چند کتابخانه نیاز داشته باشد. با Docker می توانید تمام این موارد را در قالب یک Image تعریف کنید تا اعضای تیم و سرور اصلی دقیقا از همان محیط استفاده کنند.</p>
<p dir="rtl" lang="fa">برای مطالعه تعاریف و راهنماهای رسمی می توانید به <a href="https://docs.docker.com/" target="_blank" rel="nofollow noopener noreferrer">مستندات Docker</a> مراجعه کنید.</p>
<h2 dir="rtl" lang="fa">چرا باید Docker را یاد بگیریم؟</h2>
<p dir="rtl" lang="fa">مشکل معروف «روی سیستم من اجرا می شود» معمولا زمانی به وجود می آید که محیط توسعه با محیط آزمایش یا سرور اصلی تفاوت دارد. ممکن است نسخه زبان برنامه نویسی، کتابخانه ها، متغیرهای محیطی یا تنظیمات سیستم عامل یکسان نباشند.</p>
<p dir="rtl" lang="fa">داکر این تفاوت ها را تا حد زیادی کاهش می دهد. مهم ترین مزایای استفاده از Docker عبارت هستند از:</p>
<ul dir="rtl" lang="fa">
<li>ایجاد محیط توسعه یکسان برای تمام اعضای تیم</li>
<li>انتقال آسان نرم افزار میان سیستم شخصی، سرور و فضای ابری</li>
<li>کاهش مشکلات مربوط به نسخه کتابخانه ها و وابستگی ها</li>
<li>راه اندازی سریع محیط توسعه و آزمایش</li>
<li>جداسازی سرویس های مختلف از یکدیگر</li>
<li>استفاده بهتر از منابع در مقایسه با بسیاری از ماشین های مجازی</li>
<li>ساده تر شدن فرآیند استقرار و انتشار نرم افزار</li>
<li>امکان بازگشت سریع به نسخه قبلی برنامه</li>
</ul>
<p dir="rtl" lang="fa">یادگیری داکر برای توسعه دهندگان وب، برنامه نویسان بک اند، کارشناسان DevOps، مدیران سرور و تیم های توسعه نرم افزار کاربردی است.</p>
<h2 dir="rtl" lang="fa">تفاوت Docker و ماشین مجازی چیست؟</h2>
<p dir="rtl" lang="fa">ماشین مجازی یا Virtual Machine معمولا یک سیستم عامل کامل را همراه با برنامه ها اجرا می کند. هر ماشین مجازی به حافظه، پردازنده و فضای ذخیره سازی جداگانه نیاز دارد و راه اندازی آن ممکن است زمان بیشتری ببرد.</p>
<p dir="rtl" lang="fa">Container برخلاف ماشین مجازی، معمولا از هسته سیستم عامل میزبان استفاده می کند. به همین دلیل سبک تر است، سریع تر اجرا می شود و منابع کمتری مصرف می کند.</p>
<p dir="rtl" lang="fa">تفاوت های مهم این دو فناوری را می توان به شکل زیر خلاصه کرد:</p>
<div class="table-container">
<table>
<thead>
<tr>
<th>ویژگی</th>
<th>Docker Container</th>
<th>ماشین مجازی</th>
</tr>
</thead>
<tbody>
<tr>
<td dir="rtl" lang="fa">زمان راه اندازی</td>
<td dir="rtl" lang="fa">معمولا چند ثانیه</td>
<td dir="rtl" lang="fa">معمولا بیشتر</td>
</tr>
<tr>
<td dir="rtl" lang="fa">مصرف منابع</td>
<td dir="rtl" lang="fa">کمتر</td>
<td dir="rtl" lang="fa">بیشتر</td>
</tr>
<tr>
<td dir="rtl" lang="fa">سیستم عامل کامل</td>
<td dir="rtl" lang="fa">ندارد</td>
<td dir="rtl" lang="fa">دارد</td>
</tr>
<tr>
<td dir="rtl" lang="fa">قابلیت انتقال</td>
<td dir="rtl" lang="fa">بسیار مناسب</td>
<td dir="rtl" lang="fa">مناسب</td>
</tr>
<tr>
<td dir="rtl" lang="fa">جداسازی</td>
<td dir="rtl" lang="fa">در سطح فرآیند</td>
<td dir="rtl" lang="fa">در سطح سیستم عامل</td>
</tr>
<tr>
<td dir="rtl" lang="fa">کاربرد رایج</td>
<td dir="rtl" lang="fa">توسعه، آزمایش و استقرار سرویس</td>
<td dir="rtl" lang="fa">اجرای سیستم عامل مستقل</td>
</tr>
</tbody>
</table>
</div>
<p dir="rtl" lang="fa">داکر همیشه جایگزین ماشین مجازی نیست. انتخاب میان این دو به سطح جداسازی، امنیت، نوع نرم افزار و معماری زیرساخت بستگی دارد.</p>
<h2 dir="rtl" lang="fa">مفاهیم اصلی در آموزش داکر</h2>
<p dir="rtl" lang="fa">قبل از اجرای دستورات Docker باید با چند مفهوم پایه آشنا شوید.</p>
<h3 dir="rtl" lang="fa">Docker Image چیست؟</h3>
<p dir="rtl" lang="fa">Image یک الگوی فقط خواندنی است که فایل های برنامه، وابستگی ها، تنظیمات و دستور اجرای نرم افزار را در خود نگه می دارد. می توانید Image را مانند نقشه ساخت یک محیط اجرایی در نظر بگیرید.</p>
<p dir="rtl" lang="fa">برای مثال، Image رسمی Nginx شامل فایل ها و تنظیمات لازم برای اجرای وب سرور Nginx است.</p>
<h3 dir="rtl" lang="fa">Docker Container چیست؟</h3>
<p dir="rtl" lang="fa">Container نمونه در حال اجرا یا متوقف شده یک Image است. از یک Image می توان چند Container مستقل ایجاد کرد.</p>
<p dir="rtl" lang="fa">برای نمونه، امکان دارد سه Container از Image یک برنامه بسازید و هر کدام را روی پورت متفاوتی اجرا کنید.</p>
<h3 dir="rtl" lang="fa">Dockerfile چیست؟</h3>
<p dir="rtl" lang="fa">Dockerfile یک فایل متنی شامل دستوراتی است که Docker برای ساخت Image اجرا می کند. در این فایل می توانید Image پایه، مسیر کاری، فایل های پروژه، وابستگی ها و فرمان اجرای برنامه را مشخص کنید.</p>
<h3 dir="rtl" lang="fa">Docker Registry چیست؟</h3>
<p dir="rtl" lang="fa">Registry محلی برای ذخیره و توزیع Imageها است. Docker Hub یکی از شناخته شده ترین Registryهای عمومی محسوب می شود. سازمان ها نیز می توانند Registry خصوصی خود را راه اندازی کنند.</p>
<h3 dir="rtl" lang="fa">Docker Volume چیست؟</h3>
<p dir="rtl" lang="fa">اطلاعات داخل لایه قابل نوشتن Container با حذف Container از دسترس خارج می شوند. Volume برای نگهداری پایدار داده ها استفاده می شود و چرخه عمر آن از Container مستقل است.</p>
<p dir="rtl" lang="fa">Volume به ویژه برای پایگاه داده، فایل های بارگذاری شده توسط کاربران و اطلاعاتی که نباید با حذف Container از بین بروند اهمیت دارد.</p>
<h3 dir="rtl" lang="fa">Docker Network چیست؟</h3>
<p dir="rtl" lang="fa">Network امکان ارتباط میان Containerها و همچنین ارتباط Container با شبکه بیرونی را فراهم می کند. در پروژه های چند سرویسه، برنامه می تواند از طریق نام سرویس به پایگاه داده یا سرویس های دیگر متصل شود.</p>
<h2 dir="rtl" lang="fa">آموزش نصب Docker</h2>
<p dir="rtl" lang="fa">روش نصب Docker به سیستم عامل شما بستگی دارد.</p>
<h3 dir="rtl" lang="fa">نصب Docker در ویندوز</h3>
<p dir="rtl" lang="fa">برای استفاده از Docker در ویندوز معمولا Docker Desktop نصب می شود. در نسخه های جدید ویندوز، استفاده از WSL 2 می تواند تجربه مناسب تری برای اجرای Containerهای لینوکسی فراهم کند.</p>
<p dir="rtl" lang="fa">مراحل کلی عبارت هستند از:</p>
<ol dir="rtl" lang="fa">
<li>فعال کردن قابلیت مجازی سازی در BIOS یا UEFI</li>
<li>نصب و فعال سازی WSL 2 در صورت نیاز</li>
<li>دریافت Docker Desktop از وب سایت رسمی</li>
<li>نصب و اجرای برنامه</li>
<li>بررسی فعال بودن Docker Engine</li>
</ol>
<h3 dir="rtl" lang="fa">نصب Docker در macOS</h3>
<p dir="rtl" lang="fa">کاربران macOS نیز می توانند Docker Desktop را متناسب با پردازنده Intel یا Apple Silicon دریافت و نصب کنند. پس از نصب، Docker Engine از طریق محیط Docker Desktop مدیریت می شود.</p>
<h3 dir="rtl" lang="fa">نصب Docker در لینوکس</h3>
<p dir="rtl" lang="fa">در توزیع های لینوکسی می توان Docker Engine را از مخزن رسمی Docker نصب کرد. دستورهای نصب براساس توزیع و نسخه سیستم عامل متفاوت هستند. بهتر است به جای استفاده از بسته های قدیمی، مراحل موجود در <a href="https://docs.docker.com/engine/install/" target="_blank" rel="nofollow noopener noreferrer">راهنمای رسمی نصب Docker Engine</a> را دنبال کنید.</p>
<p dir="rtl" lang="fa">بعد از نصب، برای بررسی نسخه Docker دستور زیر را اجرا کنید:</p>
<pre><code class="hljs">docker --version
</code></pre>
<p dir="rtl" lang="fa">سپس برای آزمایش عملکرد Docker از دستور زیر استفاده کنید:</p>
<pre><code class="hljs">docker run hello-world
</code></pre>
<p dir="rtl" lang="fa">Docker در صورت نبودن Image روی سیستم، آن را دریافت می کند و یک Container آزمایشی می سازد. نمایش پیام موفقیت نشان می دهد نصب اولیه به درستی انجام شده است.</p>
<h2 dir="rtl" lang="fa">اولین Container را اجرا کنید</h2>
<p dir="rtl" lang="fa">برای اجرای وب سرور Nginx می توانید دستور زیر را وارد کنید:</p>
<pre><code class="hljs">docker run -d --name my-nginx -p 8080:80 nginx
</code></pre>
<p dir="rtl" lang="fa">اجزای این دستور عبارت هستند از:</p>
<ul dir="rtl" lang="fa">
<li><code>docker run</code>: ساخت و اجرای Container جدید</li>
<li><code>-d</code>: اجرای Container در پس زمینه</li>
<li><code>--name my-nginx</code>: تعیین نام برای Container</li>
<li><code>-p 8080:80</code>: اتصال پورت 8080 سیستم میزبان به پورت 80 Container</li>
<li><code>nginx</code>: نام Image مورد استفاده</li>
</ul>
<p dir="rtl" lang="fa">پس از اجرا، آدرس زیر را در مرورگر باز کنید:</p>
<pre><code class="hljs">http://localhost:8080
</code></pre>
<p dir="rtl" lang="fa">اگر صفحه پیش فرض Nginx نمایش داده شود، اولین Container شما با موفقیت اجرا شده است.</p>
<h2 dir="rtl" lang="fa">دستورات مهم Docker برای شروع</h2>
<p dir="rtl" lang="fa">در ادامه تعدادی از پرکاربردترین دستورات Docker را بررسی می کنیم.</p>
<h3 dir="rtl" lang="fa">نمایش Containerهای در حال اجرا</h3>
<pre><code class="hljs">docker ps
</code></pre>
<p dir="rtl" lang="fa">برای نمایش تمام Containerها، از جمله موارد متوقف شده، از گزینه <code>-a</code> استفاده کنید:</p>
<pre><code class="hljs">docker ps -a
</code></pre>
<h3 dir="rtl" lang="fa">نمایش Imageهای موجود</h3>
<pre><code class="hljs">docker images
</code></pre>
<h3 dir="rtl" lang="fa">متوقف کردن Container</h3>
<pre><code class="hljs">docker stop my-nginx
</code></pre>
<h3 dir="rtl" lang="fa">اجرای مجدد Container</h3>
<pre><code class="hljs">docker start my-nginx
</code></pre>
<h3 dir="rtl" lang="fa">حذف Container</h3>
<pre><code class="hljs">docker <span class="hljs-built_in">rm</span> my-nginx
</code></pre>
<p dir="rtl" lang="fa">Container باید پیش از حذف متوقف شود. برای توقف و حذف اجباری می توان از دستور زیر استفاده کرد:</p>
<pre><code class="hljs">docker <span class="hljs-built_in">rm</span> -f my-nginx
</code></pre>
<h3 dir="rtl" lang="fa">حذف Image</h3>
<pre><code class="hljs">docker rmi nginx
</code></pre>
<h3 dir="rtl" lang="fa">مشاهده گزارش اجرای Container</h3>
<pre><code class="hljs">docker logs my-nginx
</code></pre>
<p dir="rtl" lang="fa">برای دنبال کردن گزارش ها به صورت زنده از گزینه <code>-f</code> استفاده کنید:</p>
<pre><code class="hljs">docker logs -f my-nginx
</code></pre>
<h3 dir="rtl" lang="fa">اجرای دستور داخل Container</h3>
<pre><code class="hljs">docker <span class="hljs-built_in">exec</span> -it my-nginx sh
</code></pre>
<p dir="rtl" lang="fa">این دستور یک پوسته تعاملی داخل Container باز می کند. البته نوع پوسته موجود به Image مورد استفاده بستگی دارد.</p>
<h2 dir="rtl" lang="fa">آموزش ساخت Dockerfile</h2>
<p dir="rtl" lang="fa">برای درک بهتر فرآیند ساخت Image، یک برنامه ساده Node.js را در نظر بگیرید. ساختار پروژه می تواند به صورت زیر باشد:</p>
<pre><code class="hljs">docker-demo/
├── Dockerfile
├── package.json
└── server.js
</code></pre>
<p dir="rtl" lang="fa">محتوای فایل <code>server.js</code>:</p>
<pre><code class="hljs"><span class="hljs-keyword">const</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">"http"</span>);

<span class="hljs-keyword">const</span> server = http.<span class="hljs-title function_">createServer</span>(<span class="hljs-function">(<span class="hljs-params">request, response</span>) =&gt;</span> {
  response.<span class="hljs-title function_">writeHead</span>(<span class="hljs-number">200</span>, { <span class="hljs-string">"Content-Type"</span>: <span class="hljs-string">"text/plain; charset=utf-8"</span> });
  response.<span class="hljs-title function_">end</span>(<span class="hljs-string">"Hello from Docker"</span>);
});

server.<span class="hljs-title function_">listen</span>(<span class="hljs-number">3000</span>, <span class="hljs-string">"0.0.0.0"</span>, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"Server is running on port 3000"</span>);
});
</code></pre>
<p dir="rtl" lang="fa">محتوای فایل <code>package.json</code>:</p>
<pre><code class="hljs"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"docker-demo"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"version"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"1.0.0"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"scripts"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"start"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"node server.js"</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre>
<p dir="rtl" lang="fa">اکنون یک فایل بدون پسوند با نام <code>Dockerfile</code> ایجاد کنید:</p>
<pre><code class="hljs"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">22</span>-alpine

<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>

<span class="hljs-keyword">COPY</span><span class="language-bash"> package*.json ./</span>

<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>

<span class="hljs-keyword">EXPOSE</span> <span class="hljs-number">3000</span>

<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">"npm"</span>, <span class="hljs-string">"start"</span>]</span>
</code></pre>
<p dir="rtl" lang="fa">هر دستور وظیفه مشخصی دارد:</p>
<ul dir="rtl" lang="fa">
<li><code>FROM</code>: تعیین Image پایه</li>
<li><code>WORKDIR</code>: مشخص کردن مسیر کاری داخل Image</li>
<li><code>COPY</code>: کپی کردن فایل ها به Image</li>
<li><code>EXPOSE</code>: مستند کردن پورت مورد استفاده برنامه</li>
<li><code>CMD</code>: تعیین فرمان پیش فرض هنگام اجرای Container</li>
</ul>
<h2 dir="rtl" lang="fa">ساخت Image اختصاصی</h2>
<p dir="rtl" lang="fa">در مسیر پروژه دستور زیر را اجرا کنید:</p>
<pre><code class="hljs">docker build -t docker-demo:1.0 .
</code></pre>
<p dir="rtl" lang="fa">گزینه <code>-t</code> نام و برچسب Image را تعیین می کند. نقطه انتهای دستور نیز نشان می دهد که Docker باید فایل های مورد نیاز را از مسیر فعلی دریافت کند.</p>
<p dir="rtl" lang="fa">بعد از پایان ساخت، Image را اجرا کنید:</p>
<pre><code class="hljs">docker run -d --name docker-demo-app -p 3000:3000 docker-demo:1.0
</code></pre>
<p dir="rtl" lang="fa">اکنون برنامه از آدرس زیر در دسترس است:</p>
<pre><code class="hljs">http://localhost:3000
</code></pre>
<h2 dir="rtl" lang="fa">استفاده از فایل .dockerignore</h2>
<p dir="rtl" lang="fa">هنگام ساخت Image لازم نیست تمام فایل های پروژه به Docker ارسال شوند. فایل هایی مانند پوشه وابستگی ها، اطلاعات Git، گزارش ها و فایل های موقت می توانند فرآیند ساخت را کند کنند یا حجم Image را افزایش دهند.</p>
<p dir="rtl" lang="fa">برای پروژه Node.js یک فایل <code>.dockerignore</code> با محتوای زیر بسازید:</p>
<pre><code class="hljs">node_modules
npm-debug.log
.git
.gitignore
.env
</code></pre>
<p dir="rtl" lang="fa">فایل های حساس مانند <code>.env</code> نباید بدون دلیل داخل Image کپی شوند. اطلاعات محرمانه باید از روش های امن مدیریت متغیرهای محیطی و Secretها در اختیار برنامه قرار بگیرند.</p>
<h2 dir="rtl" lang="fa">مدیریت داده ها با Docker Volume</h2>
<p dir="rtl" lang="fa">اگر یک Container پایگاه داده را حذف کنید، نباید اطلاعات اصلی برنامه نیز حذف شوند. Volume راهکار پیشنهادی Docker برای نگهداری پایدار داده ها است.</p>
<p dir="rtl" lang="fa">برای ساخت Volume از دستور زیر استفاده کنید:</p>
<pre><code class="hljs">docker volume create app-data
</code></pre>
<p dir="rtl" lang="fa">فهرست Volumeها را مشاهده کنید:</p>
<pre><code class="hljs">docker volume <span class="hljs-built_in">ls</span>
</code></pre>
<p dir="rtl" lang="fa">سپس Volume را هنگام اجرای Container متصل کنید:</p>
<pre><code class="hljs">docker run -d \
  --name my-nginx \
  -p 8080:80 \
  -v app-data:/usr/share/nginx/html \
  nginx
</code></pre>
<p dir="rtl" lang="fa">برای مشاهده اطلاعات کامل Volume نیز می توانید دستور زیر را اجرا کنید:</p>
<pre><code class="hljs">docker volume inspect app-data
</code></pre>
<p dir="rtl" lang="fa">جزئیات بیشتر درباره روش های ذخیره سازی در <a href="https://docs.docker.com/engine/storage/volumes/" target="_blank" rel="nofollow noopener noreferrer">مستندات رسمی Docker Volume</a> در دسترس است.</p>
<h2 dir="rtl" lang="fa">تفاوت Volume و Bind Mount</h2>
<p dir="rtl" lang="fa">در Bind Mount یک مسیر مشخص از سیستم میزبان مستقیما به Container متصل می شود. این روش در محیط توسعه مفید است؛ زیرا تغییر فایل های پروژه بلافاصله داخل Container دیده می شود.</p>
<p dir="rtl" lang="fa">نمونه اتصال پوشه فعلی به Nginx:</p>
<pre><code class="hljs">docker run -d \
  --name local-web \
  -p 8080:80 \
  -v <span class="hljs-string">"<span class="hljs-subst">$(pwd)</span>"</span>:/usr/share/nginx/html:ro \
  nginx
</code></pre>
<p dir="rtl" lang="fa">در این مثال، گزینه <code>ro</code> دسترسی Container را به حالت فقط خواندنی محدود می کند.</p>
<p dir="rtl" lang="fa">به طور کلی:</p>
<ul dir="rtl" lang="fa">
<li>Volume توسط Docker مدیریت می شود و برای داده های پایدار انتخاب مناسبی است.</li>
<li>Bind Mount به مسیر مشخصی از سیستم میزبان وابسته است و بیشتر در محیط توسعه کاربرد دارد.</li>
</ul>
<h2 dir="rtl" lang="fa">شبکه در Docker چگونه کار می کند؟</h2>
<p dir="rtl" lang="fa">برای ایجاد یک شبکه اختصاصی دستور زیر را اجرا کنید:</p>
<pre><code class="hljs">docker network create app-network
</code></pre>
<p dir="rtl" lang="fa">سپس می توانید Containerها را روی همان شبکه اجرا کنید:</p>
<pre><code class="hljs">docker run -d \
  --name database \
  --network app-network \
  -e POSTGRES_PASSWORD=change-this-password \
  postgres
</code></pre>
<p dir="rtl" lang="fa">Container دیگری که عضو <code>app-network</code> باشد، می تواند با استفاده از نام <code>database</code> به این سرویس متصل شود. این قابلیت نیاز به استفاده از آدرس IP ثابت برای ارتباط داخلی سرویس ها را کاهش می دهد.</p>
<p dir="rtl" lang="fa">در پروژه های واقعی نباید رمز عبور پایگاه داده را مستقیما در تاریخچه دستورات، فایل Dockerfile یا مخزن Git ثبت کنید.</p>
<h2 dir="rtl" lang="fa">Docker Compose چیست؟</h2>
<p dir="rtl" lang="fa">بسیاری از پروژه ها فقط از یک Container تشکیل نمی شوند. یک سامانه تحت وب ممکن است شامل برنامه اصلی، پایگاه داده، Redis، وب سرور و سرویس های جانبی باشد.</p>
<p dir="rtl" lang="fa">Docker Compose امکان تعریف و مدیریت چند سرویس را در یک فایل YAML فراهم می کند. به جای اجرای چند دستور طولانی، تمام سرویس ها، شبکه ها و Volumeها را در فایل <code>compose.yaml</code> مشخص می کنید.</p>
<p dir="rtl" lang="fa">برای اطلاعات تکمیلی می توانید <a href="https://docs.docker.com/compose/" target="_blank" rel="nofollow noopener noreferrer">مستندات Docker Compose</a> را مطالعه کنید.</p>
<h2 dir="rtl" lang="fa">آموزش Docker Compose با یک مثال کاربردی</h2>
<p dir="rtl" lang="fa">در مثال زیر یک برنامه Node.js در کنار پایگاه داده PostgreSQL اجرا می شود:</p>
<pre><code class="hljs"><span class="hljs-attr">services:</span>
  <span class="hljs-attr">app:</span>
    <span class="hljs-attr">build:</span> <span class="hljs-string">.</span>
    <span class="hljs-attr">container_name:</span> <span class="hljs-string">demo-app</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">"3000:3000"</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">DATABASE_HOST:</span> <span class="hljs-string">db</span>
      <span class="hljs-attr">DATABASE_PORT:</span> <span class="hljs-number">5432</span>
      <span class="hljs-attr">DATABASE_NAME:</span> <span class="hljs-string">appdb</span>
      <span class="hljs-attr">DATABASE_USER:</span> <span class="hljs-string">appuser</span>
      <span class="hljs-attr">DATABASE_PASSWORD:</span> <span class="hljs-string">${DATABASE_PASSWORD}</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-attr">db:</span>
        <span class="hljs-attr">condition:</span> <span class="hljs-string">service_healthy</span>

  <span class="hljs-attr">db:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">postgres:17-alpine</span>
    <span class="hljs-attr">container_name:</span> <span class="hljs-string">demo-db</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">POSTGRES_DB:</span> <span class="hljs-string">appdb</span>
      <span class="hljs-attr">POSTGRES_USER:</span> <span class="hljs-string">appuser</span>
      <span class="hljs-attr">POSTGRES_PASSWORD:</span> <span class="hljs-string">${DATABASE_PASSWORD}</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">postgres-data:/var/lib/postgresql/data</span>
    <span class="hljs-attr">healthcheck:</span>
      <span class="hljs-attr">test:</span> [<span class="hljs-string">"CMD-SHELL"</span>, <span class="hljs-string">"pg_isready -U appuser -d appdb"</span>]
      <span class="hljs-attr">interval:</span> <span class="hljs-string">5s</span>
      <span class="hljs-attr">timeout:</span> <span class="hljs-string">5s</span>
      <span class="hljs-attr">retries:</span> <span class="hljs-number">10</span>

<span class="hljs-attr">volumes:</span>
  <span class="hljs-attr">postgres-data:</span>
</code></pre>
<p dir="rtl" lang="fa">رمز عبور را در فایل <code>.env</code> قرار دهید:</p>
<pre><code class="hljs">DATABASE_PASSWORD=replace-with-a-strong-password
</code></pre>
<p dir="rtl" lang="fa">فایل <code>.env</code> را به <code>.gitignore</code> اضافه کنید تا اطلاعات حساس وارد مخزن Git نشوند.</p>
<p dir="rtl" lang="fa">برای ساخت و اجرای سرویس ها از دستور زیر استفاده کنید:</p>
<pre><code class="hljs">docker compose up -d --build
</code></pre>
<p dir="rtl" lang="fa">برای مشاهده وضعیت سرویس ها:</p>
<pre><code class="hljs">docker compose ps
</code></pre>
<p dir="rtl" lang="fa">برای مشاهده گزارش ها:</p>
<pre><code class="hljs">docker compose logs -f
</code></pre>
<p dir="rtl" lang="fa">برای توقف و حذف Containerها و شبکه ایجاد شده:</p>
<pre><code class="hljs">docker compose down
</code></pre>
<p dir="rtl" lang="fa">دستور بالا Volume را حذف نمی کند. اگر قصد حذف Volume و داده های آن را دارید، می توانید از دستور زیر استفاده کنید:</p>
<pre><code class="hljs">docker compose down -v
</code></pre>
<p dir="rtl" lang="fa">این دستور اطلاعات ذخیره شده در Volumeهای پروژه را پاک می کند؛ بنابراین باید با دقت اجرا شود.</p>
<p dir="rtl" lang="fa">یک نمونه کامل تر نیز در <a href="https://docs.docker.com/compose/gettingstarted/" target="_blank" rel="nofollow noopener noreferrer">راهنمای شروع سریع Docker Compose</a> ارائه شده است.</p>
<h2 dir="rtl" lang="fa">بهترین روش ها برای نوشتن Dockerfile</h2>
<p dir="rtl" lang="fa">یک Dockerfile نامناسب ممکن است Image بسیار حجیم، ناامن یا کند تولید کند. رعایت نکات زیر کیفیت خروجی را بهتر می کند.</p>
<h3 dir="rtl" lang="fa">از Image پایه مناسب استفاده کنید</h3>
<p dir="rtl" lang="fa">Imageهای سبک مانند نسخه های Alpine یا Slim در بعضی پروژه ها حجم نهایی را کاهش می دهند. با این حال، کوچک ترین Image همیشه بهترین انتخاب نیست. سازگاری کتابخانه ها، ابزارهای عیب یابی و نیازهای امنیتی را نیز بررسی کنید.</p>
<h3 dir="rtl" lang="fa">ترتیب دستورها را بهینه کنید</h3>
<p dir="rtl" lang="fa">Docker برای افزایش سرعت ساخت از کش لایه ها استفاده می کند. فایل هایی که کمتر تغییر می کنند باید قبل از کدهای اصلی کپی شوند.</p>
<p dir="rtl" lang="fa">برای نمونه، بهتر است ابتدا فایل وابستگی ها کپی و نصب شود و سپس کد برنامه داخل Image قرار بگیرد. در این حالت، تغییر یک فایل کد باعث نصب دوباره تمام وابستگی ها نمی شود.</p>
<h3 dir="rtl" lang="fa">نسخه Imageها را مشخص کنید</h3>
<p dir="rtl" lang="fa">استفاده بدون بررسی از برچسب <code>latest</code> می تواند نتیجه ساخت را در زمان های مختلف تغییر دهد. بهتر است نسخه مشخص و متناسب با پروژه را انتخاب کنید:</p>
<pre><code class="hljs"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">22</span>-alpine
</code></pre>
<h3 dir="rtl" lang="fa">برنامه را با کاربر root اجرا نکنید</h3>
<p dir="rtl" lang="fa">در محیط عملیاتی بهتر است یک کاربر با دسترسی محدود بسازید و برنامه را با همان کاربر اجرا کنید. این کار بخشی از ریسک های امنیتی را کاهش می دهد.</p>
<h3 dir="rtl" lang="fa">اطلاعات حساس را وارد Image نکنید</h3>
<p dir="rtl" lang="fa">رمز عبور، کلید API، گواهی خصوصی و فایل های تنظیمات حساس نباید داخل Dockerfile یا لایه های Image قرار بگیرند. حذف یک Secret در دستور بعدی نیز لزوما آن را از لایه قبلی پاک نمی کند.</p>
<h3 dir="rtl" lang="fa">از Multi-stage Build استفاده کنید</h3>
<p dir="rtl" lang="fa">Multi-stage Build اجازه می دهد ابزارهای ساخت را از Image نهایی جدا کنید. این روش به ویژه برای پروژه های Go، Java، .NET و برنامه های فرانت اند مفید است.</p>
<p dir="rtl" lang="fa">نمونه ساده برای یک پروژه فرانت اند:</p>
<pre><code class="hljs"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">22</span>-alpine AS builder

<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> package*.json ./</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm ci</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm run build</span>

<span class="hljs-keyword">FROM</span> nginx:alpine
<span class="hljs-keyword">COPY</span><span class="language-bash"> --from=builder /app/dist /usr/share/nginx/html</span>
<span class="hljs-keyword">EXPOSE</span> <span class="hljs-number">80</span>
</code></pre>
<p dir="rtl" lang="fa">در مرحله اول پروژه ساخته می شود و در مرحله دوم فقط فایل های خروجی وارد Image نهایی می شوند.</p>
<h2 dir="rtl" lang="fa">خطاهای رایج هنگام کار با Docker</h2>
<h3 dir="rtl" lang="fa">Container بلافاصله متوقف می شود</h3>
<p dir="rtl" lang="fa">Container تا زمانی فعال می ماند که فرآیند اصلی آن در حال اجرا باشد. برای بررسی علت توقف از دستور زیر استفاده کنید:</p>
<pre><code class="hljs">docker logs container-name
</code></pre>
<p dir="rtl" lang="fa">همچنین مقدار <code>CMD</code> یا <code>ENTRYPOINT</code> را در Dockerfile بررسی کنید.</p>
<h3 dir="rtl" lang="fa">پورت برنامه در دسترس نیست</h3>
<p dir="rtl" lang="fa">موارد زیر را کنترل کنید:</p>
<ul dir="rtl" lang="fa">
<li>اتصال پورت با گزینه <code>-p</code> انجام شده باشد.</li>
<li>برنامه داخل Container روی <code>0.0.0.0</code> گوش دهد، نه فقط <code>localhost</code>.</li>
<li>پورت مورد نظر توسط برنامه دیگری اشغال نشده باشد.</li>
<li>دیوار آتش یا تنظیمات شبکه مانع اتصال نباشد.</li>
</ul>
<h3 dir="rtl" lang="fa">تغییرات کد در Container دیده نمی شود</h3>
<p dir="rtl" lang="fa">اگر Image را از روی کد ساخته اید، بعد از تغییر کد باید Image دوباره ساخته شود:</p>
<pre><code class="hljs">docker compose up -d --build
</code></pre>
<p dir="rtl" lang="fa">در محیط توسعه می توانید از Bind Mount یا قابلیت های مخصوص توسعه Compose استفاده کنید.</p>
<h3 dir="rtl" lang="fa">نام سرویس پایگاه داده اشتباه است</h3>
<p dir="rtl" lang="fa">در Docker Compose، برنامه معمولا باید با نام سرویس به پایگاه داده متصل شود. اگر نام سرویس <code>db</code> است، مقدار میزبان پایگاه داده نیز باید <code>db</code> باشد، نه <code>localhost</code>.</p>
<h3 dir="rtl" lang="fa">فضای ذخیره سازی Docker پر شده است</h3>
<p dir="rtl" lang="fa">Imageها، Containerهای متوقف شده و کش ساخت می توانند فضای زیادی مصرف کنند. ابتدا میزان مصرف را بررسی کنید:</p>
<pre><code class="hljs">docker system <span class="hljs-built_in">df</span>
</code></pre>
<p dir="rtl" lang="fa">برای پاک سازی منابع بدون استفاده می توان از دستورهای <code>docker container prune</code>، <code>docker image prune</code> و <code>docker builder prune</code> استفاده کرد. پیش از پاک سازی، مطمئن شوید داده یا منبع مورد نیاز پروژه حذف نمی شود.</p>
<h2 dir="rtl" lang="fa">کاربرد Docker در پروژه های طراحی سایت و نرم افزار</h2>
<p dir="rtl" lang="fa">داکر فقط یک ابزار مخصوص مدیران سرور نیست. تیم های طراحی سایت و توسعه نرم افزار می توانند از آن در مراحل مختلف پروژه استفاده کنند.</p>
<p dir="rtl" lang="fa">برخی از کاربردهای مهم عبارت هستند از:</p>
<ul dir="rtl" lang="fa">
<li>ساخت محیط توسعه یکسان برای اعضای تیم</li>
<li>اجرای نسخه مشخص PHP، Node.js، Python یا .NET</li>
<li>راه اندازی سریع MySQL، PostgreSQL، Redis و Elasticsearch</li>
<li>آزمایش پروژه در نسخه های مختلف پایگاه داده</li>
<li>اجرای تست های خودکار در فرآیند CI/CD</li>
<li>آماده سازی نسخه آزمایشی برای کارفرما</li>
<li>استقرار کنترل شده برنامه روی سرور</li>
<li>جداسازی پروژه های مختلف روی یک سیستم توسعه</li>
<li>ساده کردن فرآیند ورود اعضای جدید به تیم</li>
</ul>
<p dir="rtl" lang="fa">برای مثال، یک تیم طراحی سایت می تواند WordPress، MySQL و ابزار مدیریت پایگاه داده را در یک فایل Compose تعریف کند. در نتیجه، راه اندازی محیط پروژه برای عضو جدید تیم به جای چند ساعت تنظیم دستی، با چند دستور مشخص انجام می شود.</p>
<h2 dir="rtl" lang="fa">آیا Docker برای محیط عملیاتی مناسب است؟</h2>
<p dir="rtl" lang="fa">Docker می تواند در محیط عملیاتی استفاده شود، اما نصب داکر به تنهایی یک زیرساخت پایدار و امن ایجاد نمی کند. برای استفاده حرفه ای باید موضوعات زیر نیز بررسی شوند:</p>
<ul dir="rtl" lang="fa">
<li>امنیت Imageها و بررسی آسیب پذیری ها</li>
<li>مدیریت Secretها و اطلاعات حساس</li>
<li>ثبت و نگهداری گزارش ها</li>
<li>تهیه نسخه پشتیبان از داده ها</li>
<li>مانیتورینگ مصرف منابع و سلامت سرویس ها</li>
<li>محدود کردن دسترسی Containerها</li>
<li>مدیریت شبکه و گواهی SSL</li>
<li>تعیین سیاست راه اندازی مجدد</li>
<li>انتشار نسخه های مشخص و امکان بازگشت</li>
<li>به روز رسانی منظم Imageهای پایه</li>
</ul>
<p dir="rtl" lang="fa">در پروژه های بزرگ، ابزارهایی مانند Kubernetes برای مدیریت تعداد زیادی Container استفاده می شوند. با این حال، Docker Compose برای بسیاری از محیط های توسعه، آزمایش و پروژه های کوچک یا متوسط گزینه ساده و کاربردی است.</p>
<h2 dir="rtl" lang="fa">مسیر پیشنهادی یادگیری داکر</h2>
<p dir="rtl" lang="fa">برای یادگیری موثر Docker بهتر است فقط دستورات را حفظ نکنید. یک پروژه واقعی انتخاب کنید و مراحل زیر را انجام دهید:</p>
<ol dir="rtl" lang="fa">
<li>نصب Docker و اجرای <code>hello-world</code></li>
<li>اجرای یک Container آماده مانند Nginx</li>
<li>یادگیری مدیریت Image و Container</li>
<li>ساخت Dockerfile برای یک برنامه ساده</li>
<li>اتصال Volume و Bind Mount</li>
<li>ایجاد شبکه اختصاصی میان دو Container</li>
<li>اجرای برنامه و پایگاه داده با Docker Compose</li>
<li>مدیریت متغیرهای محیطی و اطلاعات حساس</li>
<li>بهینه کردن حجم و امنیت Image</li>
<li>استفاده از Docker در فرآیند آزمایش و استقرار</li>
</ol>
<p dir="rtl" lang="fa">پس از تسلط بر این موارد، می توانید مفاهیمی مانند Registry خصوصی، Multi-stage Build، Health Check، Docker Buildx، CI/CD و ابزارهای مدیریت Container را دنبال کنید.</p>
<h2 dir="rtl" lang="fa">جمع بندی آموزش داکر</h2>
<p dir="rtl" lang="fa">در این آموزش داکر با مفاهیم Image، Container، Dockerfile، Volume، Network و Docker Compose آشنا شدیم. همچنین نحوه نصب Docker، اجرای اولین Container، ساخت Image اختصاصی و راه اندازی چند سرویس را بررسی کردیم.</p>
<p dir="rtl" lang="fa">Docker زمانی بیشترین ارزش را ایجاد می کند که تنظیمات پروژه به شکل شفاف، قابل تکرار و تحت کنترل نسخه باشند. استفاده اصولی از این ابزار می تواند همکاری تیمی را ساده تر کند، خطاهای ناشی از تفاوت محیط ها را کاهش دهد و فرآیند توسعه و استقرار نرم افزار را منظم تر سازد.</p>
<p dir="rtl" lang="fa">اگر برای طراحی سایت، توسعه نرم افزار یا آماده سازی زیرساخت فنی پروژه خود به مشاوره و اجرای تخصصی نیاز دارید، از طریق صفحه <a href="https://tarahanenovin.ir/site/contact" target="_blank" rel="nofollow noopener noreferrer">تماس با طراحان نوین</a> با کارشناسان مجموعه در ارتباط باشید.</p>
<p>نوشته <a href="https://tarahanenovin.ir/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-docker-%d8%a7%d8%b2-%d8%b5%d9%81%d8%b1-%d8%aa%d8%a7-%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%be%d8%b1%d9%88%da%98%d9%87-%d9%88%d8%a7%d9%82%d8%b9%db%8c-%d8%a8/">آموزش Docker از صفر تا اجرای پروژه واقعی با داکر</a> اولین بار در <a href="https://tarahanenovin.ir/blog">نوین هاب</a>. پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tarahanenovin.ir/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-docker-%d8%a7%d8%b2-%d8%b5%d9%81%d8%b1-%d8%aa%d8%a7-%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%be%d8%b1%d9%88%da%98%d9%87-%d9%88%d8%a7%d9%82%d8%b9%db%8c-%d8%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
