{"id":27306274,"url":"https://github.com/notesparvvaresh/docker","last_synced_at":"2025-04-12T03:59:18.038Z","repository":{"id":287336205,"uuid":"964056996","full_name":"notesparvvaresh/docker","owner":"notesparvvaresh","description":"Docker explained and a simple project","archived":false,"fork":false,"pushed_at":"2025-04-11T06:42:53.000Z","size":5,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-12T03:59:11.777Z","etag":null,"topics":["docker","docker-images"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/notesparvvaresh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-10T16:12:00.000Z","updated_at":"2025-04-11T06:42:56.000Z","dependencies_parsed_at":"2025-04-11T08:56:15.040Z","dependency_job_id":"9fb14ea2-9a54-4f02-af83-aee560bea37d","html_url":"https://github.com/notesparvvaresh/docker","commit_stats":null,"previous_names":["notesparvvaresh/docker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2Fdocker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2Fdocker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2Fdocker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2Fdocker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/notesparvvaresh","download_url":"https://codeload.github.com/notesparvvaresh/docker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248514201,"owners_count":21116900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-images"],"created_at":"2025-04-12T03:59:16.634Z","updated_at":"2025-04-12T03:59:18.011Z","avatar_url":"https://github.com/notesparvvaresh.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"### کانتینرها و ایمیج‌های Docker: یک مرور کلی\n\n#### ۱. **ایمیج Docker**\n**ایمیج Docker** به عنوان یک قالب (template) فقط خواندنی برای ایجاد کانتینرها استفاده می‌شود. این ایمیج شامل تمامی اجزایی است که برای اجرای یک نرم‌افزار لازم است، مانند:\n\n- **برنامه اصلی:** خود نرم‌افزار یا اپلیکیشن مورد نظر.\n- **محیط اجرایی:** مانند پایتون، جاوا یا هر زبان دیگری.\n- **کتابخانه‌ها و وابستگی‌ها:** تمامی پکیج‌ها و ابزارهای مورد نیاز.\n- **متغیرهای محیطی:** تنظیماتی که بر رفتار برنامه تأثیر دارند.\n- **فایل‌های پیکربندی:** تنظیمات مورد نیاز برای اجرای نرم‌افزار.\n\nایمیج Docker از روی یک **Dockerfile** ساخته می‌شود که دستورات لازم برای راه‌اندازی محیط و نصب اجزای مورد نیاز را مشخص می‌کند.\n\n**نکات مهم درباره ایمیج‌های Docker:**\n- **فقط خواندنی:** پس از ایجاد، ایمیج‌های Docker قابل تغییر نیستند. تغییراتی که در یک کانتینر در حال اجرا (مثل نصب پکیج جدید) اعمال می‌شود، در ایمیج اصلی ثبت نخواهد شد.\n- **ساختار لایه‌ای:** هر ایمیج از چندین لایه تشکیل شده‌است که هر کدام نمایانگر یک دستور در Dockerfile (مانند `RUN`، `COPY`، `ADD` و ...) هستند. این لایه‌ها به‌منظور بهینه‌سازی فرایند ساخت (build) در حافظه کش نگهداری می‌شوند.\n- **قابل حمل:** ایمیج‌های Docker مستقل از سیستم عامل میزبان بوده و می‌توانند روی هر سیستمی که Docker نصب شده باشد اجرا شوند.\n\n**مثال یک Dockerfile:**\n```Dockerfile\n# استفاده از یک ایمیج پایه\nFROM ubuntu:20.04\n\n# نصب پکیج‌های مورد نیاز\nRUN apt-get update \u0026\u0026 apt-get install -y python3 python3-pip\n\n# کپی کردن فایل‌های برنامه به داخل کانتینر\nCOPY . /app\n\n# تنظیم دایرکتوری کاری\nWORKDIR /app\n\n# نصب وابستگی‌های پایتون\nRUN pip3 install -r requirements.txt\n\n# باز کردن پورت مورد نیاز\nEXPOSE 5000\n\n# دستور اجرای برنامه\nCMD [\"python3\", \"app.py\"]\n```\n\n#### ۲. **کانتینر Docker**\n**کانتینر Docker** نمونه اجرایی (runtime instance) یک ایمیج Docker است. وقتی یک ایمیج اجرا شود، به یک کانتینر تبدیل می‌شود. کانتینرها محیط‌های ایزوله‌ای هستند که برنامه‌ها را به شیوه‌ای یکپارچه بدون توجه به تفاوت‌های میزبان اجرا می‌کنند.\n\n**نکات کلیدی درباره کانتینرهای Docker:**\n- **لایه قابل نوشتن:** در حالی که ایمیج‌ها فقط خواندنی هستند، کانتینرها یک لایه قابل نوشتن بر روی ایمیج به آنها اضافه می‌کنند. تغییراتی که در حین اجرای کانتینر (مانند تغییر فایل‌ها یا نصب نرم‌افزار) انجام می‌شود، در همین لایه ذخیره می‌گردد.\n- **محیط ایزوله:** کانتینرها در محیط‌های جداگانه از یکدیگر و از میزبان اجرا می‌شوند، به طوری که از تداخل میان برنامه‌ها جلوگیری می‌شود.\n- **موقتی بودن:** کانتینرها معمولاً زودگذر هستند؛ پس از توقف یا حذف کانتینر، تغییرات ایجاد شده در آن از بین می‌رود مگر اینکه به روش‌های دیگری مانند استفاده از volumes یا commit ذخیره شوند.\n\n**اجرای یک کانتینر:**\nبرای اجرای یک کانتینر از یک ایمیج، از دستور `docker run` استفاده می‌شود. در این فرآیند، Docker ایمیج را گرفته و کانتینر جدیدی از آن ایجاد می‌کند که فرمان یا پردازه تعیین‌شده (مثلاً راه‌اندازی سرور یا اجرای اپلیکیشن) را اجرا می‌کند.\n\nمثال:\n```bash\ndocker run -d -p 5000:5000 my-image\n```\nاین دستور کانتینر را در حالت detached (`-d`) اجرا کرده و پورت 5000 میزبان را به پورت 5000 داخل کانتینر متصل می‌کند.\n\n#### ۳. **ارتباط بین ایمیج‌ها و کانتینرها**\n\n- **ایمیج‌ها به عنوان نقشه‌ی راه (blueprint):** ایمیج‌ها مشخصات دقیق نحوه ایجاد یک کانتینر را تعیین می‌کنند.\n- **کانتینرها به عنوان نمونه‌های اجرایی:** یک کانتینر یک نمونه (instance) از یک ایمیج است که می‌تواند در طول زمان تغییراتی داشته باشد.\n- **تعداد کانتینرهای متعدد از یک ایمیج:** می‌توان چندین کانتینر را از یک ایمیج ایجاد کرد.\n- **پایداری ایمیج‌ها:** حذف یا توقف یک کانتینر تاثیری بر ایمیج اصلی ندارد؛ کانتینر می‌تواند مجدداً از همان ایمیج ساخته شود.\n\n#### ۴. **مراحل کاری معمول با Docker**\n\n1. **ایجاد یک ایمیج:** ابتدا یک ایمیج از طریق Dockerfile ساخته می‌شود.\n2. **اجرای یک کانتینر:** سپس از دستور `docker run` برای ایجاد و اجرای کانتینر از ایمیج استفاده می‌شود.\n3. **اعمال تغییرات (اختیاری):** تغییراتی که در داخل کانتینر انجام می‌شود (مانند نصب پکیج یا تغییر فایل‌ها)، تنها به همان کانتینر مربوط می‌شود مگر اینکه به ایمیج جدید commit شود.\n4. **توقف کانتینر:** پس از پایان کار، کانتینر متوقف می‌شود. البته در صورت نیاز می‌توان آن را دوباره اجرا کرد اما تغییرات اعمال‌شده در حین اجرا به صورت خودکار ذخیره نخواهد شد.\n5. **حذف کانتینر:** در صورت عدم نیاز به کانتینر، می‌توان آن را حذف کرد؛ در این صورت ایمیج اصلی بدون تغییر باقی می‌ماند.\n\n#### ۵. **مقایسه کلیدی بین ایمیج و کانتینر**\n\n| ویژگی                  | ایمیج Docker                                    | کانتینر Docker                             |\n|------------------------|-------------------------------------------------|--------------------------------------------|\n| **ماهیت**             | قالب تنها خواندنی                             | نمونه اجرایی قابل نوشتن                    |\n| **حالت**              | تغییرناپذیر                                     | قابل تغییر در زمان اجرا                    |\n| **کاربرد**            | تعریف نحوه ایجاد کانتینر                     | محیط اجرای برنامه                          |\n| **چرخه حیات**         | امکان به اشتراک‌گذاری، نسخه‌بندی، و استفاده مجدد | ایجاد، اجرا، توقف و حذف                    |\n\n#### ۶. **دستورات کلیدی Docker**\n\n- **ساخت ایمیج:**\n  ```bash\n  docker build -t my-image .\n  ```\n- **اجرای کانتینر از ایمیج:**\n  ```bash\n  docker run my-image\n  ```\n- **لیست تمامی کانتینر‌ها:**\n  ```bash\n  docker ps -a\n  ```\n- **توقف کانتینر:**\n  ```bash\n  docker stop \u003ccontainer_id\u003e\n  ```\n- **حذف کانتینر:**\n  ```bash\n  docker rm \u003ccontainer_id\u003e\n  ```\n- **حذف ایمیج:**\n  ```bash\n  docker rmi \u003cimage_id\u003e\n  ```\n\n#### ۷. **Volumes Docker و حفظ داده‌ها**\nبا توجه به اینکه کانتینرها به صورت موقتی هستند و تغییرات در لایه قابل نوشتن ذخیره می‌شوند، استفاده از **Volumes** در Docker امکان ذخیره‌سازی داده‌ها به صورت دائمی را فراهم می‌کند. این Volume ها در یک دایرکتوری مشخص در میزبان ذخیره می‌شوند و می‌توانند میان کانتینرهای مختلف به اشتراک گذاشته شوند. این ویژگی تضمین می‌کند که داده‌ها حتی پس از حذف کانتینر باقی بمانند.\n\n---\n\n### راهنمای نصب پکیج یا ویرایش فایل‌ها در کانتینر در حال اجرا\n\n#### ۱. **یافتن شناسه یا نام کانتینر:**\nابتدا باید شناسه یا نام کانتینر مدنظر را بدانید. برای مشاهده لیست کانتینرهای در حال اجرا، از دستور زیر استفاده کنید:\n```bash\ndocker ps\n```\nاین دستور اطلاعاتی همچون `CONTAINER ID` و `NAMES` کانتینرهای در حال اجرا را نمایش می‌دهد.\n\n#### ۲. **ورود به داخل کانتینر با استفاده از `docker exec`:**\nبا استفاده از دستور `docker exec` می‌توانید وارد کانتینر شده و تغییرات لازم را اعمال کنید. برای شروع یک شِل (مثلاً `bash` یا `sh`)، دستور زیر را اجرا کنید:\n```bash\ndocker exec -it \u003ccontainer_id_or_name\u003e bash\n```\nاگر کانتینر از شِل `bash` پشتیبانی نمی‌کند، می‌توانید از `sh` استفاده کنید:\n```bash\ndocker exec -it \u003ccontainer_id_or_name\u003e sh\n```\nپس از اجرای این دستور، به خط فرمان داخل کانتینر دسترسی پیدا کرده و می‌توانید تغییرات مد نظر را اعمال کنید.\n\n#### ۳. **نصب پکیج یا ویرایش فایل در داخل کانتینر:**\n\n- **نصب پکیج:**  \n  در صورتی که کانتینر مبتنی بر اوبونتو یا دبیان باشد، می‌توانید پکیج مورد نیاز را با دستور زیر نصب کنید:\n  ```bash\n  apt-get update \u0026\u0026 apt-get install -y \u003cpackage_name\u003e\n  ```\n  اگر کانتینر بر پایه Alpine باشد، از مدیریت پکیج `apk` استفاده کنید:\n  ```bash\n  apk add --no-cache \u003cpackage_name\u003e\n  ```\n\n- **ویرایش فایل:**  \n  برای ویرایش فایل‌ها می‌توانید از ویرایشگرهایی مانند `nano` یا `vi` استفاده کنید. در صورتی که این ویرایشگرها نصب نباشند، می‌توانید با استفاده از دستور `echo` محتویات جدید را به فایل اضافه یا جایگزین کنید:\n  ```bash\n  echo \"متن جدید\" \u003e /path/to/file.txt\n  ```\n\n#### ۴. **خروج از کانتینر:**\nپس از اعمال تغییرات، با استفاده از دستور:\n```bash\nexit\n```\nاز کانتینر خارج شوید.\n\n---\n\n### مثال‌های عملی\n\n#### **الف) نصب یک پکیج (مثلاً `curl`) در داخل کانتینر:**\n\n1. ورود به کانتینر:\n   ```bash\n   docker exec -it my-container bash\n   ```\n2. نصب پکیج:\n   ```bash\n   apt-get update \u0026\u0026 apt-get install -y curl\n   ```\n3. خروج از کانتینر:\n   ```bash\n   exit\n   ```\n\n#### **ب) تغییر یا افزودن محتوا به یک فایل در داخل کانتینر:**\n\n1. ورود به کانتینر:\n   ```bash\n   docker exec -it my-container bash\n   ```\n2. افزودن محتوا به فایل (مثلاً `/app/log.txt`):\n   ```bash\n   echo \"این یک ورودی لاگ است\" \u003e\u003e /app/log.txt\n   ```\n3. خروج از کانتینر:\n   ```bash\n   exit\n   ```\n\n#### **توضیحات تکمیلی:**\n\n- **استفاده از `docker commit`:**  \n  اگر بخواهید تغییرات موقت داخل کانتینر (مثلاً نصب یک پکیج) را به صورت دائمی ذخیره کنید، می‌توانید از دستور `docker commit` برای ایجاد یک ایمیج جدید از کانتینر تغییر یافته استفاده کنید:\n  ```bash\n  docker commit \u003ccontainer_id\u003e \u003cnew_image_name\u003e\n  ```\n\n- **توضیح بیشتر درباره تغییرات موقتی:**  \n  تغییراتی که با دستور `docker exec` اعمال می‌شوند تنها در لایه قابل نوشتن کانتینر ذخیره می‌شوند و در صورت حذف کانتینر از بین می‌روند. برای حفظ تغییرات باید آن‌ها را به یک ایمیج جدید commit کنید یا داده‌ها را در یک volume ذخیره کنید.\n\n- **ابزارهای تکمیلی:**  \n  در پروژه‌های پیچیده می‌توان از ابزارهایی مانند **Docker Compose** برای مدیریت چندین کانتینر با هم استفاده کرد. Docker Compose امکان تعریف سرویس‌ها، شبکه‌بندی و volumeها در یک فایل YAML را فراهم می‌کند و مدیریت پروژه‌های چند کانتینری را ساده‌تر می‌کند.\n\n---\n\n### خلاصه نهایی\n\n- **ایمیج Docker:** قالب فقط خواندنی شامل تمامی اجزای لازم جهت اجرای برنامه (شامل کد، محیط اجرایی، کتابخانه‌ها، متغیرهای محیطی و پیکربندی‌ها) است.\n- **کانتینر Docker:** نمونه اجرایی ایمیج که یک محیط ایزوله و قابل تغییر در زمان اجرا فراهم می‌کند.\n- **رویه کار معمول:** ساخت ایمیج از Dockerfile → اجرای کانتینر از ایمیج → اعمال تغییرات (اختیاری) → توقف یا حذف کانتینر.\n- **نگه‌داشت داده‌ها:** استفاده از Docker Volumes برای حفظ داده‌ها حتی پس از حذف کانتینر توصیه می‌شود.\n- **ابزارهای مدیریتی:** دستورات اصلی Docker و همچنین ابزارهایی مانند Docker Compose برای مدیریت پروژه‌های پیچیده در دسترس هستند.\n\nاین ترجمه جامع و روان به شما کمک می‌کند تا مفاهیم کلیدی و عملیات‌های اساسی مربوط به Docker Image و Container را به‌خوبی درک کنید.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotesparvvaresh%2Fdocker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotesparvvaresh%2Fdocker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotesparvvaresh%2Fdocker/lists"}