Чем отличаются команды docker run и docker exec

Ответ

docker run и docker exec решают разные задачи, связанные с жизненным циклом контейнера.

  • docker run: Создает и запускает новый контейнер из указанного образа. Эта команда инициирует основной процесс контейнера (определенный в CMD или ENTRYPOINT Dockerfile).

  • docker exec: Выполняет дополнительную команду внутри уже запущенного контейнера. Это не влияет на основной процесс контейнера, а запускает новый параллельно.

Практический пример:

  1. Запускаем новый контейнер с веб-сервером Nginx в фоновом режиме:

    # Создаем и запускаем контейнер с именем 'web-server'
    docker run -d --name web-server nginx
  2. Выполняем команду внутри этого контейнера, чтобы посмотреть содержимое директории /usr/share/nginx/html:

    # Запускаем 'ls -l' внутри контейнера 'web-server'
    docker exec web-server ls -l /usr/share/nginx/html
  3. Получаем интерактивный доступ к оболочке контейнера для отладки:

    # Подключаемся к bash-сессии внутри контейнера
    docker exec -it web-server bash

Ключевые отличия:

Критерий docker run docker exec
Цель Создать и запустить новый контейнер Выполнить команду в существующем контейнере
Объект Образ (e.g., nginx) Запущенный контейнер (e.g., web-server)
Жизненный цикл Начинает новый жизненный цикл Работает в рамках существующего
Основной процесс Запускает основной процесс контейнера Не затрагивает основной процесс