Пошук уроків, статей та іншого контенту
Мережева ізоляція контейнерів за замовчуванням, звернення за іменем сервісу та проброс портів назовні.
Кожен контейнер за замовчуванням має власний, ізольований мережевий простір — застосунок в одному контейнері не бачить напряму мережеві порти застосунку в іншому контейнері, якщо їх явно не з'єднати спільною мережею Docker.
docker network create my-app-network
docker run -d --name db --network my-app-network postgres:16
docker run -d --name api --network my-app-network my-api-imageКонтейнери в тій самій мережі Docker можуть звертатись один до одного за іменем контейнера — Docker надає вбудований DNS, що резолвить ім'я контейнера db у його внутрішню IP-адресу всередині цієї мережі, без потреби знати чи хардкодити реальну IP-адресу:
// Усередині контейнера api — звернення до контейнера db за іменем, не за IP
const client = new Client({ host: "db", port: 5432 });Мережа Docker з'єднує контейнери між собою, але не робить їх автоматично доступними ззовні (з браузера на машині розробника, з інтернету). -p <порт хоста>:<порт контейнера> явно прокидає порт контейнера назовні:
docker run -d -p 5434:5432 --name db postgres:16
# Тепер localhost:5434 на хості веде до порту 5432 усередині контейнераУ цьому проєкті саме так налаштований локальний PostgreSQL: docker-compose.yml прокидає порт бази даних контейнера на 5434 хоста (а не типовий 5432 — щоб не конфліктувати з локально встановленим PostgreSQL, якщо такий є), і саме на localhost:5434 у DATABASE_URL звертається застосунок, запущений напряму на машині розробника.
Інструкція EXPOSE у Dockerfile лише документує, який порт застосунок усередині образу типово слухає, — вона сама по собі нічого не прокидає назовні. Реальний проброс порту відбувається лише через прапорець -p (чи еквівалентну секцію ports у Docker Compose) під час запуску контейнера.
Очікувати, що контейнери в різних Docker-мережах (чи взагалі без спільної мережі) бачать один одного за замовчуванням, — мережева ізоляція за замовчуванням, а не винятковий випадок.
Плутати EXPOSE у Dockerfile з реальним пробросом порту — EXPOSE суто документаційний, реальний ефект дає лише -p при запуску.
Прокидати порт бази даних чи іншого внутрішнього сервісу назовні (-p) без реальної потреби — розширює поверхню атаки, роблячи внутрішній сервіс доступним ззовні мережі контейнерів, коли зазвичай туди має звертатись лише інший контейнер тієї самої мережі.
Контейнери ізольовані мережево за замовчуванням; спільна Docker-мережа дозволяє контейнерам звертатись один до одного за іменем через вбудований DNS, без хардкоджених IP-адрес. -p явно прокидає порт контейнера на порт хоста для доступу ззовні мережі контейнерів — EXPOSE у Dockerfile сам по собі цього не робить, лише документує намір.