Как правильно прокинуть порты в docker-compose?

В Docker Compose существует несколько способов прокинуть порты для контейнеров.

1. Наиболее распространенный способ - это использование директивы ports в файле docker-compose.yml. Директива ports предназначена для прокидывания портов из контейнеров в хост-систему. Например, если ваш контейнер прослушивает порт 8080, вы можете прокинуть его на порт 8080 хост-системы, указав следующую строку:

   version: '3'
   services:
     app:
       image: myapp:latest
       ports:
         - 8080:8080

В этом примере контейнер будет доступен по адресу http://localhost:8080.

Также можно указать только порт хост-системы, а порт контейнера автоматически выберется случайным образом:

   version: '3'
   services:
     app:
       image: myapp:latest
       ports:
         - 8080

Docker автоматически прокинет порт контейнера на случайно выбранный доступный порт хост-системы.

2. В дополнении к использованию директивы ports, Docker Compose также поддерживает директиву expose. Она позволяет контейнерам взаимодействовать друг с другом без явного отображения портов на хост-системе. Порты, указанные в директиве expose, доступны только внутри сети, созданной Docker Compose, и не видны извне. Например:

   version: '3'
   services:
     app:
       image: myapp:latest
       expose:
          - 8080

В этом примере порт 8080 будет доступен для других контейнеров внутри сети, но не будет доступен напрямую извне.

3. Если вам нужно пробросить порт только между контейнерами, и не нужно прокидывать его на хост-систему, вы можете использовать внутренние сети Docker Compose. В этом случае порт будет доступен только внутри сети и не будет прокинут на хост-систему. Например:

   version: '3'
   services:
     app1:
       image: myapp1:latest
       networks:
         - mynetwork
       expose:
         - 8080

     app2:
        image: myapp2:latest
        networks:
          - mynetwork
   
   networks:
     mynetwork:

В этом примере оба контейнера будут доступны в рамках сети mynetwork. Контейнер app2 сможет обращаться к контейнеру app1 по адресу app1:8080, но этот порт не будет доступен с хост-системы.

Надеюсь, эта информация поможет вам успешно прокинуть порты в Docker Compose.