В чем разница между Docker-образом (Image) и Docker-контейнером (Container)?

Ответ

Ключевое различие заключается в том, что образ — это статичный, неизменяемый шаблон, а контейнер — это его запущенный, работающий экземпляр.

Можно провести аналогию с классами и объектами в ООП: образ — это класс, а контейнер — это объект (экземпляр класса).

Сравнительная таблица

Характеристика Docker-образ (Image) Docker-контейнер (Container)
Суть Неизменяемый (read-only) шаблон Запущенный экземпляр образа
Состояние Статичен, не имеет состояния Динамичен, имеет состояние (файлы, процессы, сеть)
Основа Создается из Dockerfile или другого образа Создается из образа (docker run <image>)
Слои Набор read-only слоев файловой системы Read-only слои образа + верхний read-write слой
Жизненный цикл Хранится в репозитории (локальном или удаленном) Запускается, выполняется, останавливается, удаляется

Пример рабочего процесса:

  1. Создание образа из инструкций в 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 .
  2. Запуск контейнера из созданного образа:

    # Команда для запуска контейнера
    docker run --name my-running-app -p 8080:8080 my-golang-app

Таким образом, образ — это "чертеж" приложения, а контейнер — это "построенный и работающий дом" по этому чертежу.