Ответ
docker run и docker exec решают разные задачи, связанные с жизненным циклом контейнера.
-
docker run: Создает и запускает новый контейнер из указанного образа. Эта команда инициирует основной процесс контейнера (определенный вCMDилиENTRYPOINTDockerfile). -
docker exec: Выполняет дополнительную команду внутри уже запущенного контейнера. Это не влияет на основной процесс контейнера, а запускает новый параллельно.
Практический пример:
-
Запускаем новый контейнер с веб-сервером Nginx в фоновом режиме:
# Создаем и запускаем контейнер с именем 'web-server' docker run -d --name web-server nginx -
Выполняем команду внутри этого контейнера, чтобы посмотреть содержимое директории
/usr/share/nginx/html:# Запускаем 'ls -l' внутри контейнера 'web-server' docker exec web-server ls -l /usr/share/nginx/html -
Получаем интерактивный доступ к оболочке контейнера для отладки:
# Подключаемся к bash-сессии внутри контейнера docker exec -it web-server bash
Ключевые отличия:
| Критерий | docker run |
docker exec |
|---|---|---|
| Цель | Создать и запустить новый контейнер | Выполнить команду в существующем контейнере |
| Объект | Образ (e.g., nginx) |
Запущенный контейнер (e.g., web-server) |
| Жизненный цикл | Начинает новый жизненный цикл | Работает в рамках существующего |
| Основной процесс | Запускает основной процесс контейнера | Не затрагивает основной процесс |