Как извлечь порт контейнера в Docker?

«Как извлечь порт контейнера в Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В работе с Docker мне часто нужно узнать, на какой хост-порт проброшен порт контейнера, для настройки балансировщиков или проверки связности. Использую несколько методов.

1. Команда docker port (самый прямой способ):

docker port <container_name_or_id> <container_port>
# Пример:
docker port my-nginx-container 80
# Вывод: 0.0.0.0:8080

Эта команда показывает маппинг только для явно опубликованных портов (флаг -p).

2. docker inspect с Go-шаблоном (для скриптов): Когда нужно программно получить порт в скрипте сборки или мониторинга:

# Получить хост-порт для контейнерного порта 80/tcp
docker inspect --format='{{(index (index .NetworkSettings.Ports "80/tcp") 0).HostPort}}' my-container

# Более надежный вариант, который обрабатывает случаи, когда порт не опубликован:
HOST_PORT=$(docker inspect my-container --format='{{range $p, $conf := .NetworkSettings.Ports}}{{(index $conf 0).HostPort}}{{end}}')
if [ -n "$HOST_PORT" ]; then
    echo "Port is mapped to: $HOST_PORT"
fi

3. Просмотр через docker ps: Часто бывает достаточно посмотреть колонку PORTS:

docker ps --format "table {{.Names}}t{{.Ports}}" --filter "name=my-container"

Практический контекст: В CI/CD пайплайне, после развертывания контейнера, я могу использовать docker port для динамического определения порта и запуска интеграционных тестов:

APP_PORT=$(docker port my-app 8080 | cut -d: -f2)
curl -f http://localhost:$APP_PORT/health

Важно: Для контейнеров в Docker Swarm или Kubernetes используются другие методы (сервисы, Ingress, kubectl get svc).