Структура команды docker run

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

Опции до image обрабатывает Docker CLI. Всё после image заменяет CMD image и передаётся процессу контейнера.

docker run \
  --name demo-app \
  --detach \
  --publish 8080:8080 \
  --env APP_MODE=demo \
  --network demo-net \
  --mount type=volume,src=demo-data,dst=/var/lib/demo \
  --memory 512m \
  demo-app:1.0 \
  --server.port=8080

Здесь --server.port=8080 — аргумент приложения, а не Docker.

Частые опции

ОпцияСмысл
--nameустойчивое имя контейнера
-d, --detachне подключать терминал к процессу
-itstdin плюс псевдотерминал
--rmудалить контейнер после остановки
-p host:containerопубликовать порт
-e KEY=valueпередать environment
--networkподключить сеть
--mountявно описать volume/bind/tmpfs
--memory, --cpusограничить ресурсы
--entrypointзаменить ENTRYPOINT

ENTRYPOINT задаёт исполняемую программу, CMD — команду по умолчанию или её аргументы. Переопределять --entrypoint стоит для диагностики, а не как постоянный обход неверного image.

Диагностика итоговой команды

docker inspect demo-app \
  --format '{{json .Config.Entrypoint}} {{json .Config.Cmd}}'

Если контейнер завершается, смотрю exit code и error:

docker inspect demo-app \
  --format 'exit={{.State.ExitCode}} error={{.State.Error}}'

Типичные сбои

  • Поставить Docker option после image: он уйдёт приложению.
  • Перепутать порядок hostPort:containerPort.
  • Передать секрет через CLI и оставить его в history/process list.
  • Запустить shell, которого нет в minimal image.
  • Использовать --rm и потерять контейнер до чтения его metadata; logs зависят от logging driver.

Вопросы для собеседования

Что делает docker run? Создаёт контейнер из image и запускает его.

Что находится после имени image? Команда и аргументы процесса контейнера, а не опции Docker.

Чем CMD отличается от ENTRYPOINT? ENTRYPOINT задаёт executable, CMD — значения по умолчанию, легко заменяемые аргументами run.

Зачем ограничивать memory? Чтобы один контейнер не вытеснил соседей; приложение должно корректно учитывать лимит.

См. Docker, Фоновый и интерактивный режим запуска контейнеров.