🐛 Типичные ошибки новичков в Docker

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

  1. Путаница Image vs Container — image статичен, container запущен
  2. Тег :latest без контроля — всегда указывайте конкретный тег
  3. Потеря данных при rm — данные в контейнере не постоянны без volume
  4. «Нельзя удалить образ» — сначала удалите зависимые контейнеры
  5. Docker Daemon не запущен — запустите Docker Desktop или systemctl start docker

1. Путаница между Image и Container

Проблема: Новички часто путают образ (image) и контейнер (container), считая их одним и тем же.

Симптомы:

  • «Я изменил файл в контейнере — почему образ не изменился?»
  • Попытка удалить «контейнер» командой docker rmi
  • Попытка запустить образ как уже запущенный

Правило:

  • Image — статичный шаблон (как класс в ООП), неизменяемый
  • Container — запущенный экземпляр образа (как объект), имеет состояние
# Терминал — правильно: удалить контейнер, потом образ
docker rm <container-id>     # сначала контейнер
docker rmi nginx              # потом образ

2. Использование :latest без явного указания

Проблема: При команде docker pull nginx без тега скачивается nginx:latest. Через месяц :latest может означать другую версию.
# Проблема (из лекции — так делают):
docker pull nginx              # скачает nginx:latest — неопределённая версия

# Лучше так:
docker pull nginx:1.25         # конкретная версия
docker pull nginx:1.25-alpine  # конкретная версия на alpine

Почему важно: В продакшене нельзя допускать, чтобы образ изменился без явного обновления. Всегда пинуйте конкретный тег.

3. Потеря данных при удалении контейнера

Проблема: Данные, созданные внутри контейнера (файлы, БД), теряются при docker rm.
# Терминал — данные пропадут при rm:
docker run -it ubuntu bash
# Внутри: touch /tmp/my-file.txt && exit
docker rm <id>  # /tmp/my-file.txt удалён навсегда

# Правильно: использовать volumes (урок 02)
docker run -v /host/data:/container/data ubuntu bash

Запомните: Read-write слой контейнера живёт только пока контейнер существует. Для постоянных данных — volumes.

4. Нельзя удалить образ — зависимые контейнеры

Ошибка: Error response from daemon: conflict: unable to delete... image is being used by stopped container
# Терминал — ошибка:
docker rmi nginx
# Error: image is being used by stopped container abc123

# Решение: сначала удалить все контейнеры от этого образа
docker ps -a                  # найти все контейнеры
docker rm abc123              # удалить зависимый контейнер
docker rmi nginx              # теперь можно удалить образ

# Или принудительно:
docker rmi -f nginx           # force — удалит образ, но контейнер останется без ссылки

5. Docker Daemon не запущен

Ошибка: Cannot connect to the Docker daemon at unix:///var/run/docker.sock или error during connect: ... The system cannot find the file specified

Причина: Docker Desktop не запущен (Windows/Mac) или docker сервис остановлен (Linux).

# Терминал Windows/Mac — просто запустите Docker Desktop

# Терминал Linux:
sudo systemctl start docker
sudo systemctl enable docker   # автозапуск при загрузке
docker ps                       # проверка

6. Порт уже занят

Ошибка: Bind for 0.0.0.0:80 failed: port is already allocated
# Терминал — порт 80 уже занят другим процессом или контейнером
docker run -d -p 80:80 nginx

# Решение: использовать другой порт хоста
docker run -d -p 8080:80 nginx     # порт 8080 хоста → 80 контейнера

# Или найти и остановить конфликтующий контейнер:
docker ps                          # найти контейнер на порту 80
docker stop <id>

7. Контейнер сразу останавливается

Симптом: docker run nginx → контейнер запускается и тут же пропадает из docker ps.
# Терминал — без -d контейнер работает на переднем плане
# Ctrl+C завершает его

# Правильно — запустить в фоне:
docker run -d nginx         # detached mode

# Проверить статус:
docker ps -a                # увидим "Exited" если остановился с ошибкой
docker logs <id>           # посмотреть причину