В чем разница между 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

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

Ответ 18+ 🔞

Давай разберёмся, в чём тут, блядь, разница, а то народ путается, как мартышки в зоопарке. Образ — это типа замороженная, готовая пицца в коробке, которую ты купил в магазине. А контейнер — это когда ты её, сука, разогрел в духовке, порезал и жрёшь. Первое — шаблон, второе — уже процесс, который жуёт и сосёт.

Ну или, если ты не обезьяна и про ООП слышал: образ — это класс, а контейнер — это объект. Всё, больше не путай, а то в рот меня чих-пых!

Таблица, чтобы не быть мудаком

Признак Docker-образ (Image) Docker-контейнер (Container)
Что это, ёпта? Неизменяемый шаблон, инструкция Запущенный экземпляр, живой процесс
Состояние Статичный, без состояния Динамичный, с файлами, процессами и всей этой хуйнёй
Откуда берётся Собирается из Dockerfile или другого образа Создаётся из образа командой docker run
Слои файлов Набор read-only слоёв, как матрёшка Те же read-only слои + свой верхний слой для записи
Жизнь Лежит в репозитории, как икона Запускается, работает, потом его можно прибить и удалить

Как это выглядит на практике, чтобы не быть полупидором:

  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

Короче, образ — это чертёж, а контейнер — это уже построенный по нему дом, в котором кто-то живёт, срёт на ковёр и включает свет. Всё просто, блядь.