#!/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}"