87 lines
4.0 KiB
Bash
87 lines
4.0 KiB
Bash
#!/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}" |