Вопрос с собеседования · DevOps

Как в Docker хранить данные и как контейнеры общаются по сети?

JuniorDocker и контейнеры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 минут бесплатно.

Разбор собеседования