У меня есть файл docker-compose.yml с двумя контейнерами:
containerA:
...
ports:
- "80:9000"
containerB:
...
links:
- containerA
Я ожидал, что у меня будет containerA
доступен через порт 80 из containerB
, но он доступен только через порт 9000. Порт 80 виден только с хост-машины.
Есть ли способ сделать контейнер containerA
9000 портов, доступных через 80 портов для всех контейнеров, с которыми он связан, а не только для хост-машины?
Когда вы открываете порт с помощью ports
раздел файла создания докеров, вы указываете host:container
отображение, поэтому ожидается, что 9000 в контейнере будут доступны только через 80 на хосте.
Вы можете открыть порт напрямую для других контейнеров https://docs.docker.com/compose/yml/#expose, но вы не можете указать номер внешнего порта, только 9000 (не 80).
Другой вариант - использовать шаблон посла, в котором у вас есть «представитель», который является посредником от потребителя к провайдеру. https://docs.docker.com/articles/ambassador_pattern_linking/
Итак, контейнер B -> посол контейнера A -> контейнер A
Вы можете выставить порт 80 на посланнике, а затем посол может подключиться к порту 9000 контейнера A.
По мере создания более сложной инфраструктуры вы можете проявить больше творчества в отношении реестров служб, так что контейнеры обнаруживают друг друга через реестр служб, а не через простые ссылки на контейнеры.
Однако, как правило, вам не следует указывать внешний порт напрямую. Если вы это сделаете и попытаетесь запустить несколько копий контейнера на одном хосте докеров, вы получите конфликты портов. Или, если вы используете другой контейнер, который пытается открыть тот же внешний порт, вы также получите конфликты портов.