diff --git a/bash/docker_info.sh b/bash/docker_info.sh new file mode 100644 index 0000000..d548210 --- /dev/null +++ b/bash/docker_info.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# ============================================================================== +# Скрипт: docker_info.sh +# Описание: Выводит подробную информацию о запущенных Docker-контейнерах, +# включая их порты, IP-адреса и физическое расположение данных (Mounts). +# ============================================================================== + +set -e + +# Настраиваем цвета +BLUE='\033[1;34m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +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 + +# Перебираем каждый контейнер и вытаскиваем нужную информацию +for CONTAINER_ID in $CONTAINERS; do + # Используем docker inspect для точечного извлечения данных + 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") + STARTED=$(docker inspect --format '{{.State.StartedAt}}' "$CONTAINER_ID" | cut -d'.' -f1 | tr 'T' ' ') + IP=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$CONTAINER_ID") + PORTS=$(docker ps --filter "id=$CONTAINER_ID" --format "{{.Ports}}") + + echo -e "${CYAN}📦 Контейнер:${NC} ${GREEN}$NAME${NC} (ID: ${CONTAINER_ID:0:12})" + echo -e " ├─ ${YELLOW}Образ:${NC} $IMAGE" + echo -e " ├─ ${YELLOW}Статус:${NC} $STATE (Запущен: $STARTED)" + + # Обрабатываем IP, если он пустой (например, если используется сеть host) + 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}" + + # Получаем пути, куда примонтированы данные (Host -> Container) + MOUNTS=$(docker inspect --format '{{range .Mounts}}{{println .Source " -> " .Destination}}{{end}}' "$CONTAINER_ID") + + if [ -z "$MOUNTS" ]; then + echo -e " ${NC}Данные хранятся только внутри контейнера (нет внешних Mounts)${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}" \ No newline at end of file