Ответ
Ключевое различие заключается в том, что образ — это статичный, неизменяемый шаблон, а контейнер — это его запущенный, работающий экземпляр.
Можно провести аналогию с классами и объектами в ООП: образ — это класс, а контейнер — это объект (экземпляр класса).
Сравнительная таблица
| Характеристика | Docker-образ (Image) | Docker-контейнер (Container) |
|---|---|---|
| Суть | Неизменяемый (read-only) шаблон | Запущенный экземпляр образа |
| Состояние | Статичен, не имеет состояния | Динамичен, имеет состояние (файлы, процессы, сеть) |
| Основа | Создается из Dockerfile или другого образа |
Создается из образа (docker run <image>) |
| Слои | Набор read-only слоев файловой системы | Read-only слои образа + верхний read-write слой |
| Жизненный цикл | Хранится в репозитории (локальном или удаленном) | Запускается, выполняется, останавливается, удаляется |
Пример рабочего процесса:
-
Создание образа из инструкций в
Dockerfile:# Dockerfile FROM golang:1.19-alpine WORKDIR /app COPY . . RUN go build -o my-app CMD ["./my-app"]# Команда для сборки образа docker build -t my-golang-app . -
Запуск контейнера из созданного образа:
# Команда для запуска контейнера docker run --name my-running-app -p 8080:8080 my-golang-app
Таким образом, образ — это "чертеж" приложения, а контейнер — это "построенный и работающий дом" по этому чертежу.
Ответ 18+ 🔞
Давай разберёмся, в чём тут, блядь, разница, а то народ путается, как мартышки в зоопарке. Образ — это типа замороженная, готовая пицца в коробке, которую ты купил в магазине. А контейнер — это когда ты её, сука, разогрел в духовке, порезал и жрёшь. Первое — шаблон, второе — уже процесс, который жуёт и сосёт.
Ну или, если ты не обезьяна и про ООП слышал: образ — это класс, а контейнер — это объект. Всё, больше не путай, а то в рот меня чих-пых!
Таблица, чтобы не быть мудаком
| Признак | Docker-образ (Image) | Docker-контейнер (Container) |
|---|---|---|
| Что это, ёпта? | Неизменяемый шаблон, инструкция | Запущенный экземпляр, живой процесс |
| Состояние | Статичный, без состояния | Динамичный, с файлами, процессами и всей этой хуйнёй |
| Откуда берётся | Собирается из Dockerfile или другого образа |
Создаётся из образа командой docker run |
| Слои файлов | Набор read-only слоёв, как матрёшка | Те же read-only слои + свой верхний слой для записи |
| Жизнь | Лежит в репозитории, как икона | Запускается, работает, потом его можно прибить и удалить |
Как это выглядит на практике, чтобы не быть полупидором:
-
Леплю образ по рецепту в
Dockerfile:# Dockerfile FROM golang:1.19-alpine WORKDIR /app COPY . . RUN go build -o my-app CMD ["./my-app"]# Собираю этот конструктор docker build -t my-golang-app . -
Запускаю контейнер из того, что налепил:
# Запускаю эту банду docker run --name my-running-app -p 8080:8080 my-golang-app
Короче, образ — это чертёж, а контейнер — это уже построенный по нему дом, в котором кто-то живёт, срёт на ковёр и включает свет. Всё просто, блядь.