В чем разница команд docker run и docker start
Что проверяют
Понимаете ли вы жизненный цикл контейнера: образ, созданный контейнер, запущенный, остановленный. Следом обычно спрашивают, как поменять порт или переменную окружения у уже созданного контейнера и что будет с данными после перезапуска.
Как отвечать
Короткая формула: docker run это docker create плюс docker start (и docker pull, если образа нет). Дальше раскройте разницу:
docker run: принимает образ и создаёт из него новый контейнер со своим записываемым слоем. Здесь задаётся вся конфигурация:-p 8080:8080,-e SPRING_PROFILES_ACTIVE=prod,-v,--name,--memory,--restart. По умолчанию процесс идёт на переднем плане, флаг-dотправляет его в фон,--rmудаляет контейнер после остановки;docker start: принимает имя или ID уже существующего контейнера в статусеcreatedилиexitedи запускает его с той конфигурацией, что была задана при создании. Своих опций у него почти нет:-aподключает вывод,-iввод. По умолчанию команда сразу возвращает управление;- состояния:
created,running,paused,restarting,exited,dead, увидеть их можно черезdocker ps -a.
Для Java-сервиса это значит следующее. Хотите поменять JAVA_TOOL_OPTIONS, лимит памяти или порт: контейнер придётся пересоздать через docker rm и новый docker run, start этого не умеет. Файлы, которые приложение записало внутрь контейнера (логи, временные файлы), переживают stop и start, но пропадают при rm, поэтому всё нужное выносят в volume. В Docker Compose логика та же: up пересоздаёт контейнер, если поменялась конфигурация, а start лишь поднимает существующий.
Где спотыкаются
Пытаются передать -p или -e в docker start и удивляются, что порт не открылся. Параметры контейнера фиксируются при создании.
Запускают docker run при каждом перезапуске и копят десятки остановленных контейнеров, а с фиксированным --name получают ошибку о занятом имени. Выручают --rm или docker start.
Путают docker start с docker exec. exec запускает дополнительный процесс внутри уже работающего контейнера, например jcmd для дампа потоков, а остановленный контейнер он не поднимет.