Что такое Docker-образ (image) и из чего он состоит?

Ответ

Docker-образ (image) — это неизменяемый (immutable) легковесный шаблон, который содержит всё необходимое для запуска приложения: исполняемый код, зависимости, библиотеки, переменные окружения и конфигурационные файлы.

Образ создается на основе инструкций, описанных в файле Dockerfile. Важно отличать образ (шаблон) от контейнера (запущенный экземпляр образа).

Структура и ключевые компоненты:

  1. Слои (Layers): Образ состоит из набора слоев, доступных только для чтения. Каждая инструкция в Dockerfile (FROM, COPY, RUN и т.д.) создает новый слой поверх предыдущего. Такая слоистая структура позволяет эффективно кэшировать сборку и экономить дисковое пространство, так как общие слои могут переиспользоваться разными образами.
  2. Dockerfile: Это текстовый файл с инструкциями по сборке образа.

Пример Dockerfile для Go-приложения:

# 1. Этап сборки (builder)
# Используем официальный образ Go в качестве базового
FROM golang:1.21-alpine AS builder

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app

# Копируем файлы управления зависимостями
COPY go.mod go.sum ./

# Скачиваем зависимости
RUN go mod download

# Копируем исходный код
COPY . .

# Собираем статически скомпилированный бинарный файл
RUN CGO_ENABLED=0 GOOS=linux go build -o /myapp

# 2. Финальный этап (final)
# Используем минималистичный образ без лишних зависимостей
FROM alpine:latest

# Копируем только скомпилированный бинарник из этапа сборки
COPY --from=builder /myapp /myapp

# Указываем команду для запуска приложения при старте контейнера
CMD ["/myapp"]

Ключевые характеристики:

  • Неизменяемость (Immutability): После сборки образ нельзя изменить. Если нужны изменения, создается новый образ с новым тегом или хешем.
  • Переносимость (Portability): Образ, созданный на одной машине, можно запустить на любой другой, где установлен Docker, что гарантирует идентичность окружения.
  • Реестр (Registry): Образы хранятся и распространяются через реестры, такие как Docker Hub, Google Container Registry (GCR) или Amazon Elastic Container Registry (ECR).