Какие подходы и инструменты контейнеризации ты знаешь?

«Какие подходы и инструменты контейнеризации ты знаешь?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Работа с контейнерами — это не только Docker. Вот стек, который я использовал:

1. Docker (Runtime & Build) Стандарт де-факто для разработки и сборки. Использует Dockerfile.

  • Плюсы: Простота, огромная экосистема, готовые образы на Docker Hub.
  • Минусы: Демон (dockerd) требует root-прав, что создает риски безопасности.
  • Пример Dockerfile для многоэтапной сборки:

    # Этап сборки
    FROM golang:1.21 AS builder
    WORKDIR /app
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
    
    # Финальный этап
    FROM alpine:latest
    COPY --from=builder /app/myapp .
    CMD ["./myapp"]

2. Podman Безадресная альтернатива Docker, совместимая с его CLI. Ключевое преимущество — rootless-контейнеры.

  • Плюсы: Безопаснее (не требует демона с root-правами), совместимые команды (podman вместо docker).
  • Минусы: Меньше интеграций в некоторых CI/CD системах.
  • Пример: podman build -t my-app . && podman run -d my-app

3. Buildah Специализированный инструмент для сборки OCI-совместимых образов. Часто используется в паре с Podman.

  • Плюсы: Позволяет создавать образы без Dockerfile, более тонкий контроль над слоями.
  • Пример сборки образа:
    newcontainer=$(buildah from alpine)
    buildah run $newcontainer apk add --no-cache nginx
    buildah config --cmd "nginx -g 'daemon off;'" $newcontainer
    buildah commit $newcontainer my-nginx

4. Containerd Низкоуровневая среда выполнения (runtime), которую использует Docker «под капотом». Kubernetes по умолчанию работает через containerd.

  • Плюсы: Более легковесный и стабильный, чем полный Docker Engine.
  • Минусы: Нет высокоуровневого CLI для разработчиков, управляется через ctr или API.

5. LXC/LXD Системные контейнеры (в отличие от прикладных, как Docker). Запускают полноценную ОС внутри.

  • Плюсы: Ближе к виртуализации, подходит для изоляции целых сред.
  • Минусы: Больший оверхед, чем у прикладных контейнеров.

Мой стек: Для локальной разработки и сборки образов в CI/CD использую Docker (из-за удобства). Для продакшен-рантайма в Kubernetes кластерах предпочитаю containerd. Podman/Buildah отлично подходят для безопасной сборки в средах, где нежелателен root-демон.