В Docker есть два основных понятия, которые важно разделять:
Из одного образа можно создать сколько угодно контейнеров.
Образ — это неизменяемый файл, который содержит:
Образ не запускается сам по себе — он только шаблон.
Образы хранятся на Docker Hub или в приватном реестре.
Образ состоит из слоёв (layers). Каждый слой — это изменение поверх предыдущего.
Слой 4: код приложения
Слой 3: установка зависимостей
Слой 2: установка Python
Слой 1: базовый образ Ubuntu
Слои кэшируются. Если изменился только код — пересобирается только верхний слой,
остальные берутся из кэша. Это делает сборку быстрой.
Контейнер — это запущенный образ.
Docker берёт образ и добавляет поверх него тонкий записываемый слой.
Всё что происходит внутри контейнера — записывается в этот слой.
Исходный образ остаётся неизменным.
Контейнер = Образ (только чтение) + Записываемый слой
Образ
│
▼
Создан (Created)
│
▼
Запущен (Running)
│
▼
Остановлен (Stopped)
│
▼
Удалён (Removed)
Docker Hub
│
▼
docker pull nginx ← скачали образ
│
▼
Образ nginx на диске
│
▼
docker run nginx ← создали контейнер из образа
│
▼
Контейнер работает
Один образ — много контейнеров:
Образ nginx
├── Контейнер 1 (порт 80)
├── Контейнер 2 (порт 81)
└── Контейнер 3 (порт 82)
| Понятие | Что это | Изменяемый? |
|---|---|---|
| Образ | Шаблон для создания контейнера | Нет |
| Контейнер | Запущенный экземпляр образа | Да |
Образ — статичный шаблон. Контейнер — живой процесс на его основе.