Docker: мои команды и пара граблей
Собираю команды, к которым возвращаюсь постоянно, плюс то, во что вляпывался.
Порядок записи команд
Тут меня однажды запутал сам синтаксис: флаги управляют docker'ом, аргументы — контейнером.
# docker <управление> <команда> <флаги docker'а> <имя> <образ> <команда контейнера>
docker container run -d --name web --restart unless-stopped -p 80:80 -v /data:/srv:ro caddy:2-alpine
docker run -it --rm -v /opt:/mnt:ro alpine sh # классика для подглядывания в хостовые папки
docker exec -it web sh # зайти в живой контейнер
docker exec -u runner -it web sh # от имени конкретного пользователя — важно для отладки прав
В compose порядок похожий, но там свои грабли: путь в volumes: резолвится относительно файла compose — мы с этим на днях воювали на проде.
Логи
docker logs -f web # следить в реальном времени
docker logs --tail 100 web # последние 100 строк
docker logs --since 10m web # за последние 10 минут
docker compose -f docker-compose.prod.yml logs -f web
Чистка системы
Самая частая причина «диск полон» на хосте с раннерами:
docker system df # что вообще занимает место
docker system prune -f # високосные контейнеры, сети, старый кеш сборки
docker system prune -af # ПЛЮС все неиспользуемые образы — осторожно, оттуда же потом пулить
docker builder prune -af --filter until=72h # кеш buildkit старше трёх суток — безопаснее
docker volume prune -f # висячие волюмы: сперва df, потом это
Как я ограничиваю раздувание от ранеров
GitLab-ранеры пишут кеш образов и слоёв сборки постоянно, и диск съедается молча. Мои меры:
- Принудительная чистка после каждого деплоя — в after_script джобы сборки образа:
docker image prune -f && docker builder prune -af --filter until=72h - Системный таймер (не cron, чтобы при пропуске не накопить):
systemctl enable --now docker-cleanup.timer # unit ниже
А в сервисе —# /etc/systemd/system/docker-cleanup.timer [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.targetdocker system prune -f && docker builder prune -af --filter until=168h. - Мониторинг: алерт, когда / больше 80%. Диск всегда заканчивается в пятницу вечером, закон подлости не отменяли.
И ещё: docker stats — первое, что смотрю, когда хост «подтормаживает». Показывает, кто ест CPU и память прямо сейчас.