IIUC см. Документацию здесь:
https://docs.docker.com/compose/networking
Вам не нужно открывать каждый из портов службы на хосте, если только вы не хотите получать к ним доступ с хоста, т. Е. Вне созданной docker-compose сети.
Порты должны быть уникальными для каждого хоста , но каждая служба в вашей созданной docker-compose сети может безнаказанно использовать один и тот же порт и на него ссылаются:.
В примере Docker может быть 2 службы Postgres. Каждому потребуется уникальное имя: db1
; db2
, но оба могут использовать один и тот же порт - "5432" и быть уникально адресуемыми из службы, называемой web
(и друг с другом), как db1:8432
и db2:8432
.
Каждый сервис эффективно соответствует отдельному хосту. Таким образом, если порты уникальны для каждого хоста службы, все в порядке. И если все порты, которые вы выставляете на хосте, уникальны, вы тоже хороши ...
Расширяя пример, db1
может предоставить порт 9432:8432
, но тогда db2
потребуется найти другой порт хоста для использования, возможно, 9433:8432
.
В созданной docker-compose сети вы получите доступ к db1
как db1:8432
и db2
как db2:8432
.
С хоста (вне сети создания docker-compose) вы получите доступ к db1
как localhost:9432
и db2
как localhost:9433
.
NB Вероятно, хорошей практикой является предоставление сервисным портам хоста только тогда, когда эти сервисы должны быть доступны извне (например, web
, вероятно, должен быть открыт, но dbX
, вероятно, не должен быть открыт) , Возможно, вы захотите быть более либеральным в предоставлении сервисных портов при отладке.