Структура команды 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 | не подключать терминал к процессу |
-it | stdin плюс псевдотерминал |
--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, Фоновый и интерактивный режим запуска контейнеров.