Как использовать команду docker compose port для поиска проброшенных портов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker port для определения публичного порта, сопоставленного с сервисом Docker. Мы начнём с создания простого сервиса с пробросом портов, используя образ nginx.

После создания сервиса вы изучите, как найти публичный порт для всего сервиса, для конкретного протокола и для определённого индекса контейнера в рамках сервиса. Этот практический опыт даст вам навыки программного определения открытых портов для ваших Docker-контейнеров.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555085{{"Как использовать команду docker compose port для поиска проброшенных портов"}} docker/ps -.-> lab-555085{{"Как использовать команду docker compose port для поиска проброшенных портов"}} docker/port -.-> lab-555085{{"Как использовать команду docker compose port для поиска проброшенных портов"}} docker/pull -.-> lab-555085{{"Как использовать команду docker compose port для поиска проброшенных портов"}} docker/images -.-> lab-555085{{"Как использовать команду docker compose port для поиска проброшенных портов"}} end

Создание простого сервиса с пробросом портов

На этом шаге мы научимся создавать простой сервис с помощью Docker и пробрасывать порт из контейнера на хост-машину. Это позволяет получить внешний доступ к сервису, работающему внутри контейнера.

Сначала загрузим образ nginx из Docker Hub. Этот образ содержит легковесный веб-сервер, который мы будем использовать в нашем примере.

docker pull nginx

Вы увидите вывод, указывающий на загрузку образа. После завершения загрузки можно проверить наличие образа локально, выведя список образов:

docker images

Теперь запустим контейнер на основе образа nginx и пробросим порт 80 из контейнера на порт 8080 хост-машины. Флаг -d запускает контейнер в detached mode (в фоновом режиме), а флаг -p 8080:80 выполняет проброс портов.

docker run -d -p 8080:80 nginx

Эта команда запускает веб-сервер Nginx внутри Docker-контейнера и делает его доступным на порту 8080 вашей LabEx VM.

Чтобы убедиться, что контейнер работает и проброс портов функционирует, используйте команду docker ps для вывода списка работающих контейнеров. Найдите контейнер с образом nginx и проверьте колонку PORTS. Вы должны увидеть запись 0.0.0.0:8080->80/tcp.

docker ps

Наконец, вы можете получить доступ к стартовой странице Nginx, используя curl для запроса к localhost на порту 8080.

curl localhost:8080

В выводе вы увидите HTML-содержимое стандартной стартовой страницы Nginx. Это подтверждает, что контейнер работает и доступен через проброшенный порт.

Определение публичного порта сервиса

На предыдущем шаге мы создали Docker-контейнер и пробросили порт из контейнера на хост. Теперь давайте узнаем, как программно определить публичный порт, на котором доступен сервис. Это полезно, когда вы не помните, какой именно порт хоста был сопоставлен с внутренним портом контейнера.

Команда docker port специально предназначена для этой цели. Она отображает сопоставления портов для указанного контейнера. В качестве аргумента необходимо указать ID или имя контейнера.

Сначала получим ID запущенного контейнера Nginx. Можно использовать docker ps и отфильтровать вывод, либо просто скопировать ID из результатов команды docker ps предыдущего шага.

docker ps

Найдите контейнер с образом nginx и запишите его Container ID.

Теперь используйте команду docker port с указанием Container ID, чтобы увидеть сопоставления портов.

docker port [CONTAINER_ID]

Замените [CONTAINER_ID] на фактический ID вашего контейнера Nginx.

В выводе будет показан внутренний порт контейнера и соответствующий порт хоста, с которым он сопоставлен. Например, вы увидите что-то вроде 80/tcp -> 0.0.0.0:8080. Это означает, что внутренний порт 80 контейнера (по протоколу TCP) сопоставлен с портом 8080 на всех интерфейсах хоста (0.0.0.0).

Эта команда позволяет быстро определить публичный порт без необходимости изучать полную конфигурацию контейнера.

Определение публичного порта для конкретного протокола

На предыдущем шаге мы использовали docker port для поиска всех сопоставлений портов контейнера. Иногда контейнер может предоставлять доступ к нескольким портам с использованием разных протоколов (например, TCP и UDP). В этом шаге мы узнаем, как найти публичный порт для конкретного протокола.

Команда docker port позволяет указать внутренний порт контейнера и интересующий вас протокол. Формат команды: docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL].

Давайте найдем публичный порт для внутреннего порта 80 контейнера Nginx с использованием протокола TCP. Сначала убедитесь, что у вас есть Container ID из предыдущего шага. Если нет, вы можете получить его снова с помощью docker ps.

docker ps

Теперь используйте команду docker port с ID контейнера и указанием конкретного порта и протокола:

docker port [CONTAINER_ID] 80/tcp

Замените [CONTAINER_ID] на фактический ID вашего контейнера Nginx.

В выводе будет напрямую показан порт хоста, сопоставленный с внутренним портом 80 контейнера для протокола TCP, например 0.0.0.0:8080. Это более конкретно, чем просто выполнение docker port [CONTAINER_ID], которое выводит все сопоставления.

Это особенно полезно, когда контейнер предоставляет доступ к одному и тому же номеру порта для разных протоколов, а вам нужно сопоставление только для одного из них.

Определение публичного порта по конкретному индексу контейнера

В некоторых сложных сценариях контейнер может предоставлять доступ к одному и тому же внутреннему порту несколько раз, потенциально сопоставляя его с разными портами хоста или интерфейсами. Хотя это менее характерно для простых сервисов вроде Nginx, такая возможность существует. В подобных случаях команда docker port может возвращать несколько сопоставлений для одного внутреннего порта.

Чтобы получить конкретное сопоставление при наличии нескольких вариантов, можно использовать индекс. Вывод команды docker port для заданного внутреннего порта представляет собой список сопоставлений. Конкретное сопоставление можно получить по его индексу, начиная с 0.

Предположим для демонстрации, что наш контейнер Nginx имеет несколько сопоставлений для порта 80. Чтобы получить первое сопоставление (индекс 0), используйте следующий формат команды:

docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]/[INDEX]

В нашем примере с Nginx для получения первого сопоставления внутреннего порта 80 TCP следует использовать:

docker port [CONTAINER_ID] 80/tcp/0

Замените [CONTAINER_ID] на фактический ID вашего контейнера Nginx.

Поскольку наш контейнер Nginx имеет только одно сопоставление для порта 80/tcp, эта команда вернет тот же результат, что и docker port [CONTAINER_ID] 80/tcp, а именно 0.0.0.0:8080.

Хотя данный пример с Nginx не демонстрирует всю мощь индексации (поскольку существует только одно сопоставление), понимание этой возможности важно для более сложных конфигураций контейнеров, где могут существовать множественные сопоставления для одного внутреннего порта.

Итоги

В этой лабораторной работе мы научились создавать простой Docker-сервис с пробросом портов: загрузили образ Nginx, запустили контейнер и сопоставили порт 80 контейнера с портом 8080 хоста. Мы проверили статус контейнера и проброс портов с помощью docker ps, а также убедились в доступности сервиса, выполнив запрос к проброшенному порту хоста.

Затем мы изучили, как программно определить публичный порт сервиса с помощью команды docker port. Этот метод особенно полезен, когда проброшенный порт хоста заранее неизвестен. Данная команда позволяет получить порт хоста, соответствующий внутреннему порту контейнера.