docker run: порты, тома и переменные окружения
запуск контейнеров с настройкой портов, постоянного хранилища данных и конфигурации через переменные окружения
Почему это важно: контейнеры эфемерны — данные внутри них исчезают при остановке. Тома и env-переменные — основа продакшен-конфигурации
Главная идея
контейнер изолирован; для доступа снаружи нужен маппинг портов; для постоянства данных — тома; для конфигурации — переменные окружения
Как это выглядит на практике
- docker run -p 8080:3000 myapp — порт 8080 хоста маппится на порт 3000 контейнера.
- docker run -e DATABASE_URL=postgres://... myapp — передаём конфигурацию без хардкода в образ.
- docker run -v /data/postgres:/var/lib/postgresql/data postgres — данные БД сохраняются на хосте.
- docker run -d --name myapp --restart unless-stopped myapp — daemon-режим с автоперезапуском.
- 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 — основные инструменты диагностики.
Термины урока
Связь с работой backend-разработчика
Никогда не храните секреты (пароли, ключи) в образе или Dockerfile. Передавайте их через переменные окружения из secrets manager или .env файла, который в .gitignore.
Мини-разбор реальной ситуации
Команда деплоит PostgreSQL в контейнере без тома. После обновления образа все данные теряются. Правило: любая БД в контейнере — только с named volume. Production-данные никогда не должны жить только внутри контейнера.
Что запомнить
- Тома нужны для любых данных, которые должны пережить перезапуск контейнера.
- Секреты — через env-переменные, не в образ.
- docker logs и docker exec — первые команды при отладке.
Итог
docker run — мощная команда. Понимание портов, томов и env-переменных достаточно для запуска большинства сервисов в контейнере.