Compose تعریف چند container یک برنامه را کنار هم نگه می‌دارد. امشب سرویس HTTP و یک client پایش را با شبکهٔ داخلی و health dependency اجرا می‌کنیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۵ در ۶۰ شب است.

جایگاه در دوره: هدف‌های 352.3، 352.4 آزمون 305-300.

محیط: docker-a، plugin نسخهٔ ۲؛ image lab305-web:v1 آماده، port 18050 آزاد. پوشهٔ ~/lpic305/compose تازه است.

compose.yaml:

services:
  web:
    image: lab305-web:v1
    ports:
      - "127.0.0.1:18050:8080"
    read_only: true
    cap_drop: [ALL]
    security_opt: ["no-new-privileges:true"]
    secrets: [lab_note]
    healthcheck:
      test:
        - CMD
        - python
        - -c
        - "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/', timeout=2)"
      interval: 10s
      timeout: 3s
      retries: 3
  probe:
    image: alpine:3.23
    depends_on:
      web:
        condition: service_healthy
    command: ["sh", "-c", "while true; do wget -qO- http://web:8080/; sleep 15; done"]
secrets:
  lab_note:
    file: ./lab-note.txt
printf 'training only\n' > lab-note.txt
chmod 600 lab-note.txt
sudo docker compose -p lab305 config
sudo docker compose -p lab305 up -d
sudo docker compose -p lab305 ps
sudo docker compose -p lab305 logs --tail 20 probe
curl --fail http://127.0.0.1:18050/

نام web در شبکهٔ پروژه resolve می‌شود. شرط service_healthy ترتیب شروع را به probe موفق وابسته می‌کند؛ خرابی بعدی dependency خودکار همهٔ clientها را restart نمی‌کند. برنامه باید retry/reconnect داشته باشد.

secret در /run/secrets/lab_note mount می‌شود؛ برنامهٔ نمونه آن را مصرف نمی‌کند و این فایل فقط مشاهدهٔ مسیر است. secret فایل Compose محلی به‌معنی مخزن رمزنگاری‌شده یا authentication خودکار HTTP نیست. config ممکن است مقدار environmentها را چاپ کند؛ خروجی حاوی راز را منتشر نکن.

تمرین: مقایسه کن stop، restart و up پس از تغییر image چه اثری دارند. برای deployment قابل تکرار، imageها را با digest ثبت‌شده ثابت و tag جدید را ابتدا بررسی کن.

بازگشت: docker compose -p lab305 down شبکه و containerهای پروژه را جمع می‌کند. گزینهٔ -v volumeهای نام‌دار تعریف‌شده را هم حذف می‌کند؛ برای پروژهٔ دارای داده بدون backup از آن استفاده نکن.

منبع: Compose specification ، ترتیب شروع ، secretها .