Начальный ~20 мин чтения

docker run: порты, тома и переменные окружения

Урок 3 из 6 в курсе Docker для разработчика

docker run: порты, тома и переменные окружения

запуск контейнеров с настройкой портов, постоянного хранилища данных и конфигурации через переменные окружения

Почему это важно: контейнеры эфемерны — данные внутри них исчезают при остановке. Тома и env-переменные — основа продакшен-конфигурации

Главная идея

контейнер изолирован; для доступа снаружи нужен маппинг портов; для постоянства данных — тома; для конфигурации — переменные окружения

Как это выглядит на практике

  1. docker run -p 8080:3000 myapp — порт 8080 хоста маппится на порт 3000 контейнера.
  2. docker run -e DATABASE_URL=postgres://... myapp — передаём конфигурацию без хардкода в образ.
  3. docker run -v /data/postgres:/var/lib/postgresql/data postgres — данные БД сохраняются на хосте.
  4. docker run -d --name myapp --restart unless-stopped myapp — daemon-режим с автоперезапуском.
  5. docker logs myapp, docker exec -it myapp sh — просмотр логов и интерактивная сессия.

Что происходит под капотом

  • Маппинг портов реализован через iptables-правила; Docker автоматически их добавляет.
  • Named volumes хранятся в /var/lib/docker/volumes; bind mounts привязывают конкретную папку хоста.
  • Переменные окружения передаются процессу контейнера при старте; видны в /proc//environ.
  • docker exec создаёт новый процесс в существующих namespaces контейнера.
  • --restart политики: no, on-failure, always, unless-stopped.

Типичные ошибки и заблуждения

  • Ошибка: данные в контейнере сохраняются при его удалении. docker rm удаляет и файловую систему контейнера.
  • Ошибка: -p 3000 и -p 3000:3000 — одно и то же. Без хостового порта Docker назначает случайный.
  • Ошибка: ENV в Dockerfile и -e при запуске одинаковы по приоритету. -e переопределяет ENV из Dockerfile.
  • Ошибка: --rm и -d несовместимы. --rm удаляет контейнер после остановки; удобно для одноразовых задач.

Ключевые выводы

  • Контейнеры эфемерны: данные без тома теряются при docker rm.
  • Конфигурация — через env-переменные, не хардкод в образ.
  • -p host:container — маппинг портов; без него контейнер не доступен снаружи.
  • docker logs и docker exec — основные инструменты диагностики.

Термины урока

Volume (том): механизм для постоянного хранения данных вне файловой системы контейнера.
Bind mount: привязка конкретной директории хоста к контейнеру.
Port mapping: перенаправление порта хоста на порт контейнера (-p host:container).
Environment variable: переменная окружения для конфигурации контейнера (-e KEY=VALUE).
docker exec: выполнение команды внутри запущенного контейнера.

Связь с работой backend-разработчика

Никогда не храните секреты (пароли, ключи) в образе или Dockerfile. Передавайте их через переменные окружения из secrets manager или .env файла, который в .gitignore.

Мини-разбор реальной ситуации

Команда деплоит PostgreSQL в контейнере без тома. После обновления образа все данные теряются. Правило: любая БД в контейнере — только с named volume. Production-данные никогда не должны жить только внутри контейнера.

Что запомнить

  • Тома нужны для любых данных, которые должны пережить перезапуск контейнера.
  • Секреты — через env-переменные, не в образ.
  • docker logs и docker exec — первые команды при отладке.

Итог

docker run — мощная команда. Понимание портов, томов и env-переменных достаточно для запуска большинства сервисов в контейнере.