دفتر ملاحظات Docker Compose - الأوامر الأكثر فائدة مع أمثلة
بالمناسبة، docker-compose مختلف عن docker compose...
هناك قائمة مصطلحات Docker Compose مع أمثلة مُصنَّفة لمساعدتك على إتقان ملفات Compose وال الأوامر بسرعة.
مرجع ملف Compose: docker-compose.yml
الهيكل الأساسي:
version: '3' # إصدار تنسيق ملف Compose
services:
web:
image: nginx:latest
ports:
- "8080:80" # منفذ المضيف 8080: منفذ الحاوية 80
db:
image: postgres
environment: # المتغيرات البيئية
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # شبكة مخصصة
appnet:
driver: bridge
volumes: # حجم مسمى
db_data:
- services: كل حاوية في تطبيقك متعدد الحاويات. في المثال أعلاه لدينا خدمتان:
web
وdb
. - networks & volumes: تعريف الشبكات المعزولة والتخزين المستمر - لدينا هنا شبكة
appnet
وحجمdb_data
.
أمثلة
خدمة واحدة مع خريطة المنفذ
services:
app:
build: .
ports:
- "8000:80" # منفذ المضيف 8000: منفذ الحاوية 80
يعرض التطبيق على منفذ المضيف 8000 ويقوم ببناءه من ملف Dockerfile في الدليل الحالي.
خدمة متعددة مع حجم مشترك وشبكة مخصصة
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
الويب والقاعدة على نفس الشبكة؛ القاعدة تستخدم حجمًا مستمرًا مسمى - db_data
.
استخدام سياق البناء ومسار ملف Dockerfile
يمكنك بناء صورة Docker حسب الحاجة من المحدد في ملف docker-compose.yml Dockerfile.
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
مشاركة البيانات بين الخدمات
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
تتشارك الخدمتان نفس الحجم (لملفات ثابتة أو تبادل البيانات) - shared_data
.
خيارات متقدمة لملف Compose
- environment: تعيين متغيرات بيئة للحاويات.
- depends_on: تحكم في ترتيب بدء الخدمة.
- deploy.replicas: توسع الخدمة في وضع Swarm.
مثال:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
يبدأ 3 مثيلات من الويب؛ فقط يتحكم في ترتيب بدء التشغيل (ليس جاهزية).
الأوامر الأساسية لـ Docker Compose
الأوامر | الوصف | استخدام المثال |
---|---|---|
docker-compose up |
إنشاء وتشغيل الحاويات | docker-compose up |
docker-compose up -d |
تشغيل في الخلفية | docker-compose up -d |
docker-compose exec |
تنفيذ أمر في حاوية تعمل | docker-compose exec web bash |
docker-compose build |
بناء/إعادة بناء الصور | docker-compose build |
docker-compose down |
توقف وإزالة الحاويات، الشبكات، الأحجام، والصور | docker-compose down |
docker-compose logs -f |
عرض واتبع السجلات | docker-compose logs -f |
docker-compose ps |
قائمة الحاويات التي تعمل | docker-compose ps |
docker-compose run |
تشغيل أوامر مؤقتة (تتجاهل الأوامر في ملف Compose) | docker-compose run web python manage.py migrate |
docker-compose stop |
توقف الحاويات التي تعمل (يمكن إعادة تشغيلها باستخدام start ) |
docker-compose stop |
docker-compose restart |
إعادة تشغيل الخدمات | docker-compose restart web |
docker-compose pull |
سحب صور الخدمة | docker-compose pull |
docker-compose rm |
إزالة الحاويات المتوقفة للخدمة | docker-compose rm web |
docker-compose config |
التحقق من ملف Compose وعرضه | docker-compose config |
docker-compose up --scale web=3 |
بدء عدة مثيلات من خدمة | docker-compose up --scale web=3 |
الأنماط الشائعة في Compose
-
قواعد البيانات مع بيانات مستمرة
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
تستمر بيانات القاعدة في الحجم
mysql_data
عبر إعادة تشغيل الحاويات. -
ربط رمزي للكود أثناء التطوير
services: app: build: . volumes: - .:/app
تحرير الكود مباشرة على المضيف، يتم تعكسه تلقائيًا في الحاوية.
الأعلام المفيدة
-d
: وضع التفريغ (تشغيل في الخلفية).--build
: إجبار إعادة بناء الصور قبل البدء.--force-recreate
: إعادة إنشاء الحاويات حتى لو لم تحدث.--remove-orphans
: إزالة الحاويات غير المحددة في ملف Compose.
تعريف وتحديد الخدمات
يمكنك تعريف وتحديد الخدمات، الشبكات، والأحجام في Docker Compose باستخدام ملف docker-compose.yml
، الذي يركز على جميع متطلبات تكوين وتنظيم التطبيق.
- الخدمات تُعرف تحت مفتاح
services
. - كل خدمة تمثل تكوين حاوية، حيث يمكنك تحديد:
- الصورة: اختر صورة من Docker Hub أو سجل آخر.
- المنافذ: خريطة منافذ الحاوية إلى منافذ المضيف.
- المتغيرات البيئية: إرسال قيم التكوين.
- الأحجام: استمرار البيانات أو مشاركة الملفات/المجلدات مع المضيف أو الخدمات الأخرى.
- الشبكات: تحديد الشبكات التي يمكن للخدمة الوصول إليها.
مثال:
services:
web:
image: nginx:latest
ports:
- "8080:80" # منفذ المضيف 8080: منفذ الحاوية 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- هنا، الخدمة
web
تستخدم صورة nginx، تحدد متغير بيئة، ترفق حجمًا، تفتح منفذ 80 كـ 8080 على المضيف، وتتصل بشبكةfrontend
. الخدمةdb
تفعل شيئًا مشابهًا لـ PostgreSQL.
تحديد الشبكات المخصصة
- الشبكات تحكم في أي الخدمات يمكن التواصل بينها. ينشئ Compose شبكة افتراضية، لكن يمكنك تعريف أكثر، تحديد مسارات مخصصة، تعيين خيارات، وتحديد أي خدمة تلتحق بشبكة معينة لعزل دقيق.
- عرّف الشبكات في المستوى الأعلى تحت
networks
، وحدد أي شبكات يجب أن تلتحق بها الخدمة باستخدام مفتاحnetworks
في مستوى الخدمة.
مثال:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- ربط الشبكات بالخدمات:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- هذا الإعداد يسمح للخدمة
app
بالوصول إلى المستخدمين على الشبكتينfrontend
وbackend
، بينماdb
فقط متوفرة داخلbackend
.
تحديد الأحجام المخصصة
- الأحجام تُعرف تحت مفتاح
volumes
في المستوى الأعلى. ربطها بالحاويات باستخدام مفتاحvolumes
تحت خدمة. - يمكن أن تكون الأحجام مسمى، تستخدم مسارات مخصصة، وتُشارك عبر عدة خدمات لاستمرار البيانات والمشاركة.
مثال:
volumes:
web_data: # حجم مسمى لملفات الويب
db_data: # حجم مسمى للقاعدة
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- في هذا المثال،
web_data
مستمرة ومتوفرة لأي حاوية تلتقنها.db_data
تضمن أن بيانات القاعدة لا تُفقد عند إعادة إنشاء الحاوية. - يمكنك تعريف ربط رمزي مع خيارات مسارات مخصصة لحالات متقدمة:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- هذا التكوين ينشئ ربطًا رمزيًا من مسار المضيف
/data/db_data
داخل الحاوية.
ملخص أفضل الممارسات:
- استخدم اسم الخدمة كاسم مضيف DNS للاتصال بين الخدمات.
- ربط الخدمات إلى عدة شبكات حسب الحاجة لتحكم الوصول.
- استخدم أحجام مسمى للاستمرارية والمشاركة البيانات.
- عرّف كل شيء باستخدام YAML، مما يتيح التحكم في الإصدار وسهولة النشر.
ملفات Compose متعددة
لـ تنظيم تكوينات متعددة الخدمات المعقدة في Docker Compose، يمكنك استخدام ملفات Compose متعددة وملفات استبدال، مما يسمح بتكوينات قابلة للتوسع ومخصصة للبيئة. إليك كيف تعمل هذه الميزة:
- هيكل الملف الأساسي والاستبدال
- أنشئ ملفًا أساسيًا (
compose.yaml
أوdocker-compose.yml
) يحتوي على جميع التعريفات الافتراضية المشتركة للخدمة. - أضف ملفات استبدال مخصصة للبيئة (مثل
docker-compose.override.yml
،docker-compose.dev.yml
،docker-compose.prod.yml
).
مثال لهيكل الملف:
/project-directory
|-- docker-compose.yml # التكوين الأساسي
|-- docker-compose.override.yml # الاستبدال المحلي/التطوير (يتم تطبيقه تلقائيًا)
|-- docker-compose.prod.yml # الاستبدال للإنتاج
|-- docker-compose.test.yml # الاستبدال للاختبار (إذا لزم الأمر)
يحدد الملف الأساسي الخدمات الأساسية، بينما كل ملف استبدال يخصص الإعدادات لبيئة معينة.
- كيفية دمج الملفات
- دمج: عند تشغيل
docker compose up
، يدمج Docker Compose الملف الأساسي مع أي ملفات استبدال حسب الترتيب؛ الملفات لاحقة تتجاوز، تمتد، أو تضيف إلى الإعدادات في الملفات السابقة. - استبدال الحقول: إذا تم تعريف خدمة أو حقل في عدة ملفات، يتم استخدام قيمة الملف الأخير المحدد. الحقول الجديدة تُضاف.
مثال لدمج:
docker-compose.yml
:services: web: image: myapp ports: - "8000:80"
docker-compose.override.yml
:services: web: environment: - DEBUG=true
- النتيجة: الخدمة
web
تستخدم الصورة والمنفذ من الملف الأساسي بالإضافة إلى متغير البيئة المُستبدلDEBUG
.
- استخدام الأوامر مع عدة ملفات
- السلوك الافتراضي: إذا كان موجودًا، يقوم Docker Compose تلقائيًا بتحميل
docker-compose.override.yml
معdocker-compose.yml
عند تشغيل أي أمر. - تحديد الملفات يدويًا: استخدم أعلام
-f
لتحديد أي ملفات يتم دمجها وبنفس الترتيب:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- هذا يتجاهل الاستبدال الافتراضي ويستخدم الإعدادات الخاصة بالإنتاج.
- استراتيجيات تنظيم عملية
- فصل البيئات: استخدم ملف استبدال لكل بيئة: تطوير، اختبار، إنتاج، إلخ.
- الخدمات والفرق: قسم التكوين إلى ملفات منفصلة لخدمات مختلفة أو فرق، ودمجها حسب الحاجة.
- التبديلات الميزة: يمكن أن تضيف ملفات إضافية خدمات أو إعدادات مخصصة للاحتياجات المؤقتة (مثل
compose.debug.yml
للتسجيل الإضافي).
- الفوائد
- الوضوح: يحتفظ الملفات الفردية بحجم صغير ومتركز.
- التوسع: إضافة خدمات جديدة أو بيئات أو إعدادات بسهولة.
- الصيانة: تغيير أو مراجعة الأقسام ذات الصلة فقط لنشر معين.
- مثال: تبديل البيئات
التطوير:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
الإنتاج:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
تتلقى كل بيئة فقط الإعدادات الضرورية لها، مع وجود جميع التكوين المشترك في الملف الأساسي.
تنظيم تكوينات Compose المعقدة مع عدة ملفات - واستغلال نظام الاستبدال والدمج - يضمن المرونة، التخصيص حسب البيئة، والتوسع السهل لتطبيقات Docker متعددة الخدمات الكبيرة.