Docker
راهنمای جامع 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 و مسیر بازگشت مستند. |