Docker: بدء حاوية باستخدام `docker run`

آخر تحديث: 2026-08-26

docker run هو أمر Docker الأكثر استخدامًا — فهو ينشئ حاوية ويبدأ تشغيلها. إتقان معاملاته يعني إتقان أساسيات تشغيل الحاويات.

1. ما ستتعلمه



2. قصة حقيقية لمطور خلفية

(1) نقطة الألم: تعارضات بين إصدارات متعددة من قواعد البيانات

تحتاج أليس إلى تشغيل ثلاثة إصدارات من PostgreSQL — v15 و v14 و v13 — في وقت واحد على جهازها المحلي لاختبار التوافق. باستخدام طريقة التثبيت التقليدية، يمكنها تثبيت إصدار واحد فقط في كل مرة، ويتطلب التبديل بين الإصدارات إلغاء التثبيت وإعادة التثبيت، مما يستغرق 30 دقيقة في كل مرة. والأسوأ من ذلك، أن ملفات الإعدادات وأدلة البيانات للإصدارات المختلفة قد تتعارض مع بعضها البعض.

(2) حلول للتشغيل المتوازي لحاويات Docker المتعددة

باستخدام Docker، بدأت ثلاث نسخ من PostgreSQL بمجموعة أوامر واحدة، كل منها معينة إلى منفذ مختلف.

BASH
# تشغيل ثلاثة إصدارات من PostgreSQL جنبًا إلى جنب
docker run -d --name pg15 -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:15
docker run -d --name pg14 -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres:14
docker run -d --name pg13 -e POSTGRES_PASSWORD=secret -p 5434:5432 postgres:13

(3) الفوائد: إصدارات متعددة تعمل بالتوازي بدون تعارضات

مع ثلاث نسخ من PostgreSQL تعمل بالتوازي دون التداخل مع بعضها البعض، أكملت أليس اختبار التوافق عبر الإصدارات في 5 دقائق — وهي مهمة كانت ستستغرق ساعتين باستخدام الطريقة التقليدية.



3. صيغة ومعاملات docker run الرئيسية

(1) الصيغة الأساسية

BASH
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
المكون الوصف مثال
OPTIONS معاملات التشغيل (المنافذ/البيئة/الموارد، إلخ) -d -p 8080:80 --name web
IMAGE اسم الصورة: الوسم nginx:latest / postgres:15
COMMAND تجاوز أمر البدء الافتراضي للصورة bash / sleep 3600
ARG الوسائط الممررة إلى COMMAND -c "echo hello"

(2) جدول مرجعي سريع للمعاملات الشائعة

المعامل الوظيفة مثال
-d التشغيل في الخلفية (منفصل) docker run -d nginx
-it طرفية تفاعلية docker run -it ubuntu bash
-p تعيين المنفذ (المضيف:الحاوية) -p 8080:80
-P تعيين منفذ عشوائي docker run -P nginx
--name تسمية الحاوية --name my-app
--rm حذف تلقائي بعد الخروج docker run --rm alpine echo hi
-e تعيين متغيرات البيئة -e MYSQL_ROOT_PASSWORD=secret
-v تركيب وحدة تخزين (المضيف:الحاوية) -v /data:/var/lib/mysql
--restart سياسة إعادة التشغيل --restart=always
--cpus حد CPU --cpus=1.5
--memory حد الذاكرة --memory=256m
--network شبكة محددة --network=my-net
-w دليل العمل -w /app
--user مستخدم التشغيل --user 1000:1000


4. التنفيذ في المقدمة مقابل الخلفية

للحاويات وضعان للتشغيل: المقدمة والخلفية، ويتم التحكم بهما عبر -it و -d.

(1) مقارنة أوضاع التشغيل

البُعد وضع المقدمة -it وضع الخلفية -d
شغل الطرفية يشغل الطرفية الحالية يحرر الطرفية
عرض المخرجات مخرجات مباشرة في الطرفية العرض باستخدام docker logs
حالات الاستخدام التفاعل وتصحيح الأخطاء التطبيقات الموجهة للخدمة (Web/DB)
كيفية الخروج Ctrl+C أو exit docker stop
مثال docker run -it ubuntu bash docker run -d nginx

▶ مثال: بدء خدمة Nginx في الخلفية (الصعوبة: ⭐)

BASH
# تشغيل Nginx في وضع منفصل
docker run -d -p 8080:80 --name web nginx:latest

# عرض سجلات الحاوية الخلفية
docker logs web
💻 المخرجات:

TEXT 📖 للعرض فقط
a1b2c3d4e5f6... (معرف الحاوية)
/docker-entrypoint.sh: Launching nginx...

▶ مثال: بدء حاوية Ubuntu تفاعلية (الصعوبة: ⭐⭐)

BASH
# تشغيل Ubuntu مع طرفية تفاعلية
docker run -it ubuntu:22.04 bash

# داخل الحاوية: التحقق من معلومات نظام التشغيل
cat /etc/os-release

# الخروج من الحاوية
exit
💻 المخرجات:

TEXT 📖 للعرض فقط
root@a1b2c3d4e5f6:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
...
root@a1b2c3d4e5f6:/# exit
⚠️ ملاحظة: exit سيوقف الحاوية. إذا كنت تريد الانفصال عن الحاوية مع إبقائها قيد التشغيل، اضغط Ctrl+P ثم Ctrl+Q (اختصار الانفصال).



5. تعيين المنافذ

افتراضيًا، لا يمكن الوصول إلى منافذ الخدمة داخل الحاوية من الخارج؛ يقوم تعيين المنافذ بكشف منافذ الحاوية للمضيف.

100%
graph LR
    A["المضيف<br/>المنفذ 8080"] -->|"-p 8080:80"| B["الحاوية<br/>المنفذ 80"]
    C["المضيف<br/>المنفذ 5432"] -->|"-p 5432:5432"| D["الحاوية<br/>المنفذ 5432"]

(1) سياسة تعيين المنافذ

الطريقة الصيغة الوصف مثال
منفذ محدد -p المضيف:الحاوية منفذ المضيف → منفذ الحاوية -p 8080:80
تحديد العنوان -p ip:المضيف:الحاوية ربط بـ IP محدد -p 127.0.0.1:8080:80
منفذ عشوائي -P تعيين تلقائي لمنفذ عشوائي على المضيف -P
تعيين نطاق -p 8080-8090:80-90 تعيين نطاق منافذ Linux فقط

▶ مثال: تعيين منافذ متعددة لـ PostgreSQL (الصعوبة: ⭐⭐)

BASH
# تشغيل PostgreSQL مع تعيين المنفذ ومتغيرات البيئة
docker run -d \
  --name pg15 \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  postgres:15

# الاتصال بـ PostgreSQL
docker exec -it pg15 psql -U postgres -d myapp
💻 المخرجات:

TEXT 📖 للعرض فقط
myapp=# \l
                                  List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    
-----------+----------+----------+------------+------------
 myapp     | postgres | UTF8     | en_US.utf8 | en_US.utf8
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8


6. التنظيف التلقائي وسياسات إعادة التشغيل

(1) الحاوية المؤقتة --rm

--rm يحذف الحاوية تلقائيًا بعد خروجها؛ مناسب للمهام لمرة واحدة.

▶ مثال: تشغيل مهمة مؤقتة باستخدام --rm (الصعوبة: ⭐)

BASH
# تشغيل أمر لمرة واحدة، تتم إزالة الحاوية تلقائيًا بعد الخروج
docker run --rm alpine:latest echo "Hello from Alpine!"

# التحقق: اختفت الحاوية
docker ps -a
💻 المخرجات:

TEXT 📖 للعرض فقط
Hello from Alpine!
💡 نصيحة: --rm مناسب بشكل خاص لمهام البناء والاختبار المؤقت في CI/CD، مما يساعد على منع تراكم الحاويات.

(2) سياسة إعادة التشغيل

تحدد سياسة إعادة التشغيل ما إذا كان سيتم إعادة تشغيل الحاوية تلقائيًا بعد خروجها.

الاستراتيجية السلوك السيناريوهات المطبقة
no (افتراضي) لا إعادة تشغيل مهمة مؤقتة
on-failure[:max] إعادة التشغيل عند الخروج برمز غير صفري (مع حد اختياري لعدد مرات إعادة التشغيل) الخدمات التي قد تتعطل بشكل متقطع
always إعادة تشغيل باستمرار (بما في ذلك عند إعادة تشغيل daemon بعد إيقافه يدويًا) الخدمات الأساسية (Web/DB)
unless-stopped مشابه لـ "always"، لكنه لا يعيد التشغيل بعد الإيقاف اليدوي الخدمات التي تتطلب تحكمًا يدويًا

▶ مثال: إعداد إعادة التشغيل التلقائي (الصعوبة: ⭐⭐)

BASH
# تشغيل Nginx مع سياسة إعادة التشغيل
docker run -d --name web --restart=always -p 8080:80 nginx:latest

# محاكاة التعطل: إنهاء عملية الحاوية
docker kill web

# الانتظار بضع ثوانٍ، التحقق: أعيد تشغيلها تلقائيًا
docker ps
💻 المخرجات:

TEXT 📖 للعرض فقط
CONTAINER ID   IMAGE          STATUS                     PORTS                  NAMES
b2c3d4e5f6a7   nginx:latest   Up 3 seconds (healthy)     0.0.0.0:8080->80/tcp   web


7. حدود الموارد

يمكن لـ Docker تحديد كمية CPU والذاكرة التي تستخدمها الحاويات، مما يمنع حاوية واحدة من استنفاد موارد المضيف.

(1) معاملات حدود الموارد

المورد المعاملات الوصف مثال
عدد أنوية CPU --cpus الحد الأقصى لأنوية CPU المستخدمة --cpus=1.5
وزن CPU --cpu-shares الوزن النسبي (الافتراضي 1024) --cpu-shares=512
حد الذاكرة --memory / -m الحد الأقصى للذاكرة --memory=256m
Swap --memory-swap الحد الأقصى للذاكرة + Swap --memory-swap=512m

▶ مثال: تحديد ذاكرة الحاوية بـ 256 ميجابايت (الصعوبة: ⭐⭐)

BASH
# تشغيل حاوية بحد ذاكرة 256 ميجابايت
docker run -d --name limited-app --memory=256m nginx:latest

# التحقق من حد الذاكرة
docker inspect limited-app --format='{{.HostConfig.Memory}}'
💻 المخرجات:

TEXT 📖 للعرض فقط
268435456
⚠️ ملاحظة: 268435456 بايت = 256 ميجابايت. الحاويات التي تتجاوز حد الذاكرة سيتم إنهاؤها بواسطة OOM Killer (رمز الخروج 137).



8. دورة حياة الحاوية وانتقالات الحالة

100%
stateDiagram-v2
    [*] --> Created : docker create / docker run
    Created --> Running : docker start / docker run
    Running --> Paused : docker pause
    Paused --> Running : docker unpause
    Running --> Stopped : docker stop / docker kill
    Stopped --> Running : docker start
    Running --> Restarting : تعطل + سياسة إعادة التشغيل
    Restarting --> Running : نجاح إعادة التشغيل
    Stopped --> Deleted : docker rm
    Running --> Deleted : docker rm -f
    Deleted --> [*]


9. مثال كامل: بدء حاوية PostgreSQL مع متغيرات البيئة

BASH
# ============================================
# شرح كامل: تشغيل PostgreSQL مع Docker
# يغطي: -d، -e، -p، --name، --restart، --memory
# ============================================

# 1. تشغيل PostgreSQL 15 مع إعدادات كاملة
docker run -d \
  --name pg15 \
  -e POSTGRES_USER=appuser \
  -e POSTGRES_PASSWORD=secret123 \
  -e POSTGRES_DB=appdb \
  -p 5432:5432 \
  --restart=unless-stopped \
  --memory=512m \
  postgres:15

# 2. التحقق من أن الحاوية قيد التشغيل
docker ps

# 3. الاتصال عبر عميل psql داخل الحاوية
docker exec -it pg15 psql -U appuser -d appdb

# 4. داخل psql: إنشاء جدول اختبار
# CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100));
# INSERT INTO users (name) VALUES ('Alice'), ('Bob');
# SELECT * FROM users;

# 5. التحقق من استخدام موارد الحاوية
docker stats pg15 --no-stream

# 6. عرض إعدادات الحاوية
docker inspect pg15 --format='Memory: {{.HostConfig.Memory}}, RestartPolicy: {{.HostConfig.RestartPolicy.Name}}'
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
# docker ps
CONTAINER ID   IMAGE         STATUS         PORTS                    NAMES
a1b2c3d4e5f6   postgres:15   Up 30 seconds  0.0.0.0:5432->5432/tcp   pg15

# docker stats --no-stream
CONTAINER ID   NAME   CPU %   MEM USAGE / LIMIT   MEM %
a1b2c3d4e5f6   pg15   0.02%   38.5MiB / 512MiB    7.52%

# docker inspect --format
Memory: 536870912, RestartPolicy: unless-stopped

❓ أسئلة شائعة

س هل يمكن استخدام -d و -it معًا؟
ج لا. -d يشغل في الخلفية، بينما -it طرفية تفاعلية؛ الاثنان متنافيان. إذا كنت بحاجة إلى تشغيل الحاوية في الخلفية والوصول إليها أحيانًا، ابدأها بـ -d ثم استخدم docker exec -it للدخول إلى الحاوية.
س هل ستفقد البيانات عند خروج الحاوية؟
ج إذا لم تستخدم -v لتركيب وحدة تخزين، ستفقد البيانات عند حذف الحاوية. تبقى البيانات بعد إيقاف الحاوية (stop)، لكنها تختفي بعد حذفها (rm). لاستمرار البيانات، يجب استخدام وحدة تخزين أو تركيب bind.
س متى يجب استخدام --rm؟
ج المهام لمرة واحدة: تشغيل الاختبارات، تنفيذ السكربتات، التحقق من إصدارات الأدوات. غير مناسب للخدمات التي تتطلب بيانات مستمرة. يجب إضافة --rm إلى جميع الخطوات تقريبًا في خطوط أنابيب CI/CD لمنع تراكم الحاويات على عُقد البناء.
س في -p 8080:80 أي رقم منفذ هو أي؟
ج المنفذ على اليسار (8080) هو منفذ المضيف، والمنفذ على اليمين (80) هو منفذ الحاوية. للتذكر: "اليسار هو المضيف، اليمين هو الحاوية." الوصول إلى IP المضيف:8080 سيوصلك إلى الخدمة التي تعمل على المنفذ 80 داخل الحاوية.
س كم مساحة القرص التي تشغلها الحاوية؟
ج الطبقة القابلة للكتابة (الجزء القابل للتعديل) لكل حاوية تشغل عادةً بضعة كيلوبايت إلى بضع عشرات من الميجابايت. الحاويات لا تنسخ الصورة؛ بل تشارك الطبقة القابلة للقراءة فقط للصورة. إجمالي الاستخدام = حجم الصورة + الطبقة القابلة للكتابة للحاوية. استخدم docker system df لعرض الاستخدام التفصيلي.
س كيف أعرض جميع معاملات docker run؟
ج docker run --help يسرد جميع المعاملات. المعاملات الخمسة عشر أو الأكثر استخدامًا (المشمولة في هذا الدرس) مدرجة هناك؛ راجع الباقي حسب الحاجة.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): ابدأ حاوية Nginx معينة إلى المنفذ 8080 على جهازك المحلي، ثم قم بالوصول إليها عبر متصفح للتحقق من عرض الصفحة بشكل صحيح.
  2. مسألة متقدمة (الصعوبة: ⭐⭐): ابدأ حاوية Ubuntu تفاعلية، ونفذ apt update && apt install -y curl داخل الحاوية، ثم استخدم curl للوصول إلى صفحة ويب.
  3. تحدٍ (الصعوبة: ⭐⭐⭐): مع تحديد ذاكرة الحاوية بـ 256 ميجابايت، شغّل أداة اختبار إجهاد (مثل progrium/stress) ولاحظ ما إذا كان سيتم إنهاء الحاوية بسبب خطأ OOM (نفاد الذاكرة) عند تجاوز الذاكرة (تلميح: docker events --filter event=oom).
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%