← Назад к вопросам

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

1.0 Junior🔥 181 комментариев
#Контейнеризация и DevOps

Комментарии (1)

🐱
gpt-5-nanoPrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Docker образом и контейнером

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

Что такое образ (image)

  • Образ — это статический шаблон. Он хранит набор файловой системы в виде слоёв и метаданные, необходимые для запуска приложений.
  • Образы иммутабельны: после создания они не меняются. Чтобы внести изменения, создают новый образ или новый слой поверх существующего.
  • Образ может быть построен с использованием инструкций из Dockerfile и может храниться в реестрах (registries) и быть передан другим системам.
  • Образы состоят из слоёв: базовый слой, затем ваши изменения. Это позволяет экономно повторно использовать общий базовый слой между различными образами.
  • Примеры ключевых команд:
    • просмотp доступных образов: docker image ls
    • сборка образа: docker build -t myapp:1.0 .
    • просмотр слоёв образа и изменений: docker history myapp:1.0
# Пример Dockerfile
FROM alpine:3.18
RUN apk add --no-cache curl
CMD ["echo", "Hello from image"]
# другой пример, демонстрирующий многослойность
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main .

FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/main .
CMD ["./main"]

Что такое контейнер (container)

  • Контейнер — это запущенный экземпляр образа. Это процесс или набор процессов, запущенный в изолированной среде (namespace) и под управлением cgroups.
  • Контейнер имеет рабочую запись (writable layer) поверх образа, куда записываются изменения во время работы.
  • Контейнеры изолированы друг от друга, имеют свой сетевой стек, файловую систему и ресурсы, но могут обмениваться данными через тома (volumes).
  • Контейнеры жизнеспособны и управляемы: их можно запускать, останавливать, перезапускать, удалять. Из контейнера можно сделать новый образ через docker commit, но это не лучший рабочий процесс.
  • Примеры ключевых команд:
    • запуск контейнера: docker run --name mycontainer myimage:1.0
    • список запущенных контейнеров: docker ps
    • просмотр изменений в файловой системе контейнера: docker diff mycontainer
    • остановка и удаление контейнера: docker stop mycontainer, docker rm mycontainer
# Пример создания и запуска контейнера
docker run --name mycontainer -d myapp:1.0
# Пример просмотра изменений в контейнере
docker diff mycontainer

Ключевые различия, которые важно помнить

  • Имя и сущность: образ — это "чертеж" (template), контейнер — это работающий экземпляр этого чертежа.
  • Изменяемость: образ — иммутабелен; контейнер имеет writable слой.
  • Жизненный цикл: образ создаётся и публикуется; контейнер создаётся и управляется в момент исполнения.
  • Хранение данных: данные внутри контейнера могут исчезнуть при удалении контейнера; для долгосрочного хранения чаще используются тома (volumes) или внешние БД/FS.
  • Версионирование и перенос: образы версионируются тегами и легко передаются через реестры; контейнеры чаще создаются на базе образа и управляются локально, но сами по себе не распространяются как "архив" (за исключением создания нового образа через docker commit).

Как это часто применяется в Go-разработке

  • Используют многослойные образы и тонкие основы (например, легковесные alpine/ scratch образы) для уменьшения размера и ускорения развёртывания.
  • Часто применяют многослойные Dockerfile: сборка на одном образе и копирование результата в второй минимальный образ.
  • Контейнеры позволяют тестировать, деплоить и масштабировать сервисы Go с повторяемостью окружения.

Если хотите, могу привести конкретный пример рабочего Dockerfile для Go-проекта и показать, как из образа запускать контейнер и как работать с данными через тома.

В чем разница между Docker образом и контейнером? | PrepBro