db:5432 или redis:6379.
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. Для безопасности я разделяю публичные и внутренние сервисы на разные сети и не публикую наружу порты базы данных без необходимости.
Оцени свой прогресс