PRO

Что такое networks в Docker? Как контейнеры общаются между собой?

Docker network — это виртуальная сеть для контейнеров. Контейнеры в одной пользовательской сети могут обращаться друг к другу по имени контейнера или имени Compose-сервиса, поэтому вместо IP-адресов обычно используют адреса вида db:5432 или redis:6379.
Подробный ответ

Что такое Docker network

Docker network объединяет контейнеры в изолированную виртуальную сеть. Она определяет, какие контейнеры могут взаимодействовать друг с другом и каким образом они получают сетевые адреса.

Сети в Docker Compose

Compose автоматически создаёт default network для сервисов проекта. Поэтому backend может обращаться к PostgreSQL по имени сервиса db, а не по IP-адресу.

services:
  web:
    build: .
    environment:
      DATABASE_HOST: db
    depends_on:
      - db

  db:
    image: postgres:16

Внутри контейнера web строка подключения может использовать адрес db:5432.

Пользовательские сети

Для разделения сервисов можно явно объявить несколько сетей. Например, Nginx и backend могут находиться в public network, а backend и база — во внутренней private network.

services:
  proxy:
    image: nginx:alpine
    networks:
      - public

  web:
    build: .
    networks:
      - public
      - private

  db:
    image: postgres:16
    networks:
      - private

networks:
  public:
  private:
    internal: true

Почему не нужно использовать IP

IP-адрес контейнера может измениться после пересоздания. Docker предоставляет внутреннее DNS-разрешение имён в пользовательских сетях, поэтому стабильнее обращаться по имени сервиса или контейнера.

Сеть и ports

Для связи контейнеров в одной сети не нужно публиковать порт через ports. Публикация порта нужна для доступа с хоста или извне Docker-сети. Например, backend может подключаться к db:5432, хотя PostgreSQL не опубликован наружу.

Как ответить на собеседовании

Docker networks изолируют и связывают контейнеры. В Docker Compose сервисы обычно попадают в общую default network и могут обращаться друг к другу по имени сервиса, например db:5432. Для безопасности я разделяю публичные и внутренние сервисы на разные сети и не публикую наружу порты базы данных без необходимости.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге