Docker Level 05: Multi-stage -- Go binary 10MB, образ 900MB

БОЛЬ Go-приложение. Бинарник – 10MB, статически слинкован, без зависимостей. docker images показывает 900MB. Внутри образа: весь Go SDK (500MB), git, gcc, make, исходники, кеш сборки. Ничего из этого не нужно в production. 900MB на каждый микросервис, 12 сервисов – это 10.8GB на ноду. При деплое скачивается 900MB на каждый pod restart. Rollout занимает минуты вместо секунд. Multi-stage build решает проблему: один этап для сборки, другой – для запуска. В финальный образ попадает только бинарник. ...

18 мая 2026 · 3 минуты · 532 слова · DevOps Way

Docker Level 04: .dockerignore -- Образ 2GB, внутри .env с паролями

БОЛЬ Ревью Docker-образа перед деплоем. docker images показывает 2.1GB для простого Node.js-приложения. Запускаете docker run --rm myapp ls -la и видите: node_modules (800MB), .git (400MB), test-data (500MB). И самое страшное – .env с DB_PASSWORD, JWT_SECRET, AWS_SECRET_KEY. Образ уже в Docker Hub. Пароли в открытом доступе. Даже если удалить .env в следующем слое – он останется в истории образа. docker history покажет всё. Исправление: .dockerignore – файл-фильтр, который не пускает лишнее в контекст сборки. ...

18 мая 2026 · 3 минуты · 535 слов · DevOps Way

Docker Level 03: Layer Cache -- Почему сборка 8 минут?

БОЛЬ CI pipeline: 47 коммитов в день, каждый запускает docker build. Сборка занимает 8 минут, из них 7 – npm ci. Вы поменяли одну строку в src/index.ts, но Docker заново устанавливает все 1200 зависимостей. Каждый. Раз. За день это 47 * 7 = 329 минут впустую. За месяц – 110 часов ожидания. И всё потому, что COPY . . стоит перед RUN npm ci. КАК УСТРОЕНО Docker собирает образ слоями. Каждая инструкция FROM, COPY, RUN создаёт слой. Слои кешируются. ...

18 мая 2026 · 3 минуты · 540 слов · DevOps Way

Docker Level 02: Dockerfile -- Работает у меня, а у коллеги нет

БОЛЬ Джуниор присылает в чат: “У меня всё работает”. Вы клонируете репозиторий, запускаете npm install – ошибка. У него Node 18, у вас Node 22. У него Ubuntu, у вас macOS. У него python3 указывает на 3.10, у вас – на 3.12. “Работает у меня” – это не баг, это отсутствие воспроизводимой среды. Dockerfile решает проблему: он описывает среду декларативно. Кто бы ни собрал образ – результат будет одинаковый. КАК УСТРОЕНО Dockerfile – это текстовый файл с инструкциями для сборки образа. Каждая инструкция создаёт слой (layer) в образе. ...

18 мая 2026 · 3 минуты · 448 слов · DevOps Way

Docker Level 01: docker run -- Зачем вообще контейнеры?

БОЛЬ Пятница, 18:47. Вы обновляете Python на сервере, где крутятся 5 микросервисов. apt upgrade python3 – и бот в Telegram падает, потому что ему нужен Python 3.10, а вы только что поставили 3.12. Заодно сломался Flask-сервис, который зависел от libssl1.1, а теперь стоит libssl3. Знакомо? Это классика: конфликт зависимостей на общем хосте. Один apt update может положить всё, потому что 5 сервисов делят одну файловую систему, одни библиотеки, один Python. ...

18 мая 2026 · 3 минуты · 477 слов · DevOps Way