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–15. Dockerfile, который собирается. .dockerignore. Запуск без Compose, порт проброшен.
- Дни 16–40. Compose: app+db, миграции задокументированы, .env.example. Падение, если нет DATABASE_URL.
- Дни 41–65. Multi-stage или хотя бы меньший runtime-образ. Пользователь не root. Healthcheck. Запись в DECISIONS: почему не положили секреты в ENV образа нахардкоженными.
- Дни 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. Тестовое часто: «контейнеризуйте это». Тренируйтесь на своём сервисе. Жанр: тестовое задание.