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-ранеры пишут кеш образов и слоёв сборки постоянно, и диск съедается молча. Мои меры:

  1. Принудительная чистка после каждого деплоя — в after_script джобы сборки образа: docker image prune -f && docker builder prune -af --filter until=72h
  2. Системный таймер (не cron, чтобы при пропуске не накопить):
    systemctl enable --now docker-cleanup.timer   # unit ниже
    
    # /etc/systemd/system/docker-cleanup.timer
    [Timer]
    OnCalendar=daily
    Persistent=true
    [Install]
    WantedBy=timers.target
    
    А в сервисе — docker system prune -f && docker builder prune -af --filter until=168h.
  3. Мониторинг: алерт, когда / больше 80%. Диск всегда заканчивается в пятницу вечером, закон подлости не отменяли.

И ещё: docker stats — первое, что смотрю, когда хост «подтормаживает». Показывает, кто ест CPU и память прямо сейчас.