Команда docker container run или docker run создает и запускает контейнер из образа, а если образ еще не скачан — скачает.
Базовый синтаксис команды выглядит следующим образом:
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARGS...]
OPTIONS — опции запуска контейнера. В этой части команды указываются все базовые параметры: маппинг портов, настройки сети и DNS, лимиты по ресурсам (CPU/RAM), переменные окружения, монтирование томов, hostname, политика перезапуска и многое другое.
IMAGE[:TAG] — образ (и, опционально, тег), из которого будет создан контейнер. Если тег не указан, по умолчанию используется latest.
COMMAND — команда, которая будет выполнена внутри контейнера при запуске. Если ее не указать, Docker возьмет команду по умолчанию из образа (CMD или ENTRYPOINT плюс CMD).
ARGS — аргументы, которые будут переданы в COMMAND. Если COMMAND не задана явно, аргументы дополняют команду по умолчанию из образа (CMD).
Команда docker run тесно связана с инструкциями сборки образа, которые указываются в Dockerfile и могут быть просмотрены с помощью команды docker image history. В Dockerfile задаются дефолтные настройки образа: базовый образ (FROM), рабочая директория (WORKDIR), переменные окружения (ENV), предполагаемые порты (EXPOSE), точки монтирования томов (VOLUME), команда по умолчанию (CMD) и, при необходимости, жесткая точка входа (ENTRYPOINT).
При запуске docker run можно либо использовать дефолтные значения как есть, либо переопределить или дополнить их опциями запуска. Наиболее частые соответствия приведены в таблице:
| Инструкции Dockerfile | Опция сборки контейнера | Связь инструкций с командами сборки |
| EXPOSE — описывает, какие порты слушает приложение внутри контейнера. | -p — в явной форме публикует порты наружу. | Инструкция EXPOSE 80 говорит о том, что контейнер слушает внутри порт 80, но без -p 8080:80 порт не будет доступен снаружи. |
| VOLUME — показывает точку монтирования тома. | -v/--volume — реально привязывает к указанной точке монтирования том или папку хоста. | Без -v данные будут храниться внутри контейнера и пропадут при его удалении. |
| WORKDIR — задает рабочую директорию образа. | -w/--workdir — может временно переопределить рабочую директорию. | Полезно, когда нужно запустить команду из другой папки, не меняя Dockerfile. |
| ENV — задает дефолтные переменные окружения. | -e/--env — дополняет и переопределяет дефолтные переменные окружения. | Позволяет задавать секреты и конфиги (пароли, URL БД) отдельно от образа. |
| CMD — задает команду по умолчанию. | При выполнении docker run IMAGE запускается дефолтная команда CMD из образа, а при docker run IMAGE other args эти other args заменяют или дополняют CMD (в зависимости от ее формы в Dockerfile). | Помогает запускать один и тот же образ с разными режимами работы (например, обычный старт или выполнение миграций). |
| ENTRYPOINT — исполняемый файл, который будет запущен при старте контейнера. | При выполнении docker run IMAGE args Docker передаст args как аргументы в ENTRYPOINT. Полностью переопределить точку входа можно только явным указанием --entrypoint в docker run. | Позволяет зафиксировать основную команду, а через docker run управлять только аргументами и режимами ее работы. |
Перед тем как продумывать команду запуска контейнера, полезно заглянуть в документацию образа (например, на Docker Hub) и посмотреть, какие инструкции заданы в Dockerfile. Для локально имеющегося образа можно посмотреть историю слоев, включая инструкции сборки, командой docker image history image_name.
Чтобы больше узнать об инструкциях сборки образа и лучше понять зависимость между параметрами образа и командой запуска контейнера, рекомендуем ознакомиться с документацией по Dockerfile.
Опции запуска контейнера (OPTIONS)
Полный и детальный список всех доступных опций запуска контейнеров дан в официальной документации Docker. Ниже — самые часто используемые опции docker run с краткими примерами.
-d, --detach — запуск контейнера в фоновом режиме с выводом ID контейнера. Пример: docker run -d nginx — веб-сервер работает как сервис, не блокируя терминал.
-p, --publish — публикация портов контейнера на хост. Пример: docker run -p 8080:80 nginx — маппинг порта 80 внутри контейнера на порт 8080 хоста для доступа извне.
-v, --volume — монтирование тома или директории хоста в контейнер. Пример: docker run -v /host/data:/container/data mysql — данные БД сохраняются на хосте.
Том — это отдельная область хранения данных, которую Docker может создавать и подключать к контейнерам. В случае краткой записи -v /host/data:/container/data слева указывается путь на хосте, справа — путь внутри контейнера. Все, что приложение пишет в /container/data, фактически попадает в /host/data.
Как «зайти» на том:
- с хоста — просто посмотрите содержимое директории /host/data обычными средствами ОС;
- из контейнера — зайдите в контейнер (docker exec -it контейнер bash) и работайте с /container/data.
Чтобы приложение в контейнере в реальном времени видело изменения на диске разработчика, достаточно примонтировать локальную папку проекта:
docker run -d --name app \
-v $(pwd):/app \
-w /app \
myuser/myapp:latest
-w, --workdir — установить рабочую директорию внутри контейнера перед выполнением команды. Пример: docker run -v $(pwd):/app -w /app myuser/myapp:latest — контейнер стартует в каталоге /app, и все относительные пути (например, при запуске python app.py) считаются относительно этой директории.
-e, --env — установка переменных окружения. Пример: docker run -e DB_PASSWORD=secret mysql — конфигурирование приложения без изменения образа.
--memory — ограничение памяти контейнера. Пример: docker run --memory=512m nginx — защита от перерасхода RAM.
--cpus — ограничение доступных контейнеру CPU. Пример: docker run --cpus=1.0 nginx — контроль вычислительных ресурсов.
--network — выбор Docker-сети, к которой будет подключен контейнер. Пример: docker run --network mynet nginx — контейнер общается с другими сервисами в сети mynet. Если указать сеть mynet, а она еще не создана, Docker вернет ошибку network mynet not found, и контейнер не запустится. Сеть должна быть создана заранее командой docker network create mynet.
--restart — политика перезапуска контейнера при выходе. Пример: docker run --restart=always nginx — контейнер автоматически перезапускается Docker’ом.
--name — назначение имени контейнеру. Пример: docker run --name my-nginx nginx — удобнее управлять контейнером по имени.
--rm — автоматическое удаление контейнера при завершении работы. Пример: docker run --rm alpine echo "test" — временный контейнер для разового запуска без мусора.
Обычно опций запуска контейнера много, и их записывают с переносом строки через \ — так команда остается читаемой. Приведем многострочную команду запуска Nginx в контейнере и кратко опишем значение опций:
docker run -d --name nginx-ssl \
-p 80:80 \
-p 443:443 \
-v /srv/nginx/conf.d:/etc/nginx/conf.d:ro \
-v /srv/nginx/certs:/etc/nginx/certs:ro \
-v /srv/nginx/html:/usr/share/nginx/html:ro \
nginx:latest
Что происходит в этом примере:
- -d — запуск контейнера в фоновом режиме.
- --name nginx-ssl — понятное имя контейнера, по которому к нему проще обращаться (docker logs nginx-ssl, docker stop nginx-ssl и т.д.).
- -p 80:80 и -p 443:443 — маппинг стандартных HTTP- и HTTPS-портов контейнера на хост. Слева от двоеточия — внешний порт (хост, VPS), справа — порт приложения внутри контейнера. По сути, маппинг связывает внешние и внутренние порты.
- -v /srv/nginx/conf.d:/etc/nginx/conf.d:ro, -v /srv/nginx/certs:/etc/nginx/certs:ro, -v /srv/nginx/html:/usr/share/nginx/html:ro — монтирование конфигов Nginx, сертификатов и статики в контейнер в режиме только чтения (ro, read only).
- nginx:latest — официальный образ Nginx, который использует смонтированные конфиги, сертификаты и файлы сайта для раздачи HTTP/HTTPS.