В docker-compose legacy yml, если вы связываете службу, которую он использовал для создания переменной среды servicename_PORT, которую вы могли бы использовать для обнаружения порта связанного контейнера. В новом формате v2 у нас есть определенные пользователем сети, которые добавляют имя службы во внутренний DNS и поэтому мы можем подключаться к связанным службам, но как мы обнаруживаем, что порт, связанный с сервисом? Единственный способ, с помощью которого я могу думать, - создать переменную окружения для каждой связанной службы, где я могу поместить порт, но тогда у меня будет тот же самый порт два раза в компоновке докеров: один раз в разделе экспонирования самой службы и один раз как переменная среды в службе, которая подключается к ней. Есть ли более суровый способ обнаружения открытого порта?Как найти открытый порт связанного сервиса с форматом Docker Compose v2?
ответ
Для этого обычно использовать регистратор + сервис обнаружить, это означает, что услуги, как https://www.consul.io/регистраторе
В основном, это добавляет API для вас либо смотреть Kv магазин для вас сервиса определений (порт/ip), который затем может быть случайным или даже использовать DNS, включенный в консул. Последнее не поможет с портами, для чего вы используете реестр.
Если вы хотите уклониться от этой оптимальной практики. установите гнездо док-станции и используйте docker inspect <servicename>
, чтобы найти порт.
services:
other:
container_name: foo
image: YYYY
theonedoingthelookup:
image: ZZZZ
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Вам нужно будет иметь инструмент докер Cli, установленный в контейнере, а затем запустить это внутри контейнера ZZZZ
docker inspect YYYY
Используйте некоторые Grep/AWK/фильтры для извлечения информации, необходимой
Это какой-то порт службы работает как в контейнере. Сопоставления портов не применяются к контейнеру < -> контейнерная связь, только хост < -> контейнерная связь.
Например:
version: '2'
services:
a:
...
networks:
- my-net
b:
...
networks:
- my-net
networks:
my-net:
Допустим a
запущен веб-сервер на порту 8080
, b
бы быть в состоянии поразить его, отправив запрос на a:8080
.
Проблема в том, что b не знает, на каком порту a работает служба. С устаревшей компоновкой связывания порт был открыт в переменной среды name_PORT. Теперь нет возможности «b» узнать открытый порт, если все, что он знает, это имя службы (то есть «a»). –
Какую услугу вы используете в 'a'? Разве порт не статичен? – johnharris85
A может быть любой услугой, «b» - просто прокси, я хочу, чтобы он был общим. @ Нижеприведенный ниже ответ EugenMayer делает трюк для меня с использованием сокета. –