Услуги по контейнеризации приложений с Docker

Контейнеризация приложений с Docker: написание Dockerfile, Docker Compose, настройка Registry, оптимизация образов, multi-stage builds и безопасность контейнеров.
Показано 30 из 37Все 1054 услуг

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1532
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1365
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1071
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1331
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    784
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1077

Как контейнеризация приложений решает проблему воспроизводимости?

Python-приложение запускается на лэптопе разработчика. В staging падает с ModuleNotFoundError. В проде — с PermissionError на директорию, которой нет. Три окружения — три набора проблем. Контейнеризация с Docker решает именно это: не абстрактную «изоляцию», а конкретную проблему воспроизводимости среды выполнения.

Мы работаем с Docker более 7 лет и контейнеризировали больше 50 сервисов — от микросервисов на Go до монолитов на PHP и тяжёлых ML-пайплайнов на Python. В каждом проекте сталкивались с типовыми ошибками: образы по 2 ГБ, сборка по 15 минут на чистом кэше, секреты, запечённые в слои, приложение, работающее от root. Рассказываем, как это исправить.

Почему multi-stage сборки — стандарт индустрии?

Single-stage Dockerfile для Go-приложения тащит весь тулчейн: компилятор, пакеты, исходники. Итоговый образ — 1.1 ГБ и 150+ уязвимостей. Multi-stage сборка оставляет только бинарник и CA-сертификаты:

FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o server . FROM scratch COPY --from=builder /app/server /server COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ EXPOSE 8080 ENTRYPOINT ["/server"] 

Размер образа — 8–15 МБ вместо 1.1 ГБ — уменьшение до 100 раз. Поверхность атаки минимальна: нет shell, нет package manager. Trivy находит 0 уязвимостей в таком образе (если бинарник собран без CVE-зависимостей). Для Node.js применяем аналогичный паттерн: отдельные стейджи для зависимостей, сборки, финала с non-root пользователем.

Как BuildKit ускоряет сборку в 6 раз?

BuildKit (активен по умолчанию в современных версиях Docker) добавляет параллельное выполнение независимых стейджей и mount-кэши, которые не попадают в финальный образ. Пример для Go:

FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \ go mod download COPY . . RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 go build -o server . 

Первая сборка — полная 4 минуты. Последующие — только изменённые пакеты, 40 секунд. В CI можно экспортировать кэш через type=registry — он работает на любом runner'е. Docker documentation описывает все опции.

Что такое правильный порядок инструкций для кэша слоёв?

Docker инвалидирует кэш слоя и всех последующих при изменении любого файла, используемого в инструкции. Типичная ошибка: копировать весь код до установки зависимостей. Правильная последовательность: сначала копировать манифесты (package.json, go.mod), выполнять установку, затем копировать исходный код. Так изменения в коде не перезапускают npm ci или go mod download. Это ускоряет сборку в CI на 30–50% для типового проекта.

Как управлять приватными реестрами?

Реестр Когда использовать
ECR (AWS) AWS-инфраструктура, нативная интеграция с EKS
GCR / Artifact Registry GCP-инфраструктура
ACR (Azure) Azure
Harbor On-premise, self-hosted с Trivy и RBAC
GitHub Container Registry Проекты на GitHub Actions

Harbor — единственный self-hosted вариант с полным набором: сканирование через Trivy, replication между реестрами, immutable tags. Тег latest в продакшне — антипаттерн: Kubernetes не перепулит образ, если он уже есть на ноде. Правильно — тегировать через git SHA или semver: app:1.4.2.

Что даёт сканирование уязвимостей в CI?

Trivy сканирует OS-пакеты, language-зависимости и конфигурацию Dockerfile. Минимальная интеграция в GitLab CI приводит к снижению критических уязвимостей на 90% за месяц:

trivy-scan: image: aquasec/trivy:latest stage: security script: - trivy image --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed --format json --output trivy-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA 

--ignore-unfixed — не падать из-за уязвимостей без исправления. --severity HIGH,CRITICAL — не зашумлять пайплайн. В .trivyignore документируем принятые риски с обоснованием.

Безопасность контейнеров: что ещё проверять

Кроме CVE, обязательно:

  • Root-пользователь. Всегда добавлять USER инструкцию. Приложение не должно работать от root.
  • Read-only filesystem. docker run --read-only или securityContext.readOnlyRootFilesystem: true в Kubernetes. Записываемые директории — через tmpfs.
  • Secrets. BuildKit с --secret передаёт секреты в сборку, не записывая в слой. Пример: RUN --mount=type=secret,id=npm_token NPM_TOKEN=$(cat /run/secrets/npm_token) npm ci.
  • Distroless-образы (Google Distroless) — минимальные образы без shell. Меньше CVE, меньше поверхность атаки.

Wikipedia: Docker подтверждает эти практики как отраслевой стандарт.

Docker Compose для локальной разработки

depends_on с condition: service_healthy — дожидаться реальной готовности сервиса:

services: app: depends_on: db: condition: service_healthy db: image: postgres:15-alpine healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 

docker-compose.override.yml — для dev-специфичных настроек (volume-монтирование, debug-порты), не попадающих в production.

Как мы работаем над контейнеризацией

  1. Аудит текущих Dockerfile и CI-пайплайнов. Выявляем узкие места: размер образов, кэш, безопасность.
  2. Проектирование архитектуры multi-stage сборок с учётом вашего стека.
  3. Разработка и оптимизация Dockerfile (кэширование, non-root, distroless).
  4. Настройка приватного реестра, сканирования в CI/CD и политик immutability.
  5. Документация и обучение команды: runbook для разработчиков, 1–2 воркшопа.

Средняя экономия на облачных ресурсах после внедрения — 35%. Если вы узнали свои проблемы в описанных кейсах — свяжитесь с нами для аудита вашей инфраструктуры. Получите оценку за 1 день.

Опыт компании

Более 7 лет работы с Docker и Kubernetes. 50+ проектов по контейнеризации — от стартапов до enterprise. Сертифицированы Kubernetes (CKA, CKAD). Опыт с Yandex Cloud, AWS, GCP, Selectel. Каждый проект завершаем с передачей документации и планом эксплуатации.

Ориентиры по срокам

Задача Срок
Контейнеризация одного сервиса с нуля 1–2 дня
Оптимизация существующих Dockerfile + CI-кэш 1–2 дня
Настройка Harbor с Trivy и replication 2–4 дня
Настройка сканирования в CI для N сервисов 2–3 дня
Аудит и рекомендации (без правок) 1 день

Стоимость рассчитывается индивидуально после оценки проекта. Закажите консультацию — мы проанализируем вашу инфраструктуру и предложим оптимальное решение. Сократите время сборки и расходы на облачные ресурсы уже сейчас.