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. Тестовое часто: «контейнеризуйте это». Тренируйтесь на своём сервисе. Жанр: тестовое задание.
Сеть, тома и типичные поломки
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.