Ответ
Docker-образ (image) — это неизменяемый (immutable) легковесный шаблон, который содержит всё необходимое для запуска приложения: исполняемый код, зависимости, библиотеки, переменные окружения и конфигурационные файлы.
Образ создается на основе инструкций, описанных в файле Dockerfile
. Важно отличать образ (шаблон) от контейнера (запущенный экземпляр образа).
Структура и ключевые компоненты:
- Слои (Layers): Образ состоит из набора слоев, доступных только для чтения. Каждая инструкция в
Dockerfile
(FROM
,COPY
,RUN
и т.д.) создает новый слой поверх предыдущего. Такая слоистая структура позволяет эффективно кэшировать сборку и экономить дисковое пространство, так как общие слои могут переиспользоваться разными образами. - 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).