Files
server-tools/bash/docker_info.sh

87 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ==============================================================================
# Скрипт: docker_info.sh
# Описание: Выводит подробную информацию о запущенных Docker-контейнерах,
# включая порты, IP, физическое расположение данных и потребление ресурсов (CPU/RAM).
# ==============================================================================
set -e
# Настраиваем цвета
BLUE='\033[1;34m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
MAGENTA='\033[1;35m' # Добавили новый цвет для ресурсов
NC='\033[0m'
echo -e "${BLUE}=== Анализ запущенных Docker контейнеров ===${NC}\n"
# Проверяем, установлен ли Docker
if ! command -v docker &> /dev/null; then
echo -e "${YELLOW}Ошибка: Docker не установлен на этом сервере.${NC}"
exit 1
fi
# Получаем список ID всех запущенных контейнеров
CONTAINERS=$(docker ps -q)
if [ -z "$CONTAINERS" ]; then
echo -e "${GREEN}В данный момент нет запущенных контейнеров.${NC}"
exit 0
fi
echo -e "${YELLOW}Собираю данные о потреблении ресурсов (это займет 1-2 секунды)...${NC}\n"
# Делаем моментальный снимок ресурсов (без непрерывного потока) для всех контейнеров сразу
# Формат: ID|CPU|RAM
STATS=$(docker stats --no-stream --format "{{.ID}}|{{.CPUPerc}}|{{.MemUsage}}")
# Перебираем каждый контейнер
for CONTAINER_ID in $CONTAINERS; do
# Базовая информация
NAME=$(docker inspect --format '{{.Name}}' "$CONTAINER_ID" | sed 's/\///')
IMAGE=$(docker inspect --format '{{.Config.Image}}' "$CONTAINER_ID")
STATE=$(docker inspect --format '{{.State.Status}}' "$CONTAINER_ID")
IP=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$CONTAINER_ID")
PORTS=$(docker ps --filter "id=$CONTAINER_ID" --format "{{.Ports}}")
# Вытаскиваем ресурсы именно для текущего контейнера из нашего снимка
# Ищем строку, которая начинается с ID текущего контейнера
CONTAINER_STAT=$(echo "$STATS" | grep "^${CONTAINER_ID}")
CPU_USAGE=$(echo "$CONTAINER_STAT" | cut -d'|' -f2)
MEM_USAGE=$(echo "$CONTAINER_STAT" | cut -d'|' -f3)
echo -e "${CYAN}📦 Контейнер:${NC} ${GREEN}$NAME${NC} (ID: ${CONTAINER_ID:0:12})"
echo -e " ├─ ${YELLOW}Образ:${NC} $IMAGE"
echo -e " ├─ ${YELLOW}Статус:${NC} $STATE"
# Выводим потребление ресурсов
echo -e " ├─ ${MAGENTA}Ресурсы:${NC} CPU: ${CPU_USAGE:-0.00%} | RAM: ${MEM_USAGE:-0B / 0B}"
# Обрабатываем IP
if [ -z "$IP" ]; then IP="Не назначен (host network?)"; fi
echo -e " ├─ ${YELLOW}Сеть:${NC} IP: $IP"
# Обрабатываем порты
if [ -z "$PORTS" ]; then PORTS="Нет проброшенных портов"; fi
echo -e " ├─ ${YELLOW}Порты:${NC} $PORTS"
echo -e " └─ ${YELLOW}Расположение данных (Mounts):${NC}"
# Получаем пути
MOUNTS=$(docker inspect --format '{{range .Mounts}}{{println .Source " -> " .Destination}}{{end}}' "$CONTAINER_ID")
if [ -z "$MOUNTS" ]; then
echo -e " ${NC}Данные хранятся только внутри контейнера${NC}"
else
echo "$MOUNTS" | while IFS= read -r line; do
if [ -n "$line" ]; then
echo -e " 📁 $line"
fi
done
fi
echo "" # Пустая строка для красоты
done
echo -e "${BLUE}=== Анализ завершен ===${NC}"