🐛 Типичные ошибки при работе с контейнерами

⚡ Топ-5 ошибок

  • Контейнер сразу завершается → нет удерживающего процесса
  • Ctrl+C после docker attach → убивает PID 1, контейнер останавливается
  • Данные потеряны после docker rm → не использовали volume
  • docker rm не работает → контейнер ещё работает, нужен docker rm -f или сначала stop
  • rmi не работает → есть контейнеры, использующие этот образ

Ошибка 1: Контейнер мгновенно завершается

Симптом: запускаете docker run ubuntu, контейнер сразу переходит в Exited.

Причина: контейнер завершается вместе с PID 1. У ubuntu нет вечного процесса по умолчанию.

# Терминал
# Неверно (мгновенно завершится)
docker run ubuntu

# Верно — передаём долгоживущую задачу
docker run -d --name myubuntu ubuntu tail -f /dev/null

# Или интерактивный режим
docker run -it ubuntu bash

Ошибка 2: docker attach + Ctrl+C = контейнер остановлен

Симптом: подключились к nginx через docker attach, нажали Ctrl+C — nginx остановился.

Причина: attach подключается к PID 1. Ctrl+C посылает SIGINT этому процессу, nginx завершается.

# Терминал
# Опасно (Ctrl+C остановит контейнер)
docker attach mynginx

# Безопасно (новый процесс, Ctrl+C не затронет PID 1)
docker exec -it mynginx bash

# Если случайно остановили через attach — перезапустить:
docker start mynginx

Ошибка 3: Данные потеряны после docker rm

Симптом: удалили контейнер, все изменения внутри (файлы, БД) потеряны.

Причина: файловая система контейнера — временная. При docker rm она уничтожается.

# Терминал
# Данные внутри контейнера — временные
docker run -d --name mydb postgres
# ... записали данные ...
docker rm -f mydb
# Все данные потеряны!

# Решение: монтировать volume для персистентных данных
docker run -d --name mydb -v pgdata:/var/lib/postgresql/data postgres
# Теперь данные хранятся в volume pgdata
# При пересоздании контейнера данные сохраняются:
docker rm -f mydb
docker run -d --name mydb -v pgdata:/var/lib/postgresql/data postgres
# Данные на месте!

# Управление volumes
docker volume ls
docker volume inspect pgdata

Ошибка 4: «Cannot remove a running container»

Симптом: docker rm mynginx выдаёт ошибку «cannot remove a running container».
# Терминал
# Неверно (контейнер работает)
docker rm mynginx
# Error: Cannot remove a running container...

# Верно — сначала остановить
docker stop mynginx
docker rm mynginx

# Или принудительно одной командой
docker rm -f mynginx

Ошибка 5: «image is being used by stopped container» при rmi

Симптом: docker rmi nginx выдаёт ошибку «image is being used».
# Терминал
# Ошибка: образ используется контейнером (даже остановленным)
docker rmi nginx
# Error: image is being used by stopped container...

# Найти все контейнеры, использующие образ
docker ps -a | grep nginx

# Удалить контейнеры
docker rm <container_id>

# Теперь можно удалить образ
docker rmi nginx

# Удалить всё неиспользуемое сразу
docker image prune -a

Ошибка 6: Путаница между docker stop и docker kill

# Терминал
# docker stop — корректная остановка
# 1. Посылает SIGTERM процессу
# 2. Ждёт 10 секунд (по умолчанию)
# 3. Если не завершился — посылает SIGKILL
docker stop mynginx               # graceful
docker stop -t 30 mynginx         # ждать 30 секунд

# docker kill — принудительная немедленная остановка
# Посылает SIGKILL сразу, без ожидания
docker kill mynginx

# Когда использовать kill:
# - контейнер завис и не реагирует на stop
# - нужно немедленно освободить ресурсы
# - в dev-окружении когда данные не важны

Ошибка 7: Накопление «мусора» — контейнеры и образы

После активной работы с Docker накапливаются остановленные контейнеры и неиспользуемые образы, занимающие место на диске.

# Терминал

# Проверить что накопилось
docker ps -a            # остановленные контейнеры
docker images           # все образы
docker system df        # сводка по занятому месту

# Очистка
docker container prune          # удалить все остановленные контейнеры
docker image prune              # удалить образы без тега (dangling)
docker image prune -a           # все неиспользуемые образы

# Или всё сразу
docker system prune             # контейнеры + образы + сети
docker system prune --volumes   # + тома (осторожно: данные удалятся!)
← К оглавлению урока