Шпаргалка по Docker CLI

Справочник: Все команды Docker CLI на одной странице. Ctrl+F для поиска.

Containers — жизненный цикл

КомандаОписание
docker run [opts] <image>Создать и запустить контейнер
docker run -d --name app nginxЗапустить в фоне с именем
docker run --rm -it alpine shОдноразовый интерактивный контейнер (удалится после выхода)
docker start <container>Запустить остановленный контейнер
docker stop <container>Остановить: SIGTERM → 10s → SIGKILL
docker stop -t 30 <container>Остановить с таймаутом 30 сек
docker kill <container>Убить немедленно (SIGKILL)
docker restart <container>Перезапустить
docker pause / unpauseЗаморозить / разморозить процессы (SIGSTOP/SIGCONT)
docker rm <container>Удалить остановленный контейнер
docker rm -f <container>Удалить работающий контейнер
docker rm $(docker ps -aq)Удалить все остановленные контейнеры
docker rename old newПереименовать контейнер
docker wait <container>Ждать завершения, вернуть exit code
docker update --memory=1g <c>Обновить лимиты на лету

Ключевые флаги docker run

docker run -d \                     # фон (detached)
  --name app \                      # имя контейнера
  --rm \                            # удалить после остановки
  -p 127.0.0.1:8080:80 \           # порт: только localhost
  -p 3000:3000 \                    # порт: все интерфейсы
  -v mydata:/app/data \             # named volume
  -v $(pwd)/src:/app/src \          # bind mount (код → hot reload)
  --tmpfs /tmp:size=100m \          # tmpfs в RAM
  -e NODE_ENV=production \          # переменная окружения
  --env-file .env \                 # переменные из файла
  --network mynet \                 # подключить к сети
  --restart unless-stopped \        # политика перезапуска
  --user 1001:1001 \               # запуск от UID:GID
  --read-only \                     # read-only корневая ФС
  --cap-drop=ALL \                  # сбросить все capabilities
  --security-opt no-new-privileges \# запрет повышения привилегий
  --memory=512m \                   # лимит RAM
  --cpus=1.0 \                      # лимит CPU
  --pids-limit=100 \                # лимит процессов
  --init \                          # tini как PID 1 (правильные сигналы)
  --health-cmd "wget -q --spider http://localhost:3000" \
  --health-interval 30s \
  --health-timeout 5s \
  myapp:latest

Containers — операции и отладка

КомандаОписание
docker psЗапущенные контейнеры
docker ps -aВсе контейнеры (включая остановленные)
docker ps -qТолько ID (для скриптов)
docker ps --filter status=exitedТолько завершённые
docker ps --format '{{.Names}}\t{{.Status}}'Кастомный формат
docker logs <container>Логи (STDOUT + STDERR)
docker logs -f <container>Логи в реальном времени
docker logs --since 1hЛоги за последний час
docker logs --tail 100Последние 100 строк
docker exec -it <c> shShell внутри контейнера
docker exec -it <c> /bin/bashBash внутри (если есть)
docker exec -u root <c> shShell от root (даже если USER != root)
docker exec <c> envПоказать переменные окружения
docker cp <c>:/app/log.txt .Скопировать файл из контейнера
docker cp ./fix.sh <c>:/tmp/Скопировать файл в контейнер
docker inspect <container>Полный JSON конфигурации
docker statsCPU/RAM/Net/IO всех контейнеров (live)
docker stats --no-streamОдин снимок (для скриптов)
docker top <container>Процессы внутри контейнера
docker diff <container>Изменённые файлы (A=add, C=change, D=delete)
docker port <container>Показать маппинг портов
docker attach <container>Подключиться к STDOUT (Ctrl+P,Q для отсоединения)

Полезные --format шаблоны

# IP-адрес контейнера
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <c>
 
# Exit code
docker inspect -f '{{.State.ExitCode}}' <c>
 
# OOM Killed?
docker inspect -f '{{.State.OOMKilled}}' <c>
 
# Healthcheck статус
docker inspect -f '{{.State.Health.Status}}' <c>
 
# Все переменные окружения
docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' <c>
 
# Bind mounts
docker inspect -f '{{range .Mounts}}{{.Source}} → {{.Destination}}{{println}}{{end}}' <c>
 
# Время запуска
docker inspect -f '{{.State.StartedAt}}' <c>
 
# Restart count
docker inspect -f '{{.RestartCount}}' <c>
 
# Таблица: имя, статус, порты
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

Images

КомандаОписание
docker imagesСписок локальных образов
docker images -qТолько ID
docker images --filter dangling=trueТолько <none> образы
docker pull <image>Скачать из Registry
docker pull nginx:1.25-alpineКонкретная версия
docker push <image>Отправить в Registry
docker build -t app:v1 .Собрать из Dockerfile
docker build -f Dockerfile.prod .Указать файл
docker build --target runner .Собрать до конкретного stage
docker build --no-cache .Без кэша (полная пересборка)
docker tag src:v1 registry/src:v1Добавить тег
docker rmi <image>Удалить образ
docker rmi $(docker images -q -f dangling=true)Удалить все <none>
docker history <image>Слои образа с размерами
docker history --no-trunc <image>Полные команды слоёв
docker save -o app.tar app:v1Экспорт в tar (оффлайн перенос)
docker load -i app.tarИмпорт из tar
docker image pruneУдалить dangling образы
docker image prune -aУдалить все неиспользуемые

BuildKit и Buildx

# Включить BuildKit (если не по умолчанию)
export DOCKER_BUILDKIT=1
 
# Сборка с инлайн-кэшем
docker build --build-arg BUILDKIT_INLINE_CACHE=1 .
 
# Сборка для другой платформы
docker buildx build --platform linux/amd64,linux/arm64 -t app:v1 --push .
 
# Просмотр билдеров
docker buildx ls
 
# Создать новый билдер (для multi-platform)
docker buildx create --name mybuilder --use
docker buildx inspect --bootstrap
 
# Кэш в GitHub Actions
docker buildx build \
  --cache-from type=gha \
  --cache-to type=gha,mode=max \
  -t app:latest --push .
 
# Очистка кэша сборщика
docker builder prune
docker builder prune -a    # весь кэш

Volumes

КомандаОписание
docker volume create mydataСоздать том
docker volume lsСписок томов
docker volume inspect mydataДетали (путь на хосте)
docker volume rm mydataУдалить (данные потеряются!)
docker volume pruneУдалить все неиспользуемые

Практические примеры

# Просмотреть содержимое volume
docker run --rm -v mydata:/data alpine ls -la /data
 
# Бэкап volume в tar
docker run --rm -v mydata:/data -v $(pwd):/backup alpine \
  tar czf /backup/mydata-backup.tar.gz -C /data .
 
# Восстановление volume из tar
docker run --rm -v mydata:/data -v $(pwd):/backup alpine \
  tar xzf /backup/mydata-backup.tar.gz -C /data
 
# Копирование volume → volume
docker run --rm -v src:/from -v dst:/to alpine sh -c 'cp -a /from/. /to/'
 
# Узнать размер volume
docker system df -v | grep mydata

Networks

КомандаОписание
docker network create mynetСоздать bridge-сеть
docker network create -d overlay mynetOverlay (Swarm)
docker network create --subnet 172.28.0.0/16 mynetС кастомной подсетью
docker network lsСписок сетей
docker network inspect mynetДетали: подсеть, контейнеры
docker network connect mynet <c>Подключить контейнер к сети
docker network disconnect mynet <c>Отключить от сети
docker network rm mynetУдалить сеть
docker network pruneУдалить неиспользуемые сети

Диагностика сети

# К каким сетям подключён контейнер
docker inspect <c> -f '{{json .NetworkSettings.Networks}}' | python3 -m json.tool
 
# Какие контейнеры в сети
docker network inspect mynet \
  -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{println}}{{end}}'
 
# DNS-резолвинг изнутри
docker exec <c> nslookup db
 
# Пинг между контейнерами
docker exec app ping -c 2 db
 
# Тяжёлая артиллерия — netshoot
docker run --rm -it --network mynet nicolaka/netshoot
# Внутри: dig, nslookup, tcpdump, iperf, curl, nmap
 
# Проверить iptables-правила Docker
sudo iptables -t nat -L DOCKER -n
sudo iptables -L DOCKER-USER -n

System & Cleanup

КомандаОписание
docker infoСистемная информация
docker versionВерсия клиента и сервера
docker system dfИспользование диска
docker system df -vДетально (каждый образ/volume)
docker system pruneУдалить: stopped containers + dangling images + unused networks
docker system prune -a+ все неиспользуемые образы
docker system prune -a --volumes+ неиспользуемые volumes (⚠ осторожно!)
docker system eventsПоток событий в реальном времени
docker system events --filter type=containerТолько события контейнеров
docker builder pruneОчистить кэш BuildKit
docker builder prune -aВесь кэш (может освободить десятки GB)

Сколько занимает Docker

# Общая сводка
docker system df
 
# Топ-10 образов по размеру
docker images --format '{{.Size}}\t{{.Repository}}:{{.Tag}}' | sort -hr | head -10
 
# Размер логов каждого контейнера
for c in $(docker ps -q); do
  name=$(docker inspect -f '{{.Name}}' $c | sed 's|^/||')
  log=$(docker inspect -f '{{.LogPath}}' $c)
  size=$(du -sh "$log" 2>/dev/null | awk '{print $1}')
  echo "$size $name"
done | sort -hr

Docker Compose

КомандаОписание
docker compose up -dСобрать + запустить в фоне
docker compose up --buildПересобрать образы перед запуском
docker compose up --force-recreateПересоздать контейнеры
docker compose downОстановить + удалить контейнеры и сети
docker compose down -v+ удалить volumes (⚠ данные!)
docker compose down --rmi all+ удалить образы
docker compose logs -fЛоги всех сервисов (live)
docker compose logs -f appЛоги одного сервиса
docker compose psСтатус сервисов
docker compose exec app shShell внутри сервиса
docker compose run --rm app npm testОдноразовый запуск команды
docker compose buildТолько собрать, не запускать
docker compose pullСкачать образы из registry
docker compose configВалидация + итоговый YAML
docker compose config --servicesСписок сервисов
docker compose topПроцессы всех сервисов
docker compose cp app:/log.txt .Копировать файл из сервиса
docker compose --profile debug upЗапустить с профилем
docker compose -f compose.yaml -f compose.prod.yaml upMerge нескольких файлов
docker compose up -d --scale app=33 реплики сервиса
docker compose up -d --no-deps --build appОбновить один сервис
docker compose restart appПерезапустить без пересоздания

Однострочники (One-Liners)

# Остановить все контейнеры
docker stop $(docker ps -q)
 
# Удалить все остановленные контейнеры
docker container prune -f
 
# Удалить все <none> образы
docker image prune -f
 
# Удалить ВСЁ (контейнеры, образы, volumes, networks, cache)
docker system prune -a --volumes -f
 
# IP всех запущенных контейнеров
docker ps -q | xargs -I{} docker inspect \
  -f '{{.Name}} {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {}
 
# Контейнеры с exit code != 0
docker ps -a --filter "exited=1" --format "table {{.Names}}\t{{.Status}}"
 
# Контейнеры, использующие больше всего RAM
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}" | sort -k2 -hr
 
# Следить за событиями
docker events --filter type=container \
  --format '{{.Time}} {{.Action}} {{.Actor.Attributes.name}}'
 
# Найти контейнер по порту
docker ps --filter "publish=8080"
 
# Перезапустить все unhealthy контейнеры
docker ps --filter health=unhealthy -q | xargs -r docker restart
 
# Обнулить логи контейнера
truncate -s 0 $(docker inspect -f '{{.LogPath}}' <container>)
 
# Сколько слоёв в образе
docker inspect <image> --format '{{len .RootFS.Layers}}'
 
# Дата сборки образа
docker inspect <image> --format '{{.Created}}'
 
# Экспорт переменных из контейнера
docker exec app env | grep -E '^(DB_|REDIS_|API_)' > .env.extracted

daemon.json — рекомендуемые настройки

Файл: /etc/docker/daemon.json (создать если нет). После изменения: sudo systemctl restart docker.

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "default-address-pools": [
    {"base": "172.17.0.0/12", "size": 24}
  ],
  "no-new-privileges": true,
  "live-restore": true,
  "userland-proxy": false
}
ПараметрЗачем
log-optsРотация логов — без этого Docker заполнит диск
default-address-poolsИзбежать конфликтов подсетей с VPN/LAN
no-new-privilegesЗапрет SUID/SGID для всех контейнеров
live-restoreКонтейнеры продолжают работать при рестарте демона
userland-proxy: falseОтключить docker-proxy, только iptables — быстрее