Docker

From wiki karavi
Revision as of 12:05, 29 August 2026 by Karavi (talk | contribs) (Created page with "{{DISPLAYTITLE:راهنمای جامع Docker و مانیتورینگ Docker}} __TOC__ '''راهنمای جامع Docker و مانیتورینگ Docker''' یک مرجع عملی برای نصب، اجرای امن، مدیریت منابع و پایش کانتینرها است. دستورها برای Linux/macOS نوشته شده‌اند؛ در Windows می‌توان آن‌ها را در WSL2 یا Docker Desktop اجرا کرد. == پیش‌نیازها و نکات...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

راهنمای جامع Docker و مانیتورینگ Docker یک مرجع عملی برای نصب، اجرای امن، مدیریت منابع و پایش کانتینرها است. دستورها برای Linux/macOS نوشته شده‌اند؛ در Windows می‌توان آن‌ها را در WSL2 یا Docker Desktop اجرا کرد.

پیش‌نیازها و نکات ایمنی

  • بیشتر دستورها به دسترسی Docker نیاز دارند. در Linux افزودن کاربر به گروه docker عملاً دسترسی سطح بالا می‌دهد؛ این موضوع را مانند دسترسی مدیریتی در نظر بگیرید.
  • پیش از حذف image، volume یا داده، نام و وابستگی آن را بررسی کنید.
  • برای محیط Production، از tagهای مشخص، healthcheck، محدودیت منابع، لاگ چرخشی و backup استفاده کنید.
  • خروجی‌های نمونه در این صفحه تا حد ممکن به شکل جدول نمایش داده شده‌اند؛ خروجی واقعی به نسخه و وضعیت میزبان وابسته است.

نصب و بررسی اولیه

مراحل رسمی نصب را از مستندات توزیع خود دنبال کنید. پس از نصب:

docker version
docker info
docker run --rm hello-world
دستور کاربرد
docker version نسخه Client و Server را نشان می‌دهد.
docker info وضعیت daemon، storage driver، تعداد منابع و محدودیت‌های کلی را نشان می‌دهد.
docker run --rm hello-world نصب و دسترسی به daemon را آزمایش می‌کند.

مفاهیم پایه

مفهوم توضیح
Image الگوی فقط‌خواندنی برای ساخت کانتینر.
Container نمونه در حال اجرای یک image با filesystem و process مستقل.
Registry مخزن image مانند Docker Hub یا registry خصوصی.
Network مسیر ارتباطی بین کانتینرها و میزبان.
Volume محل پایدار برای نگهداری داده خارج از چرخه عمر کانتینر.
Docker daemon سرویس پس‌زمینه‌ای که image، container و network را مدیریت می‌کند.

مدیریت Image

docker pull nginx:alpine
docker image ls
docker image inspect nginx:alpine
docker image history nginx:alpine
docker tag nginx:alpine registry.example.com/team/nginx:1.0
docker image rm nginx:alpine
docker image prune
عملیات دستور نکته
دریافت docker pull IMAGE:TAG tag مشخص استفاده کنید؛ از latest برای انتشار حساس پرهیز کنید.
فهرست docker image ls imageهای محلی را نشان می‌دهد.
بررسی docker image inspect IMAGE metadata و digest را نشان می‌دهد.
حذف docker image rm IMAGE فقط imageهای بدون وابستگی را حذف کنید.
پاک‌سازی docker image prune imageهای dangling را حذف می‌کند.

ساخت Image با Dockerfile

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "-m", "http.server", "8000"]
docker build --pull -t sample-app:1.0 .
docker image inspect sample-app:1.0

مدیریت Container

docker run -d --name web -p 8080:80 nginx:alpine
docker ps
docker ps -a
docker start web
docker stop web
docker restart web
docker rename web web-old
docker rm web-old

Network

docker network ls
docker network create app-net
docker network inspect app-net
docker network connect app-net web
docker network disconnect app-net web
docker network rm app-net

در Compose، سرویس‌ها معمولاً با نام سرویس یکدیگر را resolve می‌کنند؛ مثلاً postgres:5432، نه localhost. استفاده از network اختصاصی، جداسازی سرویس‌ها را ساده‌تر می‌کند.

Volume و نگهداری داده

docker volume ls
docker volume create app-data
docker volume inspect app-data
docker run -d --name db -v app-data:/var/lib/postgresql/data postgres:16
docker volume rm app-data

حذف volume برگشت‌پذیر نیست. برای داده‌های مهم ابتدا backup بگیرید و وجود mount و permission را بررسی کنید.

Docker Compose

نمونه فایل compose.yaml:

services:
  web:
    image: nginx:1.27-alpine
    ports:
      - "8080:80"
    networks: [app]
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O - http://localhost/ || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 3
  redis:
    image: redis:7-alpine
    networks: [app]
networks:
  app:
docker compose config
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f --tail=100
docker compose exec web sh
docker compose restart web
docker compose down

logs، inspect و exec

docker logs --tail=100 web
docker logs --since=30m --timestamps web
docker logs -f web
docker inspect web
docker inspect --format '{{.State.Status}} {{.State.Health.Status}}' web
docker exec -it web sh
docker exec web env
docker cp web:/etc/nginx/nginx.conf ./nginx.conf

برای جلوگیری از پرشدن دیسک، در daemon یا Compose از log rotation استفاده کنید:

logging:
  driver: json-file
  options:
    max-size: "10m"
    max-file: "5"

healthcheck

healthcheck فقط زنده‌بودن process را ثابت نمی‌کند؛ باید مسیر یا وابستگی اصلی را با timeout کوتاه بررسی کند.

docker inspect --format '{{json .State.Health}}' web
docker ps --format 'table {{.Names}}	{{.Status}}	{{.Ports}}'
وضعیت تفسیر اقدام
starting هنوز تعداد آزمون لازم کامل نشده است. کمی صبر و سپس بررسی log.
healthy healthcheck موفق است. با smoke test مسیر واقعی نیز تأیید شود.
unhealthy healthcheck شکست خورده است. log، dependency، DNS، پورت و منابع را بررسی کنید.

محدودیت منابع

docker run -d --name api --memory=512m --memory-swap=512m --cpus=1.5 --pids-limit=200 api:1.0
docker update --memory=1g --cpus=2 api
docker inspect --format '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}' api

در Production برای هر سرویس limit و در صورت نیاز reservation تعریف کنید. OOM شدن را با docker inspect و رویدادهای kernel بررسی کنید.

مانیتورینگ سریع

docker stats

نمایش زنده همه کانتینرها:

docker stats

نمایش یک‌باره با فرمت جدول استاندارد:

docker stats --no-stream

فقط کانتینرهای منتخب:

docker stats --no-stream web db redis

مرتب‌سازی بر اساس بیشترین CPU با خروجی جدولی

(printf "NAME	CPU %%	MEM USAGE / LIMIT	MEM %%
"; docker stats --no-stream --format '{{.Name}}	{{.CPUPerc}}	{{.MemUsage}}	{{.MemPerc}}' | sort -t$'	' -k2 -hr) | column -t -s $'	'

مرتب‌سازی بر اساس بیشترین درصد RAM

(printf "NAME	CPU %%	MEM USAGE / LIMIT	MEM %%
"; docker stats --no-stream --format '{{.Name}}	{{.CPUPerc}}	{{.MemUsage}}	{{.MemPerc}}' | sort -t$'	' -k4 -hr) | column -t -s $'	'

نسخه قابل ذخیره

docker stats --no-stream --format '{{.Name}},{{.CPUPerc}},{{.MemUsage}},{{.MemPerc}},{{.NetIO}},{{.BlockIO}}' | sort -t, -k4 -hr > docker-stats.txt

MemUsage معمولاً به شکل مصرف / limit و با واحدهایی مانند MiB یا GiB است. برای مرتب‌سازی قابل‌اعتماد، از MemPerc استفاده کنید؛ مقایسه مستقیم رشته‌های اندازه حافظه به‌دلیل تفاوت واحدها خطاپذیر است.

top، events و system df

docker top web
docker events --since 30m
docker events --filter type=container
docker system df
docker system df -v

prune و پاک‌سازی کنترل‌شده

ابتدا preview بگیرید و سپس حذف کنید:

docker system df
docker container prune
docker image prune
docker builder prune
docker volume prune
docker system prune

docker system prune -a --volumes بسیار مخرب است و می‌تواند imageها و volumeهای بدون استفاده را حذف کند. در محیط Production بدون فهرست‌برداری، backup و مجوز تغییر اجرا نشود.

Backup و Restore

backup از volume

docker run --rm -v app-data:/source -v "$PWD":/backup alpine sh -c 'tar czf /backup/app-data.tgz -C /source .'

restore به volume

docker run --rm -v app-data:/target -v "$PWD":/backup alpine sh -c 'tar xzf /backup/app-data.tgz -C /target'

برای دیتابیس، dump منطقی مانند pg_dump معمولاً از tar خام volume قابل‌اعتمادتر است. Restore را در محیط جداگانه آزمایش کنید.

عیب‌یابی

نشانه بررسی‌های پیشنهادی
کانتینر فوراً خارج می‌شود docker logs، command، exit code، env و permission.
پورت پاسخ نمی‌دهد docker ps، mapping پورت، bind address، firewall و healthcheck.
مصرف RAM زیاد docker stats، OOM، limit، memory leak و cache.
ارتباط سرویس‌ها قطع است network مشترک، DNS نام سرویس، پورت داخلی و policy شبکه.
دیسک پر شده docker system df -v، log rotation، image و volume.
restart loop docker inspect، restart policy، dependency و readiness.
build کند است Dockerfile layerها، .dockerignore، cache و حجم context.
docker inspect --format '{{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}' web
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
docker port web
docker diff web
docker cp web:/var/log/app.log ./app.log

امنیت پایه

  • imageها را از registry معتبر دریافت و digest آن‌ها را pin کنید.
  • از اجرای process با کاربر root درون کانتینر پرهیز کنید؛ در Dockerfile از USER استفاده کنید.
  • secret را در Dockerfile، image layer، command line، environment عمومی یا log قرار ندهید.
  • capabilityهای غیرضروری را حذف و filesystem را در صورت امکان read-only کنید.
  • پورت‌های مدیریتی را عمومی نکنید و network را حداقل‌گرا نگه دارید.
  • image scan، patch منظم، SBOM، امضای image و بررسی license را در pipeline قرار دهید.
  • socket فایل /var/run/docker.sock را بدون درک ریسک به کانتینر mount نکنید.
  • daemon، kernel و imageهای پایه را به‌روز نگه دارید و دسترسی کاربران را audit کنید.

پایش عملکرد در Production

حوزه شاخص‌های مهم
CPU مصرف فعلی، throttling، load و تعداد process.
Memory مصرف، limit، نسبت مصرف، OOM kill و page fault.
Disk اندازه writable layer، volume، image، log و inode.
Network RX/TX، خطا، drop، latency و connection count.
Application نرخ درخواست، latency، خطا، صف، dependency و health.
Runtime restart count، uptime، exit code و health transition.

پایش دوره‌ای ساده:

while true; do
  date -Is
  docker stats --no-stream --format 'table {{.Name}}	{{.CPUPerc}}	{{.MemUsage}}	{{.MemPerc}}	{{.NetIO}}	{{.BlockIO}}'
  sleep 10
done

برای مشاهده طولانی‌مدت، خروجی را به سامانه‌ای مانند Prometheus/Grafana یا سرویس مانیتورینگ سازمانی ارسال کنید. صرفاً ذخیره‌کردن متن docker stats جایگزین متریک‌های time-series و alerting نیست.

مجموعه دستورهای مرجع

docker ps --format 'table {{.Names}}	{{.Image}}	{{.Status}}	{{.Ports}}'
docker system df -v
docker inspect --format '{{.Name}} {{.State.Status}} {{.State.Health.Status}}' $(docker ps -q)
docker stats --no-stream
docker events --since 15m --filter type=container
docker logs --since=15m --tail=200 --timestamps CONTAINER

چک‌لیست انتشار

مورد وضعیت مورد انتظار
Image tag/digest مشخص، scan شده و بدون secret.
Container کاربر غیرroot، limit منابع و restart policy مناسب.
Network فقط ارتباط‌های لازم و بدون پورت مدیریتی عمومی.
Data volume مشخص، backup و restore آزمایش‌شده.
Health healthcheck معتبر و smoke test مسیر واقعی.
Logs timestamp، سطح مناسب، rotation و حذف داده حساس.
Monitoring alert برای OOM، restart، health، دیسک، CPU و latency.
Rollback image قبلی، migration و مسیر بازگشت مستند.

مراجع

رده:Docker رده:مانیتورینگ رده:DevOps