Docker هو منصة مفتوحة المصدر تسمح بإنشاء وتشغيل التطبيقات في بيئات معزولة تسمى "الحاويات" (Containers). تتيح هذه التقنية للمطورين تعبئة التطبيق مع جميع أجزائه، مثل المكتبات والتبعيات الأخرى، وشحنه كحزمة واحدة.
في الأساس، يحل Docker المشكلات التي تنشأ عند نقل البرامج من بيئة إلى أخرى من خلال إنشاء حاويات تتضمن كل ما يحتاجه التطبيق للعمل: الكود، وقت التشغيل، أدوات النظام، مكتبات النظام، والإعدادات.
الحاوية هي نسخة قابلة للتشغيل من صورة Docker. يمكنك إنشاء الحاويات وتشغيلها وإيقافها وحذفها باستخدام واجهة Docker. الحاوية هي بيئة معزولة تعمل على نظام التشغيل المضيف، وتحتوي على كل ما يحتاجه التطبيق للعمل.
الصورة (Image) هي قالب للقراءة فقط يحتوي على تعليمات لإنشاء حاوية Docker. غالبًا ما تكون الصورة مبنية على صورة أخرى، مع بعض التخصيصات الإضافية. على سبيل المثال، قد تبني صورة تعتمد على صورة ubuntu، ولكنها تثبت خادم الويب Apache وتطبيقك، بالإضافة إلى تفاصيل التكوين اللازمة لتشغيل تطبيقك.
# سحب صورة من Docker Hub
docker pull nginx
# عرض الصور المتوفرة محليًا
docker images
Dockerfile هو ملف نصي يحتوي على جميع الأوامر التي يمكن للمستخدم استدعاؤها من سطر الأوامر لتجميع صورة. باستخدام docker build، يمكن للمستخدمين إنشاء عملية مؤتمتة تنفذ عدة أوامر متتالية في سطر الأوامر.
# استخدام صورة Node.js الأساسية
FROM node:14
# تعيين دليل العمل
WORKDIR /app
# نسخ ملفات التبعيات
COPY package*.json ./
# تثبيت التبعيات
RUN npm install
# نسخ كود المصدر
COPY . .
# تعريض المنفذ 3000
EXPOSE 3000
# أمر بدء التشغيل
CMD ["npm", "start"]
Docker Hub هو خدمة سحابية مقدمة من Docker تتيح للمستخدمين نشر صورهم المخصصة ومشاركتها مع الآخرين. يحتوي على آلاف الصور العامة من مصادر مجتمعية يمكن استخدامها كأساس لبناء تطبيقات وخدمات مخصصة.
Docker Compose هي أداة لتعريف وتشغيل تطبيقات Docker متعددة الحاويات. باستخدام Compose، يمكنك استخدام ملف YAML لتكوين خدمات التطبيق المختلفة وتشغيلها جميعًا بأمر واحد.
# للتحقق من التثبيت، افتح موجه الأوامر واكتب:
docker --version
# يجب أن ترى شيئًا مثل:
# Docker version 20.10.14, build a224086
يمكنك تثبيت Docker على Ubuntu باستخدام مدير الحزم apt:
# تحديث قائمة الحزم
sudo apt-get update
# تثبيت الحزم المطلوبة
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# إضافة مفتاح GPG الرسمي لـ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# إضافة مستودع Docker
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# تحديث قائمة الحزم مرة أخرى
sudo apt-get update
# تثبيت Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io
# التحقق من التثبيت
sudo docker run hello-world
الأمر | الوصف |
---|---|
docker --version |
عرض إصدار Docker المثبت |
docker info |
عرض معلومات النظام لـ Docker |
docker pull [اسم_الصورة] |
سحب صورة من Docker Hub |
docker images |
عرض قائمة بجميع الصور المتوفرة محليًا |
docker run [اسم_الصورة] |
إنشاء وتشغيل حاوية من صورة |
docker ps |
عرض قائمة بالحاويات النشطة |
docker ps -a |
عرض قائمة بجميع الحاويات (النشطة وغير النشطة) |
docker stop [معرف_الحاوية] |
إيقاف حاوية نشطة |
docker start [معرف_الحاوية] |
تشغيل حاوية متوقفة |
docker rm [معرف_الحاوية] |
حذف حاوية |
docker rmi [اسم_الصورة] |
حذف صورة |
docker build -t [اسم_الصورة] . |
بناء صورة من Dockerfile في الدليل الحالي |
docker exec -it [معرف_الحاوية] bash |
الدخول إلى حاوية نشطة بواسطة الطرفية |
docker logs [معرف_الحاوية] |
عرض سجلات حاوية |
# سحب صورة nginx من Docker Hub
docker pull nginx
# تشغيل حاوية nginx على المنفذ 8080
docker run --name my-nginx -p 8080:80 -d nginx
# عرض الحاويات النشطة
docker ps
# الدخول إلى حاوية
docker exec -it my-nginx bash
# إيقاف حاوية
docker stop my-nginx
# حذف حاوية
docker rm my-nginx
# حذف صورة
docker rmi nginx
ملاحظة: في المثال أعلاه، -p 8080:80
تربط المنفذ 8080 على الجهاز المضيف بالمنفذ 80 داخل الحاوية، و -d
تعني تشغيل الحاوية في الخلفية (وضع منفصل).
صور Docker هي قوالب للقراءة فقط تستخدم لإنشاء حاويات. يمكنك إنشاء صورك الخاصة أو استخدام صور موجودة من Docker Hub.
Docker Hub هو مستودع عام لصور Docker. يمكنك استخدام الأمر docker pull
لسحب صور من Docker Hub:
# صيغة الأمر الأساسية
docker pull [اسم_الصورة]:[الإصدار]
# سحب صورة nginx بإصدار محدد
docker pull nginx:1.21
# سحب أحدث إصدار من صورة (latest)
docker pull ubuntu
يمكنك عرض وإدارة الصور المخزنة محليًا على جهازك:
# عرض قائمة الصور المحلية
docker images
# البحث عن صورة محلية
docker images | grep nginx
# حذف صورة
docker rmi [اسم_الصورة]:[الإصدار]
# حذف جميع الصور
docker rmi $(docker images -q)
يمكنك إنشاء صور Docker مخصصة بطريقتين رئيسيتين:
مثال على إنشاء صورة باستخدام docker commit:
# إنشاء حاوية وتشغيلها
docker run -it ubuntu bash
# [داخل الحاوية] تثبيت حزم
apt-get update
apt-get install -y nginx
exit
# حفظ التغييرات في صورة جديدة
docker commit [معرف_الحاوية] my-nginx-image:v1
إنشاء صورة باستخدام Dockerfile (الطريقة المفضلة):
# إنشاء ملف Dockerfile
touch Dockerfile
# بناء الصورة
docker build -t my-app:v1 .
يمكنك مشاركة صورك مع الآخرين عن طريق دفعها إلى Docker Hub:
# تسجيل الدخول إلى Docker Hub
docker login
# تسمية الصورة بالتنسيق المناسب
docker tag my-app:v1 username/my-app:v1
# دفع الصورة إلى Docker Hub
docker push username/my-app:v1
يمكنك استخدام الأمر docker run
لإنشاء وتشغيل حاوية من صورة:
# الصيغة الأساسية
docker run [خيارات] [اسم_الصورة] [أمر]
# تشغيل حاوية في الخلفية
docker run -d nginx
# تسمية الحاوية
docker run --name my-container nginx
# ربط المنافذ (port mapping)
docker run -p 8080:80 nginx
# تحديد متغيرات البيئة
docker run -e MYSQL_ROOT_PASSWORD=password mysql
# ربط مجلد من المضيف إلى الحاوية (volume)
docker run -v /host/path:/container/path nginx
# مثال كامل
docker run -d --name my-web -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx
يمكنك التحكم في حالة الحاويات بعد إنشائها:
# عرض الحاويات النشطة
docker ps
# عرض جميع الحاويات (النشطة وغير النشطة)
docker ps -a
# إيقاف حاوية
docker stop my-container
# تشغيل حاوية متوقفة
docker start my-container
# إعادة تشغيل حاوية
docker restart my-container
# حذف حاوية
docker rm my-container
# حذف جميع الحاويات المتوقفة
docker container prune
يمكنك التفاعل مع الحاويات النشطة بعدة طرق:
# الدخول إلى حاوية نشطة
docker exec -it my-container bash
# عرض سجلات الحاوية
docker logs my-container
# عرض السجلات بشكل مستمر
docker logs -f my-container
# عرض معلومات مفصلة عن الحاوية
docker inspect my-container
# نسخ ملفات من وإلى الحاوية
docker cp my-file.txt my-container:/path/in/container/
docker cp my-container:/path/in/container/file.txt ./my-file.txt
بعض الخيارات المتقدمة لتشغيل الحاويات:
# تحديد موارد الحاوية (CPU و RAM)
docker run --memory=512m --cpus=0.5 nginx
# تشغيل الحاوية مع إعادة التشغيل التلقائي في حالة الفشل
docker run --restart=always nginx
# إضافة الحاوية إلى شبكة محددة
docker run --network=my-network nginx
# تشغيل الحاوية في وضع معزول (privileged mode)
docker run --privileged nginx
Dockerfile هو ملف نصي يحتوي على مجموعة من التعليمات التي تخبر Docker كيفية إنشاء صورة. يتم إنشاؤه عادة في جذر مشروعك.
# التعليقات تبدأ بعلامة #
# تحديد الصورة الأساسية
FROM base_image:tag
# تحديد إنشاء الملف
MAINTAINER Author Name
# تنفيذ أوامر لتثبيت البرامج
RUN command
# نسخ الملفات من جهاز المضيف إلى الصورة
COPY source destination
ADD source destination
# تحديد دليل العمل داخل الحاوية
WORKDIR /path/to/directory
# تعريف متغيرات البيئة
ENV key=value
# كشف المنافذ
EXPOSE port
# تحديد الأمر الافتراضي عند تشغيل الحاوية
CMD ["executable", "param1", "param2"]
ENTRYPOINT ["executable", "param1", "param2"]
# تحديد حجم للبيانات المستمرة
VOLUME /path/in/container
التعليمة | الوصف |
---|---|
FROM |
تحديد الصورة الأساسية التي سيتم بناء الصورة الجديدة عليها |
RUN |
تنفيذ أوامر في طبقة جديدة فوق الصورة الحالية |
COPY |
نسخ ملفات أو دلائل من جهاز المضيف إلى نظام ملفات الحاوية |
ADD |
مثل COPY لكن مع ميزات إضافية مثل دعم URL وفك ضغط الملفات تلقائيًا |
WORKDIR |
تعيين دليل العمل لتعليمات RUN و CMD و ENTRYPOINT و COPY و ADD اللاحقة |
ENV |
تعيين متغيرات البيئة |
EXPOSE |
إعلام Docker أن الحاوية تستمع على المنافذ المحددة عند التشغيل |
CMD |
تحديد الأمر الافتراضي الذي سيتم تنفيذه عند تشغيل الحاوية (يمكن تجاوزه) |
ENTRYPOINT |
تحديد البرنامج القابل للتنفيذ الذي سيتم تشغيله عند بدء الحاوية (لا يمكن تجاوزه بسهولة) |
VOLUME |
إنشاء نقطة تركيب للمجلدات المستمرة |
مثال لـ Dockerfile لتطبيق Node.js:
# استخدام الصورة الرسمية لـ Node.js
FROM node:14
# تعيين دليل العمل
WORKDIR /app
# نسخ ملفات package.json وpackage-lock.json
COPY package*.json ./
# تثبيت التبعيات
RUN npm install
# نسخ باقي ملفات المشروع
COPY . .
# تعريض المنفذ 3000
EXPOSE 3000
# تعيين أمر بدء التشغيل
CMD ["npm", "start"]
مثال لـ Dockerfile لتطبيق Python Flask:
# استخدام صورة Python الأساسية
FROM python:3.9-slim
# تعيين دليل العمل
WORKDIR /app
# نسخ ملف المتطلبات وتثبيتها
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# نسخ باقي الملفات
COPY . .
# تعيين متغيرات البيئة
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# تعريض المنفذ 5000
EXPOSE 5000
# تشغيل التطبيق
CMD ["flask", "run"]
Docker Compose هي أداة لتعريف وتشغيل تطبيقات Docker متعددة الحاويات. باستخدام ملف YAML واحد، يمكنك تكوين خدمات التطبيق المختلفة وتشغيلها جميعًا بأمر واحد.
يحدد ملف docker-compose.yml خدمات التطبيق والشبكات والمجلدات المشتركة:
# إصدار Docker Compose
version: '3'
# تعريف الخدمات
services:
# اسم الخدمة الأولى
web:
# بناء من Dockerfile في الدليل الحالي
build: .
# ربط المنافذ
ports:
- "5000:5000"
# ربط المجلدات
volumes:
- ./app:/app
# الاعتماد على خدمات أخرى
depends_on:
- redis
# اسم الخدمة الثانية
redis:
# استخدام صورة جاهزة
image: redis:alpine
# تعريف الشبكات
networks:
default:
driver: bridge
# تعريف المجلدات المستمرة
volumes:
data:
# تشغيل الخدمات المحددة في docker-compose.yml
docker-compose up
# تشغيل الخدمات في الخلفية
docker-compose up -d
# عرض حالة الخدمات
docker-compose ps
# عرض سجلات جميع الخدمات
docker-compose logs
# عرض سجلات خدمة محددة
docker-compose logs web
# إيقاف الخدمات
docker-compose stop
# إيقاف وإزالة الحاويات والشبكات
docker-compose down
# تشغيل أمر داخل حاوية
docker-compose exec web bash
# بناء أو إعادة بناء الخدمات
docker-compose build
مثال لـ docker-compose.yml لتطبيق ويب مع قاعدة بيانات:
version: '3'
services:
# تطبيق واجهة المستخدم
frontend:
build: ./frontend
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
environment:
- REACT_APP_API_URL=http://backend:5000
depends_on:
- backend
# خدمة واجهة برمجة التطبيقات
backend:
build: ./backend
ports:
- "5000:5000"
volumes:
- ./backend:/app
environment:
- DATABASE_URL=mongodb://db:27017/myapp
depends_on:
- db
# قاعدة البيانات
db:
image: mongo:latest
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
volumes:
mongodb_data:
version: '3.8'
services:
web:
build:
context: ./app
dockerfile: Dockerfile.dev
ports:
- "8000:8000"
environment:
- NODE_ENV=development
# إعادة تشغيل تلقائية
restart: always
# تحديد موارد الحاوية
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
# صحة الحاوية
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
يمكنك أيضًا استخدام متغيرات البيئة في ملفات Docker Compose:
version: '3'
services:
web:
image: nginx
ports:
- "${NGINX_PORT:-80}:80"
environment:
- DEBUG=${DEBUG:-false}
توفر Docker عدة أنواع من الشبكات لربط الحاويات ببعضها البعض وبالعالم الخارجي. فهم الشبكات يساعد في بناء تطبيقات متعددة الحاويات تتواصل بكفاءة.
نوع الشبكة | الوصف |
---|---|
bridge |
الشبكة الافتراضية. تنشئ شبكة خاصة داخلية تستطيع الحاويات من خلالها التواصل مع بعضها البعض. |
host |
تستخدم شبكة المضيف مباشرة، مما يلغي العزل بين شبكة الحاوية وشبكة المضيف. |
none |
تعطيل جميع الشبكات. الحاوية لا تستطيع التواصل مع أي شيء خارجها. |
overlay |
تربط عدة خوادم Docker معًا، مفيدة لخدمات Docker Swarm. |
macvlan |
تمنح الحاويات عناوين MAC خاصة بها، لتظهر كأجهزة فعلية على الشبكة. |
يمكنك إنشاء وإدارة شبكات Docker باستخدام الأوامر التالية:
# عرض قائمة الشبكات
docker network ls
# إنشاء شبكة جديدة
docker network create my_network
# إنشاء شبكة مع إعدادات مخصصة
docker network create --driver bridge --subnet=192.168.0.0/24 --gateway=192.168.0.1 my_custom_network
# التفاصيل المتعلقة بشبكة
docker network inspect my_network
# توصيل حاوية بشبكة
docker network connect my_network my_container
# فصل حاوية من شبكة
docker network disconnect my_network my_container
# حذف شبكة
docker network rm my_network
في Docker، يمكن للحاويات التواصل بعدة طرق:
مثال على التواصل بين الحاويات في Docker Compose:
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
networks:
- frontend
depends_on:
- api
api:
image: my-api
networks:
- frontend
- backend
environment:
- DB_HOST=database
depends_on:
- database
database:
image: postgres
networks:
- backend
volumes:
- db-data:/var/lib/postgresql/data
networks:
frontend:
backend:
volumes:
db-data:
في هذا المثال، يمكن للخدمة web الوصول إلى api عبر اسمها، ويمكن للخدمة api الوصول إلى database عبر اسمها، ولكن web لا يمكنها الوصول مباشرة إلى database.
تعتبر الحاويات مؤقتة بطبيعتها - يتم حذف أي تغييرات على نظام الملفات عند إزالة الحاوية. تقدم Docker آليات لتخزين البيانات خارج الحاويات.
النوع | الوصف | الاستخدام |
---|---|---|
Volumes |
مساحات تخزين تديرها Docker في منطقة محجوزة على نظام المضيف. | أفضل خيار للبيانات المستمرة، يمكن مشاركتها بين الحاويات. |
Bind Mounts |
ربط مباشر بين مسار على المضيف ومسار في الحاوية. | مفيد للتطوير وعندما تحتاج الحاوية للوصول إلى ملفات المضيف. |
tmpfs |
تخزين مؤقت في ذاكرة المضيف فقط. | للبيانات المؤقتة والحساسة التي لا تحتاج للاستمرارية. |
المجلدات هي الطريقة المفضلة لإدارة البيانات المستمرة في Docker:
# إنشاء مجلد
docker volume create my_data
# عرض قائمة المجلدات
docker volume ls
# عرض تفاصيل مجلد
docker volume inspect my_data
# حذف مجلد
docker volume rm my_data
# حذف المجلدات غير المستخدمة
docker volume prune
استخدام المجلدات مع الحاويات:
# استخدام مجلد عند تشغيل حاوية
docker run -v my_data:/path/in/container nginx
# استخدام bind mount لربط دليل محلي
docker run -v /host/path:/container/path nginx
# أمثلة شائعة لاستخدام المجلدات
docker run -v mysql_data:/var/lib/mysql mysql
docker run -v postgres_data:/var/lib/postgresql/data postgres
docker run -v mongodb_data:/data/db mongo
حماية بيانات المجلدات والتعامل معها:
# نسخ احتياطي لمجلد Docker إلى ملف مضغوط
docker run --rm -v my_data:/source -v $(pwd):/backup alpine tar czf /backup/my_data_backup.tar.gz -C /source .
# استعادة مجلد من نسخة احتياطية
docker run --rm -v my_data:/target -v $(pwd):/backup alpine tar xzf /backup/my_data_backup.tar.gz -C /target
# نقل البيانات بين مجلدين
docker run --rm -v source_vol:/from -v destination_vol:/to alpine cp -av /from/. /to/
أفضل الممارسات لإدارة البيانات:
يقدم Docker مزايا أمنية كثيرة، لكنه يتطلب أيضًا اهتمامًا خاصًا لتجنب المخاطر الأمنية المحتملة.
# تشغيل الحاوية كمستخدم غير المستخدم الجذر
docker run --user 1000:1000 nginx
# تشغيل الحاوية في وضع القراءة فقط
docker run --read-only nginx
# تعطيل امتيازات إضافية
docker run --security-opt=no-new-privileges nginx
# تقييد القدرات (capabilities)
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
# استخدام ملفات AppArmor أو SELinux
docker run --security-opt apparmor=docker-default nginx
عند العمل مع Docker، قد تواجه بعض المشاكل الشائعة. إليك بعض الاستراتيجيات والحلول للمشاكل الأكثر شيوعًا.
# عرض سجلات الحاوية
docker logs container_name
# متابعة السجلات بشكل مباشر
docker logs -f container_name
# عرض معلومات وإحصائيات مفصلة عن الحاوية
docker stats container_name
# عرض عمليات التشغيل داخل الحاوية
docker top container_name
# الدخول إلى الحاوية لتنفيذ أوامر تشخيصية
docker exec -it container_name bash
# عرض معلومات النظام
docker system info
# عرض استخدام الموارد
docker system df
المشكلة | الحل المحتمل |
---|---|
لا يمكن بدء/إيقاف الحاويات |
- إعادة تشغيل عفريت Docker: sudo systemctl restart docker - التحقق من وجود مساحة كافية على القرص: df -h - التحقق من سجلات Docker: docker logs container_name
|
مشاكل الشبكة |
- فحص إعدادات الشبكة: docker network inspect network_name - إعادة إنشاء الشبكة: docker network rm network_name && docker network create network_name - التأكد من تكوين المنافذ بشكل صحيح: docker port container_name
|
مشاكل مساحة القرص |
- تنظيف الصور والحاويات غير المستخدمة: docker system prune -a - إزالة المجلدات غير المستخدمة: docker volume prune - مراقبة استخدام المساحة: docker system df
|
بطء في الأداء |
- مراقبة استخدام الموارد: docker stats - تقييد موارد الحاويات: docker update --cpus=0.5 --memory=512m container_name - تحديث إصدار Docker |
فشل بناء الصور |
- التحقق من وجود Dockerfile صحيح - التأكد من وجود ملفات المصدر - محاولة بناء الصورة مع تعطيل ذاكرة التخزين المؤقت: docker build --no-cache .
|
docker ps -a
لمعرفة حالة الحاوية والتحقق مما إذا كانت تعمل.في هذا الدليل، تعرفنا على أساسيات استخدام Docker لتطوير وتشغيل التطبيقات في حاويات. من المفاهيم الأساسية إلى التقنيات المتقدمة، أصبحت الآن على دراية بالجوانب المختلفة لتقنية الحاويات.
تقنية Docker تستمر في التطور، وهي جزء أساسي من مشهد التطوير الحديث وبنية DevOps. مع مواصلة استكشاف Docker، يمكنك تعزيز مهاراتك من خلال:
شكرًا لاستخدامك دليل Docker الخاص بنا. نتمنى أن يكون هذا المورد قد ساعدك في فهم وتطبيق تقنية الحاويات في مشاريعك. لا تتردد في العودة إلى هذا الدليل كلما احتجت إلى تذكير أو مرجع سريع.