Ответ
Ключевое различие заключается в том, что образ — это статичный, неизменяемый шаблон, а контейнер — это его запущенный, работающий экземпляр.
Можно провести аналогию с классами и объектами в ООП: образ — это класс, а контейнер — это объект (экземпляр класса).
Сравнительная таблица
Характеристика | 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
Таким образом, образ — это "чертеж" приложения, а контейнер — это "построенный и работающий дом" по этому чертежу.