Docker Compose برای پروژههای کوچک: الگویی که هر بار استفاده میکنم
برای پروژهای که روی یک سرور اجرا میشود، Kubernetes زیادهروی است. یک فایل compose.yaml با چند سرویس، همراه با nginx روی میزبان، سالهاست برای من جواب داده.
فایل پایه
services:
app:
image: registry.example.ir/myapp:1.4.2
restart: unless-stopped
env_file: .env
ports:
- "127.0.0.1:3000:3000"
depends_on:
db:
condition: service_healthy
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myapp
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myapp"]
interval: 5s
timeout: 3s
retries: 10
volumes:
db_data:
secrets:
db_password:
file: ./secrets/db_password
چرا اینطور نوشته شده
- برچسب image دقیق است، نه
latest. باlatestنمیدانید چه نسخهای در حال اجراست و برگشتن به نسخهی قبل سخت میشود. - درگاه برنامه فقط روی
127.0.0.1منتشر شده. داکر قواعد فایروال را دور میزند، پس3000:3000یعنی باز برای همهی اینترنت. - پایگاه داده اصلاً درگاهی منتشر نمیکند. سرویسهای یک فایل compose در یک شبکهی داخلیاند و برنامه با نام
dbبه آن وصل میشود. depends_onبهتنهایی فقط ترتیب شروع را تضمین میکند، نه آماده بودن را. باcondition: service_healthyبرنامه تا وقتی پایگاه داده واقعاً جواب بدهد منتظر میماند.- دادهها در یک volume نامدار است. با
docker compose downمیماند؛ فقطdown -vپاکش میکند، پس آن-vرا از سر عادت ننویسید.
دستورهای روزمره
docker compose up -d
docker compose ps
docker compose logs -f app
docker compose pull && docker compose up -d
docker compose exec db psql -U myapp
up -d فقط سرویسهایی را دوباره میسازد که پیکربندی یا image آنها عوض شده، پس اجرای دوبارهاش بیخطر است.
لاگها دیسک را پر میکنند
راهانداز پیشفرض لاگ داکر هیچ سقفی ندارد. در /etc/docker/daemon.json بگذارید:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
بعد systemctl restart docker. این تنظیم فقط روی کانتینرهایی که از این به بعد ساخته میشوند اثر دارد.