Как в Docker хранить данные и как контейнеры общаются по сети?
- Чем volume отличается от bind mount?
- Почему контейнер не может подключиться к localhost?
Volume — хранилище под управлением Docker, переживает пересоздание контейнера (базы данных). Bind mount — каталог хоста внутрь контейнера (разработка, конфиги). Сеть: в пользовательской bridge-сети контейнеры видят друг друга по имени сервиса; localhost внутри контейнера — это сам контейнер, а не хост. Публикация порта -p 8080:80 открывает порт на хосте.
- Docker Compose создаёт общую сеть, обращаться по имени сервиса: postgres:5432
- Доступ к хосту из контейнера — host.docker.internal (Docker Desktop) или IP шлюза
- tmpfs — данные только в памяти
А ещё -p 0.0.0.0:5432 открывает БД всему миру; для локальной работы — 127.0.0.1:5432:5432
Подробно
Хранилища:
- volume — Docker хранит данные в своей области, удобно для БД и переносимо;
- bind mount — конкретный путь хоста, удобно для разработки (горячая перезагрузка кода), зависит от прав и структуры хоста;
- запись в файловую систему контейнера — теряется при пересоздании.
Сеть:
- сеть по умолчанию bridge — изолированная подсеть с NAT;
- в пользовательских сетях работает DNS по имени контейнера или сервиса;
network_mode: host— контейнер использует сеть хоста напрямую (только Linux).
Типичная ошибка: приложение в контейнере подключается к localhost:5432 и не находит базу, запущенную в соседнем контейнере или на хосте.
depends_on гарантирует порядок запуска, но не готовность сервиса — нужны healthcheck и повторные попытки подключения.
Пример
services:
api:
build: .
ports: ["127.0.0.1:8080:8080"]
environment:
DB_URL: postgres://postgres:5432/app # имя сервиса, а не localhost
depends_on: [postgres]
postgres:
image: postgres:16
volumes: ["pgdata:/var/lib/postgresql/data"]
volumes:
pgdata:Что хотят услышать
- Volume против bind mount.
- Сеть, DNS по именам и смысл localhost.
- Публикация портов и безопасность.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Данные в контейнере без тома переживают его пересоздание
- ✓Volume переживает пересоздание; контейнеры видят друг друга по имени сервиса
- ✗localhost внутри контейнера — это хост, на котором он запущен
- ✗Контейнеры видят друг друга только по IP-адресам из docker inspect
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.