Docker на junior — это гигиена поставки, не цирк с оркестраторами. Рекрутер хочет увидеть, что ваш сервис поднимается не «у меня на ноутбуке же работало», а командой из README: приложение, база, переменные, без секрета в образе. Kubernetes в той же строке skills при одном Dockerfile часто вреден.

Ниже — карта контейнеров под работу backend и DevOps junior, 90-дневный проект, как показать это в резюме и куда смотреть вакансии с Docker. Связка с облаком — в AWS roadmap, с ролью — в как стать DevOps-инженером и навыках DevOps.

Коротко:

  • Уметь собрать образ, прочитать слои «на пальцах», не тащить секреты и кэш мусора в image.
  • Compose: сервис + Postgres + сеть, healthcheck, volume для данных разработки.
  • Отличие контейнера от виртуалки — объяснить за минуту. Это спрашивают.
  • K8s, Helm, «свой кластер» — не первые 90 дней, если в пяти вакансиях этого нет.
  • Готовность — чужой человек делает compose up и видит API. Не «проходил курс по Docker».

Зачем это найму

Команда не хочет настраивать вашу IDE. Хочет одинаковый Postgres и одинаковую версию рантайма. Docker это фиксирует. Для backend это часть проекта. Для DevOps — ещё и понимание, почему контейнер не стартует, куда смотреть логи, как не раздать привилегированный контейнер в прод.

Не учите Docker «вместо языка». Сначала есть приложение. Контейнер упаковывает его. Пустой «я знаю Docker» без сервиса внутри — слабый пакет.

Минимальный цикл, который стоит прогнать руками в первый вечер: написать Dockerfile, собрать образ, запустить, зайти на порт, увидеть ответ API, посмотреть docker logs, остановить, удалить контейнер, убедиться, что образ ещё есть. Второй вечер — compose с Postgres, переменная DATABASE_URL, падение без неё. Третий — том и повторный up с сохранившимися данными. Этот цикл важнее видео про архитектуру swarm.

Реестр: для портфолио достаточно локальных образов. Публичный Docker Hub с вашим учебным API — опция, если не кладёте секреты и персональные данные. Тег с датой или git sha понятнее latest. На тестовом вас могут попросить «соберите и отдайте команду запуска» — имейте её в README одной строкой.

Отладка: docker compose exec app sh (или bash), curl внутри сети compose к имени сервиса db, проверка, что DNS резолвится. Если exec не работает из-за минимального образа без shell — это тоже урок: для учёбы temporarily оставьте shell, для «минимального прода» уберите и напишите, чем жертвуете. Non-root: пользователь в Dockerfile, файлы не owned by root, иначе на созвоне скажут «вы запускаете контейнер как root» и будут правы.

База, которая всплывает на созвоне

  • образ vs контейнер vs registry;
  • Dockerfile: FROM, COPY, RUN, CMD vs ENTRYPOINT, .dockerignore;
  • слои и почему порядок команд влияет на кэш;
  • пользователь не root в образе — хотя бы попытка и комментарий;
  • порты, сеть compose, имя сервиса как hostname;
  • volume: что переживёт удаление контейнера;
  • логи: docker logs, почему print без flush «пропал».

Multi-stage: имеет смысл, когда уменьшаете образ приложения. Не как фетиш. Docker Desktop vs engine на Linux — работайте там, где стабильно у вас, в README укажите.

Compose как рабочий стандарт junior

Один файл: app, db, иногда reverse proxy. Переменные через env-файл, который в .gitignore, плюс .env.example. Зависимость app от здоровой БД (healthcheck), не sleep 30 вслепую — или честный sleep с пометкой «учебка, заменим».

Не складывайте в compose прод-секреты и три окружения «как в Netflix». Для портфолио достаточно dev-контура, который поднимается с нуля.

Что не тащить в карту новичка

  • свой registry с нуля, если вакансии не про платформу;
  • swarm как основная цель 2026;
  • EKS «чтобы Docker был полным»;
  • десяток линтеров образа без работающего сервиса;
  • копирование неподписанных образов из случайных тегов latest в качестве «навыка безопасности» без понимания.

Безопасность junior-уровня: не latest на всём подряд без фиксации, не секреты в слоях, не privileged без причины. Не CIS Benchmark наизусть.

Пример 1. 90 дней: упаковать свой сервис

Возьмите учебный API (Python/Java/Go) и Postgres.

  1. Дни 1–15. Dockerfile, который собирается. .dockerignore. Запуск без Compose, порт проброшен.
  2. Дни 16–40. Compose: app+db, миграции задокументированы, .env.example. Падение, если нет DATABASE_URL.
  3. Дни 41–65. Multi-stage или хотя бы меньший runtime-образ. Пользователь не root. Healthcheck. Запись в DECISIONS: почему не положили секреты в ENV образа нахардкоженными.
  4. Дни 66–90. README на 15 строк: up, тесты, как снести тома. Скрин не нужен — нужна воспроизводимость. Резюме: Docker, Compose, стек приложения. Отклики.

Откликаюсь на junior backend. Сервис заказов поднимается docker compose up: приложение, PostgreSQL, миграции в README. Образ без секретов, есть .env.example. Коммерческого стажа нет. На созвоне разберу Dockerfile и healthcheck. Репозиторий: [ссылка].

Каркас письма: генератор сопроводительного. Связанные карты: Python, FastAPI, Java, Go.

Пример 2. Было / стало в skills

Было. Docker, Docker Compose, Kubernetes, Helm, Istio, CI/CD, microservices. Репозиторий: один FROM python:latest и COPY . .

Стало. Docker: multi-stage для API, non-root. Compose: app + Postgres, healthcheck, volume. Kubernetes не указываю — кластера не поднимал.

Второй список переживает вопрос «расскажите про ваш Dockerfile». Первый — нет. Как писать стек: как указать стек в резюме, проверка: cv-review. Резюме DevOps: резюме DevOps-инженера.

Критерии готовности и созвон

Чужой человек без вашей IDE поднимает стек. Вы объясняете слой, том, сеть compose, чем CMD отличается от ENTRYPOINT. Логи показываете командой, не «ну в консоли было».

Вопросы DevOps-созвона: вопросы на собеседовании DevOps. Тестовое часто: «контейнеризуйте это». Тренируйтесь на своём сервисе. Жанр: тестовое задание.

Сеть, тома и типичные поломки

Junior чаще всего ломается не на синтаксисе Dockerfile, а на «контейнеры не видят друг друга» и «данные Postgres исчезли после down». В compose имя сервиса — DNS-имя. Приложение ходит на postgres:5432, не на localhost:5432 внутри контейнера app. В README это стоит написать явно: вы сами на этом споткнётесь, рекрутер тоже.

Том для данных БД: без него демо красиво, после перезапуска пусто. С томом — нужно понимать, что down -v снесёт учебные данные. Healthcheck БД: приложение не стартует, пока Postgres не принимает соединения. Если оставили sleep 15 — напишите в DECISIONS, что это костыль.

Логи: docker compose logs -f app. Если приложение буферизует stdout, в логах «тихо», пока не упадёт. Для Python часто нужен unbuffered. Это мелочь, которую спрашивают, потому что по ней видно, дебажили ли вы контейнер или только собрали образ на курсе.

Образ: фиксируйте тег базового образа, не только latest. Не копируйте секреты ADD. Multi-stage: в финальный слой — бинарь или venv, не компилятор и не .git. На созвоне хватит объяснить два слоя: сборка и рантайм.

Резюме, тестовое, DevOps vs backend

Backend: Docker в skills, если compose в репозитории сервиса. DevOps: тот же compose плюс «собрал образ в CI» или «разобрал, почему контейнер Restarting». Не пишите Kubernetes. Пули: «API и Postgres в Compose, healthcheck, non-root, .env.example». Файл: как составить резюме, навыки: навыки в IT-резюме.

Тестовое «контейнеризуйте» часто присылают архивом без Docker. Сделайте минимальный Dockerfile и compose, не оркестратор. Если просят только Dockerfile — не навязывайте k8s-манифесты. Жанр: тестовое задание. Созвон: вопросы DevOps.

Письмо ссылается на README с командой up, не на «изучаю контейнеризацию». Без стажа: сопроводительное без опыта. Поиск: вакансии Docker и backend вашего языка. Стажировки: стажировка в IT.

Частые вопросы

Нужен ли Kubernetes сразу после Docker?

Нет, если вакансии junior его не требуют. Сначала уверенный Compose и понимание сети. K8s без этого — слова. Манифест Deployment, который вы не поднимали, в skills вреден так же, как Kafka без кода.

Alpine или обычный образ?

Что стабильно для вашего рантайма. Alpine экономит мегабайты и добавляет сюрпризы с libc. Для портфолио важнее воспроизводимость, чем 20 МБ. Если Python-пакеты собираются с болью на Alpine — возьмите slim-debian и не геройствуйте.

Podman вместо Docker?

Если так в вакансии или у вас так на машине — ок, в README напишите. Команды близки. Не война инструментов в письме. Рекрутеру важнее up и отсутствие секретов, чем логотип движка.

Как быть с Windows?

WSL2 или удалённый Linux. Если Compose у вас хрупкий, это видно. Не делайте вид, что «Docker везде одинаковый», если не проверили. Тестовое часто проверяют на Linux CI — сломанные пути Windows всплывут.

Писать ли Docker в резюме аналитика?

Только если поднимали DWH/контейнер для воспроизводимости запросов. Иначе нет. Не маскируйте роль. Аналитику нужен SQL-разбор, не оркестрация.

CI: собирать образ в GitHub Actions?

Плюс для DevOps-вакансий. Для backend junior достаточно локального Compose, если CI нет. Если добавляете — без публикации секретов в логи. Один workflow «test + build» закрывает вопрос «видели ли CI» без Kubernetes.

Что сделать сейчас

Возьмите существующий учебный сервис или начните с API из языковой карты. Напишите Dockerfile и compose с Postgres. Уберите пароль из репозитория. Проверьте up на чистой машине или в новой папке с git clone.

Потом ищите роли, где Docker в требованиях, в каталоге и в backend-вакансиях своего языка. Контейнер без приложения внутри — демо. Работа — когда README хватает, чтобы не писать вам в мессенджер «а как запустить».

Проверка перед откликами: clone на чистую папку, compose up, curl на health или на создание сущности, compose down. Если без вашей IDE не встаёт — это ещё не навык Docker, это навык «у меня работает». Допишите команды, порты, зависимость от .env.example. Попросите знакомого пройти README без подсказок — это дешевле, чем десятый курс по оркестрации и кластеру. Если знакомый не поднял стек за пятнадцать минут, README ещё не готов к отбору. Допишите порты, команду миграций и что делать, если порт занят локально другим контейнером или процессом.

Типичный вечер отладки, который стоит один раз пройти: приложение не видит БД, потому что ходит на localhost; Postgres не готов, app упал; том стёрт ключом -v; порт занят старым контейнером. Запишите решения в README. На созвоне этот рассказ закрывает вопрос «сталкивались ли с Docker в реальности» лучше курса. Перед откликами прогоните резюме через cv-review, чтобы Kubernetes не приехал из шаблона skills.

Откликаюсь на junior backend. Сервис поднимается одной командой compose: приложение, Postgres, миграции в README, секрет не в образе. Могу разобрать Dockerfile и почему app ходит на имя сервиса db, не на localhost. Репозиторий: [ссылка]. Готов контейнеризовать тестовое в том же формате, без Kubernetes.