https://github.com/notesparvvaresh/docker
Docker explained and a simple project
https://github.com/notesparvvaresh/docker
docker docker-images
Last synced: about 1 year ago
JSON representation
Docker explained and a simple project
- Host: GitHub
- URL: https://github.com/notesparvvaresh/docker
- Owner: notesparvvaresh
- Created: 2025-04-10T16:12:00.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-04-11T06:42:53.000Z (about 1 year ago)
- Last Synced: 2025-04-12T03:59:11.777Z (about 1 year ago)
- Topics: docker, docker-images
- Homepage:
- Size: 4.88 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
### کانتینرها و ایمیجهای Docker: یک مرور کلی
#### ۱. **ایمیج Docker**
**ایمیج Docker** به عنوان یک قالب (template) فقط خواندنی برای ایجاد کانتینرها استفاده میشود. این ایمیج شامل تمامی اجزایی است که برای اجرای یک نرمافزار لازم است، مانند:
- **برنامه اصلی:** خود نرمافزار یا اپلیکیشن مورد نظر.
- **محیط اجرایی:** مانند پایتون، جاوا یا هر زبان دیگری.
- **کتابخانهها و وابستگیها:** تمامی پکیجها و ابزارهای مورد نیاز.
- **متغیرهای محیطی:** تنظیماتی که بر رفتار برنامه تأثیر دارند.
- **فایلهای پیکربندی:** تنظیمات مورد نیاز برای اجرای نرمافزار.
ایمیج Docker از روی یک **Dockerfile** ساخته میشود که دستورات لازم برای راهاندازی محیط و نصب اجزای مورد نیاز را مشخص میکند.
**نکات مهم درباره ایمیجهای Docker:**
- **فقط خواندنی:** پس از ایجاد، ایمیجهای Docker قابل تغییر نیستند. تغییراتی که در یک کانتینر در حال اجرا (مثل نصب پکیج جدید) اعمال میشود، در ایمیج اصلی ثبت نخواهد شد.
- **ساختار لایهای:** هر ایمیج از چندین لایه تشکیل شدهاست که هر کدام نمایانگر یک دستور در Dockerfile (مانند `RUN`، `COPY`، `ADD` و ...) هستند. این لایهها بهمنظور بهینهسازی فرایند ساخت (build) در حافظه کش نگهداری میشوند.
- **قابل حمل:** ایمیجهای Docker مستقل از سیستم عامل میزبان بوده و میتوانند روی هر سیستمی که Docker نصب شده باشد اجرا شوند.
**مثال یک Dockerfile:**
```Dockerfile
# استفاده از یک ایمیج پایه
FROM ubuntu:20.04
# نصب پکیجهای مورد نیاز
RUN apt-get update && apt-get install -y python3 python3-pip
# کپی کردن فایلهای برنامه به داخل کانتینر
COPY . /app
# تنظیم دایرکتوری کاری
WORKDIR /app
# نصب وابستگیهای پایتون
RUN pip3 install -r requirements.txt
# باز کردن پورت مورد نیاز
EXPOSE 5000
# دستور اجرای برنامه
CMD ["python3", "app.py"]
```
#### ۲. **کانتینر Docker**
**کانتینر Docker** نمونه اجرایی (runtime instance) یک ایمیج Docker است. وقتی یک ایمیج اجرا شود، به یک کانتینر تبدیل میشود. کانتینرها محیطهای ایزولهای هستند که برنامهها را به شیوهای یکپارچه بدون توجه به تفاوتهای میزبان اجرا میکنند.
**نکات کلیدی درباره کانتینرهای Docker:**
- **لایه قابل نوشتن:** در حالی که ایمیجها فقط خواندنی هستند، کانتینرها یک لایه قابل نوشتن بر روی ایمیج به آنها اضافه میکنند. تغییراتی که در حین اجرای کانتینر (مانند تغییر فایلها یا نصب نرمافزار) انجام میشود، در همین لایه ذخیره میگردد.
- **محیط ایزوله:** کانتینرها در محیطهای جداگانه از یکدیگر و از میزبان اجرا میشوند، به طوری که از تداخل میان برنامهها جلوگیری میشود.
- **موقتی بودن:** کانتینرها معمولاً زودگذر هستند؛ پس از توقف یا حذف کانتینر، تغییرات ایجاد شده در آن از بین میرود مگر اینکه به روشهای دیگری مانند استفاده از volumes یا commit ذخیره شوند.
**اجرای یک کانتینر:**
برای اجرای یک کانتینر از یک ایمیج، از دستور `docker run` استفاده میشود. در این فرآیند، Docker ایمیج را گرفته و کانتینر جدیدی از آن ایجاد میکند که فرمان یا پردازه تعیینشده (مثلاً راهاندازی سرور یا اجرای اپلیکیشن) را اجرا میکند.
مثال:
```bash
docker run -d -p 5000:5000 my-image
```
این دستور کانتینر را در حالت detached (`-d`) اجرا کرده و پورت 5000 میزبان را به پورت 5000 داخل کانتینر متصل میکند.
#### ۳. **ارتباط بین ایمیجها و کانتینرها**
- **ایمیجها به عنوان نقشهی راه (blueprint):** ایمیجها مشخصات دقیق نحوه ایجاد یک کانتینر را تعیین میکنند.
- **کانتینرها به عنوان نمونههای اجرایی:** یک کانتینر یک نمونه (instance) از یک ایمیج است که میتواند در طول زمان تغییراتی داشته باشد.
- **تعداد کانتینرهای متعدد از یک ایمیج:** میتوان چندین کانتینر را از یک ایمیج ایجاد کرد.
- **پایداری ایمیجها:** حذف یا توقف یک کانتینر تاثیری بر ایمیج اصلی ندارد؛ کانتینر میتواند مجدداً از همان ایمیج ساخته شود.
#### ۴. **مراحل کاری معمول با Docker**
1. **ایجاد یک ایمیج:** ابتدا یک ایمیج از طریق Dockerfile ساخته میشود.
2. **اجرای یک کانتینر:** سپس از دستور `docker run` برای ایجاد و اجرای کانتینر از ایمیج استفاده میشود.
3. **اعمال تغییرات (اختیاری):** تغییراتی که در داخل کانتینر انجام میشود (مانند نصب پکیج یا تغییر فایلها)، تنها به همان کانتینر مربوط میشود مگر اینکه به ایمیج جدید commit شود.
4. **توقف کانتینر:** پس از پایان کار، کانتینر متوقف میشود. البته در صورت نیاز میتوان آن را دوباره اجرا کرد اما تغییرات اعمالشده در حین اجرا به صورت خودکار ذخیره نخواهد شد.
5. **حذف کانتینر:** در صورت عدم نیاز به کانتینر، میتوان آن را حذف کرد؛ در این صورت ایمیج اصلی بدون تغییر باقی میماند.
#### ۵. **مقایسه کلیدی بین ایمیج و کانتینر**
| ویژگی | ایمیج Docker | کانتینر Docker |
|------------------------|-------------------------------------------------|--------------------------------------------|
| **ماهیت** | قالب تنها خواندنی | نمونه اجرایی قابل نوشتن |
| **حالت** | تغییرناپذیر | قابل تغییر در زمان اجرا |
| **کاربرد** | تعریف نحوه ایجاد کانتینر | محیط اجرای برنامه |
| **چرخه حیات** | امکان به اشتراکگذاری، نسخهبندی، و استفاده مجدد | ایجاد، اجرا، توقف و حذف |
#### ۶. **دستورات کلیدی Docker**
- **ساخت ایمیج:**
```bash
docker build -t my-image .
```
- **اجرای کانتینر از ایمیج:**
```bash
docker run my-image
```
- **لیست تمامی کانتینرها:**
```bash
docker ps -a
```
- **توقف کانتینر:**
```bash
docker stop
```
- **حذف کانتینر:**
```bash
docker rm
```
- **حذف ایمیج:**
```bash
docker rmi
```
#### ۷. **Volumes Docker و حفظ دادهها**
با توجه به اینکه کانتینرها به صورت موقتی هستند و تغییرات در لایه قابل نوشتن ذخیره میشوند، استفاده از **Volumes** در Docker امکان ذخیرهسازی دادهها به صورت دائمی را فراهم میکند. این Volume ها در یک دایرکتوری مشخص در میزبان ذخیره میشوند و میتوانند میان کانتینرهای مختلف به اشتراک گذاشته شوند. این ویژگی تضمین میکند که دادهها حتی پس از حذف کانتینر باقی بمانند.
---
### راهنمای نصب پکیج یا ویرایش فایلها در کانتینر در حال اجرا
#### ۱. **یافتن شناسه یا نام کانتینر:**
ابتدا باید شناسه یا نام کانتینر مدنظر را بدانید. برای مشاهده لیست کانتینرهای در حال اجرا، از دستور زیر استفاده کنید:
```bash
docker ps
```
این دستور اطلاعاتی همچون `CONTAINER ID` و `NAMES` کانتینرهای در حال اجرا را نمایش میدهد.
#### ۲. **ورود به داخل کانتینر با استفاده از `docker exec`:**
با استفاده از دستور `docker exec` میتوانید وارد کانتینر شده و تغییرات لازم را اعمال کنید. برای شروع یک شِل (مثلاً `bash` یا `sh`)، دستور زیر را اجرا کنید:
```bash
docker exec -it bash
```
اگر کانتینر از شِل `bash` پشتیبانی نمیکند، میتوانید از `sh` استفاده کنید:
```bash
docker exec -it sh
```
پس از اجرای این دستور، به خط فرمان داخل کانتینر دسترسی پیدا کرده و میتوانید تغییرات مد نظر را اعمال کنید.
#### ۳. **نصب پکیج یا ویرایش فایل در داخل کانتینر:**
- **نصب پکیج:**
در صورتی که کانتینر مبتنی بر اوبونتو یا دبیان باشد، میتوانید پکیج مورد نیاز را با دستور زیر نصب کنید:
```bash
apt-get update && apt-get install -y
```
اگر کانتینر بر پایه Alpine باشد، از مدیریت پکیج `apk` استفاده کنید:
```bash
apk add --no-cache
```
- **ویرایش فایل:**
برای ویرایش فایلها میتوانید از ویرایشگرهایی مانند `nano` یا `vi` استفاده کنید. در صورتی که این ویرایشگرها نصب نباشند، میتوانید با استفاده از دستور `echo` محتویات جدید را به فایل اضافه یا جایگزین کنید:
```bash
echo "متن جدید" > /path/to/file.txt
```
#### ۴. **خروج از کانتینر:**
پس از اعمال تغییرات، با استفاده از دستور:
```bash
exit
```
از کانتینر خارج شوید.
---
### مثالهای عملی
#### **الف) نصب یک پکیج (مثلاً `curl`) در داخل کانتینر:**
1. ورود به کانتینر:
```bash
docker exec -it my-container bash
```
2. نصب پکیج:
```bash
apt-get update && apt-get install -y curl
```
3. خروج از کانتینر:
```bash
exit
```
#### **ب) تغییر یا افزودن محتوا به یک فایل در داخل کانتینر:**
1. ورود به کانتینر:
```bash
docker exec -it my-container bash
```
2. افزودن محتوا به فایل (مثلاً `/app/log.txt`):
```bash
echo "این یک ورودی لاگ است" >> /app/log.txt
```
3. خروج از کانتینر:
```bash
exit
```
#### **توضیحات تکمیلی:**
- **استفاده از `docker commit`:**
اگر بخواهید تغییرات موقت داخل کانتینر (مثلاً نصب یک پکیج) را به صورت دائمی ذخیره کنید، میتوانید از دستور `docker commit` برای ایجاد یک ایمیج جدید از کانتینر تغییر یافته استفاده کنید:
```bash
docker commit
```
- **توضیح بیشتر درباره تغییرات موقتی:**
تغییراتی که با دستور `docker exec` اعمال میشوند تنها در لایه قابل نوشتن کانتینر ذخیره میشوند و در صورت حذف کانتینر از بین میروند. برای حفظ تغییرات باید آنها را به یک ایمیج جدید commit کنید یا دادهها را در یک volume ذخیره کنید.
- **ابزارهای تکمیلی:**
در پروژههای پیچیده میتوان از ابزارهایی مانند **Docker Compose** برای مدیریت چندین کانتینر با هم استفاده کرد. Docker Compose امکان تعریف سرویسها، شبکهبندی و volumeها در یک فایل YAML را فراهم میکند و مدیریت پروژههای چند کانتینری را سادهتر میکند.
---
### خلاصه نهایی
- **ایمیج Docker:** قالب فقط خواندنی شامل تمامی اجزای لازم جهت اجرای برنامه (شامل کد، محیط اجرایی، کتابخانهها، متغیرهای محیطی و پیکربندیها) است.
- **کانتینر Docker:** نمونه اجرایی ایمیج که یک محیط ایزوله و قابل تغییر در زمان اجرا فراهم میکند.
- **رویه کار معمول:** ساخت ایمیج از Dockerfile → اجرای کانتینر از ایمیج → اعمال تغییرات (اختیاری) → توقف یا حذف کانتینر.
- **نگهداشت دادهها:** استفاده از Docker Volumes برای حفظ دادهها حتی پس از حذف کانتینر توصیه میشود.
- **ابزارهای مدیریتی:** دستورات اصلی Docker و همچنین ابزارهایی مانند Docker Compose برای مدیریت پروژههای پیچیده در دسترس هستند.
این ترجمه جامع و روان به شما کمک میکند تا مفاهیم کلیدی و عملیاتهای اساسی مربوط به Docker Image و Container را بهخوبی درک کنید.