Ответ
docker run
и docker exec
решают разные задачи, связанные с жизненным циклом контейнера.
-
docker run
: Создает и запускает новый контейнер из указанного образа. Эта команда инициирует основной процесс контейнера (определенный вCMD
илиENTRYPOINT
Dockerfile). -
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 ) |
Жизненный цикл | Начинает новый жизненный цикл | Работает в рамках существующего |
Основной процесс | Запускает основной процесс контейнера | Не затрагивает основной процесс |