Освоение Docker Run: Объяснение основных опций команды

Изучите наиболее часто используемые флаги Docker run: порты, тома, переменные окружения, имена, фоновый режим, политики перезапуска и очистка.

Освоение Docker Run: основные параметры команд, объясненные

docker run создает новый контейнер из образа и запускает его. Команда выглядит просто на первый взгляд, но параметры определяют, как ваш контейнер подключается к сети, хранит данные, получает конфигурацию и ведет себя после перезапуска.

Используйте это руководство, когда вы знаете образ, который хотите запустить, но вам нужны правильные флаги для практической настройки.

Базовый синтаксис

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

IMAGE — это имя образа, например nginx или postgres:16. COMMAND и ARG... являются необязательными и переопределяют или расширяют команду образа по умолчанию.

Для быстрого теста в режиме переднего плана:

docker run hello-world

Для реальных сервисов обычно добавляют параметры.

Запуск в фоновом режиме с помощью -d

По умолчанию Docker подключает ваш терминал к выводу контейнера. Отсоединенный режим запускает контейнер в фоновом режиме:

docker run -d nginx

Docker выводит идентификатор нового контейнера и возвращает приглашение. Проверьте его с помощью:

docker ps

Чтение логов из отсоединенного контейнера:

docker logs <container_id_or_name>

Публикация портов с помощью -p

Контейнеры имеют собственное сетевое пространство имен. Если служба прослушивает внутри контейнера, опубликуйте порт, чтобы получить к нему доступ с вашего хоста:

docker run -d -p 8080:80 nginx

Это сопоставляет порт хоста 8080 с портом контейнера 80, так что http://localhost:8080 обращается к Nginx.

Вы можете опубликовать более одного порта:

docker run -d -p 8080:80 -p 8443:443 nginx

Чтобы привязать только к localhost на хосте, укажите IP-адрес хоста:

docker run -d -p 127.0.0.1:8080:80 nginx

Это полезно для локальных инструментов, которые вы не хотите открывать на всех интерфейсах хоста.

Сохранение данных с помощью томов

Слои записи контейнера не подходят для долговременных данных. Используйте bind mount, когда вы хотите смонтировать определенный путь хоста в контейнер:

docker run -d -p 8080:80 -v "$PWD/html:/usr/share/nginx/html:ro" nginx

Это обслуживает файлы из вашей локальной директории html. Суффикс :ro делает монтирование доступным только для чтения внутри контейнера.

Используйте именованный том, когда Docker должен управлять местоположением хранилища:

docker run -d --name postgres -v pgdata:/var/lib/postgresql/data postgres:16

Если pgdata не существует, Docker создает его. Просмотрите тома с помощью:

docker volume ls

Для новой работы синтаксис Docker --mount более подробный, но понятный:

docker run -d --mount type=volume,src=pgdata,dst=/var/lib/postgresql/data postgres:16

Передача конфигурации с помощью -e и --env-file

Переменные окружения — это распространенный способ настройки контейнеризированных приложений:

docker run -d -e APP_ENV=production my-custom-app:latest

Используйте -e несколько раз для нескольких переменных:

docker run -d -e DB_HOST=database.example.com -e DB_USER=app my-app:latest

Для многих переменных используйте файл окружения:

docker run -d --env-file ./app.env my-app:latest

Храните секреты вне зафиксированных файлов .env. Переменные окружения легко просматривать с хоста и из процессов с достаточным доступом, поэтому используйте менеджер секретов вашей платформы для конфиденциальных значений в продакшене.

Именование контейнеров с помощью --name

Docker может сгенерировать имя, но понятное имя упрощает последующие команды:

docker run -d --name web -p 8080:80 nginx

Затем вы можете использовать:

docker logs web
docker stop web
docker exec -it web sh

Имена контейнеров должны быть уникальными. Если web уже существует, удалите или переименуйте старый контейнер перед повторным использованием имени.

Использование интерактивного режима с помощью -it

Для оболочек и сеансов устранения неполадок объедините интерактивный режим и псевдо-TTY:

docker run -it ubuntu bash

Когда вы выходите из оболочки, контейнер останавливается. Добавьте --rm для одноразовых сеансов:

docker run --rm -it alpine sh

Выбор политики перезапуска

Политики перезапуска сообщают Docker, что делать, когда контейнер завершает работу:

docker run -d --name web --restart unless-stopped -p 8080:80 nginx

Распространенные политики:

  • no: не перезапускать автоматически. Это значение по умолчанию.
  • on-failure[:max-retries]: перезапускать только после ненулевого кода выхода.
  • always: перезапускать всякий раз, когда контейнер останавливается, в том числе после перезапуска демона Docker.
  • unless-stopped: перезапускать, если вы явно не остановили контейнер.

Для долго работающих локальных сервисов unless-stopped часто лучше подходит, чем always, потому что ручная остановка остается уважаемой.

Удаление одноразовых контейнеров с помощью --rm

Остановленные контейнеры остаются на диске, пока вы их не удалите. Для одноразовых команд --rm очищает контейнер после его завершения:

docker run --rm ubuntu echo "Hello from a temporary container"

Не используйте --rm для контейнеров, остановленное состояние которых вам нужно проверить позже.

Практический пример

Эта команда запускает веб-приложение с стабильным именем, опубликованным портом, смонтированной директорией логов, переменной окружения и политикой перезапуска:

docker run -d \
  --name my-app \
  --restart on-failure \
  -p 3000:80 \
  -v "$PWD/logs:/app/logs" \
  -e NODE_ENV=production \
  my-node-app:1.0

После запуска проверьте контейнер и просмотрите логи:

docker ps
docker logs my-app

Вывод

Начните с самой маленькой команды docker run, которая работает, затем добавьте параметры для нужного поведения: -d для фоновых сервисов, -p для доступа, -v или --mount для данных, -e для конфигурации, --name для операций, --restart для отказоустойчивости и --rm для временных запусков.