Docker: بدء حاوية باستخدام `docker run`
آخر تحديث: 2026-08-26
docker run هو أمر Docker الأكثر استخدامًا — فهو ينشئ حاوية ويبدأ تشغيلها. إتقان معاملاته يعني إتقان أساسيات تشغيل الحاويات.
1. ما ستتعلمه
- المعاملات الرئيسية لـ
docker run - أوضاع التشغيل في المقدمة مقابل الخلفية
- آلية تعيين المنافذ
- تسمية الحاويات والتنظيف التلقائي
- حدود الموارد (CPU/الذاكرة)
2. قصة حقيقية لمطور خلفية
(1) نقطة الألم: تعارضات بين إصدارات متعددة من قواعد البيانات
تحتاج أليس إلى تشغيل ثلاثة إصدارات من PostgreSQL — v15 و v14 و v13 — في وقت واحد على جهازها المحلي لاختبار التوافق. باستخدام طريقة التثبيت التقليدية، يمكنها تثبيت إصدار واحد فقط في كل مرة، ويتطلب التبديل بين الإصدارات إلغاء التثبيت وإعادة التثبيت، مما يستغرق 30 دقيقة في كل مرة. والأسوأ من ذلك، أن ملفات الإعدادات وأدلة البيانات للإصدارات المختلفة قد تتعارض مع بعضها البعض.
(2) حلول للتشغيل المتوازي لحاويات Docker المتعددة
باستخدام Docker، بدأت ثلاث نسخ من PostgreSQL بمجموعة أوامر واحدة، كل منها معينة إلى منفذ مختلف.
# تشغيل ثلاثة إصدارات من 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) الصيغة الأساسية
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 في الخلفية (الصعوبة: ⭐)
# تشغيل Nginx في وضع منفصل
docker run -d -p 8080:80 --name web nginx:latest
# عرض سجلات الحاوية الخلفية
docker logs web
a1b2c3d4e5f6... (معرف الحاوية)
/docker-entrypoint.sh: Launching nginx...
▶ مثال: بدء حاوية Ubuntu تفاعلية (الصعوبة: ⭐⭐)
# تشغيل Ubuntu مع طرفية تفاعلية
docker run -it ubuntu:22.04 bash
# داخل الحاوية: التحقق من معلومات نظام التشغيل
cat /etc/os-release
# الخروج من الحاوية
exit
root@a1b2c3d4e5f6:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
...
root@a1b2c3d4e5f6:/# exit
exit سيوقف الحاوية. إذا كنت تريد الانفصال عن الحاوية مع إبقائها قيد التشغيل، اضغط Ctrl+P ثم Ctrl+Q (اختصار الانفصال).
5. تعيين المنافذ
افتراضيًا، لا يمكن الوصول إلى منافذ الخدمة داخل الحاوية من الخارج؛ يقوم تعيين المنافذ بكشف منافذ الحاوية للمضيف.
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 (الصعوبة: ⭐⭐)
# تشغيل 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
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 (الصعوبة: ⭐)
# تشغيل أمر لمرة واحدة، تتم إزالة الحاوية تلقائيًا بعد الخروج
docker run --rm alpine:latest echo "Hello from Alpine!"
# التحقق: اختفت الحاوية
docker ps -a
Hello from Alpine!
--rm مناسب بشكل خاص لمهام البناء والاختبار المؤقت في CI/CD، مما يساعد على منع تراكم الحاويات.
(2) سياسة إعادة التشغيل
تحدد سياسة إعادة التشغيل ما إذا كان سيتم إعادة تشغيل الحاوية تلقائيًا بعد خروجها.
| الاستراتيجية | السلوك | السيناريوهات المطبقة |
|---|---|---|
no (افتراضي) |
لا إعادة تشغيل | مهمة مؤقتة |
on-failure[:max] |
إعادة التشغيل عند الخروج برمز غير صفري (مع حد اختياري لعدد مرات إعادة التشغيل) | الخدمات التي قد تتعطل بشكل متقطع |
always |
إعادة تشغيل باستمرار (بما في ذلك عند إعادة تشغيل daemon بعد إيقافه يدويًا) | الخدمات الأساسية (Web/DB) |
unless-stopped |
مشابه لـ "always"، لكنه لا يعيد التشغيل بعد الإيقاف اليدوي | الخدمات التي تتطلب تحكمًا يدويًا |
▶ مثال: إعداد إعادة التشغيل التلقائي (الصعوبة: ⭐⭐)
# تشغيل Nginx مع سياسة إعادة التشغيل
docker run -d --name web --restart=always -p 8080:80 nginx:latest
# محاكاة التعطل: إنهاء عملية الحاوية
docker kill web
# الانتظار بضع ثوانٍ، التحقق: أعيد تشغيلها تلقائيًا
docker ps
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 ميجابايت (الصعوبة: ⭐⭐)
# تشغيل حاوية بحد ذاكرة 256 ميجابايت
docker run -d --name limited-app --memory=256m nginx:latest
# التحقق من حد الذاكرة
docker inspect limited-app --format='{{.HostConfig.Memory}}'
268435456
8. دورة حياة الحاوية وانتقالات الحالة
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 مع متغيرات البيئة
# ============================================
# شرح كامل: تشغيل 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}}'
# 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 أي رقم منفذ هو أي؟IP المضيف:8080 سيوصلك إلى الخدمة التي تعمل على المنفذ 80 داخل الحاوية.docker system df لعرض الاستخدام التفصيلي.docker run؟docker run --help يسرد جميع المعاملات. المعاملات الخمسة عشر أو الأكثر استخدامًا (المشمولة في هذا الدرس) مدرجة هناك؛ راجع الباقي حسب الحاجة.📖 ملخص
docker run= إنشاء وبدء حاوية؛ هذا هو أمر Docker الأكثر أهمية-dيشغل كخدمة خلفية؛-itتصحيح تفاعلي؛ الاثنان متنافيان- تعيين المنافذ
-p المضيف:الحاويةيكشف خدمات الحاوية للمضيف --rmيستخدم للتنظيف التلقائي للمهام المؤقتة؛--restartيستخدم للاسترداد التلقائي للخدمة--memory/--cpusيحدان الموارد لمنع حاوية واحدة من استخدام جميع موارد المضيف- للحاويات دورة حياة حالة كاملة: Created → Running → Paused → Stopped → Deleted
📝 تمارين
- تمرين أساسي (الصعوبة: ⭐): ابدأ حاوية Nginx معينة إلى المنفذ 8080 على جهازك المحلي، ثم قم بالوصول إليها عبر متصفح للتحقق من عرض الصفحة بشكل صحيح.
- مسألة متقدمة (الصعوبة: ⭐⭐): ابدأ حاوية Ubuntu تفاعلية، ونفذ
apt update && apt install -y curlداخل الحاوية، ثم استخدمcurlللوصول إلى صفحة ويب. - تحدٍ (الصعوبة: ⭐⭐⭐): مع تحديد ذاكرة الحاوية بـ 256 ميجابايت، شغّل أداة اختبار إجهاد (مثل
progrium/stress) ولاحظ ما إذا كان سيتم إنهاء الحاوية بسبب خطأ OOM (نفاد الذاكرة) عند تجاوز الذاكرة (تلميح:docker events --filter event=oom).