Освоение 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 для временных запусков.