Как запускать и останавливать Docker контейнеры
Что проверяют
Для фронтенд-разработчика это проверка, что вы сами поднимете локально бэкенд или соберёте образ со статикой, не дёргая DevOps. И что понимаете жизненный цикл контейнера: создан, запущен, остановлен, удалён. Следом обычно спрашивают про Docker Compose или про то, почему проброшенный порт не открывается.
Как отвечать
docker run: создаёт новый контейнер из образа и запускает его. Например,docker run -d --name web -p 8080:80 nginx:alpine:-dв фоне,-pв порядке «порт хоста:порт контейнера»,--rmудалит контейнер после остановки,-vмонтирует каталог, напримерdistв/usr/share/nginx/html;docker startиdocker restart: запускают уже созданный контейнер. Повторныйrunс тем же--nameупадёт с конфликтом имени;docker stop: отправляет главному процессуSIGTERM, по умолчанию ждёт 10 секунд и добиваетSIGKILL, таймаут меняется флагом-t.docker killсразу шлётSIGKILL;- наблюдение:
docker psпоказывает запущенные,docker ps -aвсе,docker logs -f webпоток логов,docker exec -it web shвход внутрь; - удаление:
docker rmдля остановленного контейнера.
Для нескольких сервисов есть Compose v2: docker compose up -d поднимает стек, docker compose stop останавливает с сохранением контейнеров, docker compose down удаляет контейнеры и сеть, а тома только с флагом -v.
Две детали, которые выделяют фронтендера. Dev-сервер внутри контейнера должен слушать 0.0.0.0, а не localhost, иначе проброшенный порт снаружи не откроется, в Vite это флаг --host. И в shell-форме CMD npm start процесс запускается через /bin/sh -c и может не получить SIGTERM, поэтому stop висит все 10 секунд. Решение: exec-форма CMD ["node", "server.js"] или флаг --init.
Где спотыкаются
Путают run и start. Каждый run создаёт новый контейнер, и docker ps -a быстро зарастает остановленными копиями.
Считают, что stop удаляет данные контейнера, или что down стирает базу. Остановка сохраняет всё, rm удаляет записываемый слой, а тома переживают даже down без -v.
Переворачивают порты в -p или оставляют dev-сервер на localhost.