Как работают сети в Docker и что делает публикация портов (-p)?
Контейнеры, volumes и сети
Сети Docker определяют, как контейнеры общаются между собой и с внешним миром.
Драйверы
- bridge (по умолчанию) — виртуальная сеть на хосте, контейнеры в ней видят друг друга. В пользовательской bridge-сети работает разрешение по имени контейнера.
- host — контейнер использует сеть хоста без изоляции.
- none — без сети.
Публикация порта
Контейнер доступен снаружи только после проброса порта:
docker run -d -p 8080:80 nginx
# хост:8080 → контейнер:80Строка EXPOSE в Dockerfile документирует порт, но сама по себе ничего не публикует.
Связь контейнеров
docker network create appnet
docker run -d --network appnet --name db postgres:16
docker run -d --network appnet -e DB_HOST=db myapp # обращение по имени dbПодвохи
- Внутри контейнера
localhost— это сам контейнер, а не хост и не соседний сервис. - Не публикуйте порты базы данных наружу без необходимости.
Коротко для собеседования
Контейнеры в одной пользовательской сети обращаются друг к другу по имени, а снаружи доступны только опубликованные порты -p хост:контейнер.