Ответ
В работе с 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).