Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)

Рейтинг: 68.5% · 14 голосов
Практический курс по Docker: образы, контейнеры, тома, сети, Compose и продакшен. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
Marina_DevOps
Сообщения: 25
Зарегистрирован: 11 май 2026, 05:31

Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)

Сообщение Marina_DevOps »

АкадемияDocker с нуляГлава 17 из 17
Оглавление курса (17)
  1. Что такое Docker и какие задачи он решает
  2. Установка Docker и запуск первого контейнера
  3. Образы: слои, теги и реестр Docker Hub
  4. Пишем свой Dockerfile
  5. Тома и хранение данных: volumes и bind mounts
  6. Сети в Docker: связываем контейнеры между собой
  7. Переменные окружения и конфигурация контейнеров
  8. Docker Compose: поднимаем многоконтейнерное приложение
  9. Оптимизация образов: multi-stage сборка, размер и кэш слоёв
  10. Логи, отладка и мониторинг контейнеров
  11. Базовая безопасность контейнеров
  12. Подготовка к продакшену: что важно учесть
  13. Dockerfile глубже: ENTRYPOINT и CMD, HEALTHCHECK, .dockerignore, запуск не от root
  14. Реестры образов: приватные registry, push и pull, теги и digest, imagePullSecrets
  15. BuildKit и buildx: multi-arch сборки, секреты сборки, экспорт кэша
  16. Docker в CI/CD: автосборка, сканирование образов (Trivy, Docker Scout), публикация
  17. Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI) (вы здесь)
Шестнадцать глав назад вы запускали hello-world, а теперь за плечами свой Dockerfile, Compose, multi-stage сборки, приватный registry и CI со сканом образов. Финал из двух частей: сначала собираем всё в итоговый проект, потом смотрим на карту мира вокруг Docker, чтобы слова Kubernetes, Podman и OCI перестали быть шумом из вакансий.

Итоговый проект:

Берём стек из главы 8 (api, postgres, nginx) и доводим до состояния "не стыдно показать на собесе". Чеклист: multi-stage сборка и запуск не от root (главы 9 и 13), HEALTHCHECK и .dockerignore (глава 13), точные теги, лимиты и ротация логов в compose (глава 12), сборка через buildx с кэшем (глава 15), скан и публикация в registry из CI (главы 14 и 16). Эталонный Dockerfile, к которому мы шли весь курс:

Код: Выделить всё

# syntax=docker/dockerfile:1
FROM node:24-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN --mount=type=cache,target=/root/.npm npm ci
COPY . .
RUN npm run build && npm prune --omit=dev

FROM node:24-alpine
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build --chown=node:node /app/dist ./dist
COPY --from=build --chown=node:node /app/node_modules ./node_modules
USER node
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=15s \
  CMD wget -qO- http://127.0.0.1:8080/health || exit 1
ENTRYPOINT ["node", "dist/server.js"]
Конвейер от коммита до прода укладывается в три команды:

Код: Выделить всё

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  --tag cr.yandex/crp9f3k2/shop-api:1.5.0 \
  --push .

trivy image --severity HIGH,CRITICAL --exit-code 1 \
  cr.yandex/crp9f3k2/shop-api:1.5.0

ssh deploy@prod 'cd /srv/shop && docker compose pull && docker compose up -d --wait'
Флаг --wait дождётся, пока healthcheck всех сервисов станет healthy, и только тогда вернёт управление. Если особо критичный сервис хочется прибить намертво, пиньте его по digest из главы 14. Прошёл этот цикл без ручных правок, значит курс вы усвоили.

Kubernetes:

Compose управляет контейнерами на одной машине. Когда машин несколько, нужен оркестратор: он сам решает, на каком узле запустить контейнер, перезапускает упавшие, раскатывает новые версии без даунтайма. Стандарт де-факто здесь Kubernetes. Вместо compose-файла вы описываете желаемое состояние в манифестах:

Код: Выделить всё

apiVersion: apps/v1
kind: Deployment
metadata:
  name: shop-api
spec:
  replicas: 3
  selector:
    matchLabels: { app: shop-api }
  template:
    metadata:
      labels: { app: shop-api }
    spec:
      containers:
        - name: api
          image: cr.yandex/crp9f3k2/shop-api:1.5.0
          ports:
            - containerPort: 8080
          livenessProbe:
            httpGet: { path: /health, port: 8080 }
Два момента, которые сбивают людей с docker-бэкграундом. Первый: с версии 1.24 Kubernetes не использует Docker как рантайм, на узлах крутится containerd или CRI-O, поэтому docker ps на узле кластера пуст. Образы при этом ваши же, пересобирать ничего не надо. Второй: HEALTHCHECK из Dockerfile Kubernetes игнорирует, здоровье описывают пробами (livenessProbe, readinessProbe) прямо в манифесте. Пробовать лучше локально на kind или minikube, а для маленького сервера есть k3s, облегчённый дистрибутив в один бинарник. Про Docker Swarm коротко: он встроен в Docker и заметно проще, но индустрия выбрала Kubernetes, под Swarm почти нет ни вакансий, ни свежих инструментов.

Podman:

Podman это другой движок контейнеров: без демона и по умолчанию rootless, контейнеры живут как обычные процессы пользователя. CLI совместим с Docker почти один в один, alias docker=podman закрывает большинство команд. В RHEL-семействе (Альма, Рокки, РЕД ОС) он идёт из коробки, так что на части серверов в СНГ вы встретите именно его. Автозапуск там делается через systemd, механизм называется quadlet:

Код: Выделить всё

# /etc/containers/systemd/shop-api.container
[Container]
Image=cr.yandex/crp9f3k2/shop-api:1.5.0
PublishPort=127.0.0.1:8080:8080

[Service]
Restart=always

[Install]
WantedBy=multi-user.target
После systemctl daemon-reload юнитом shop-api.service управляют как любым другим сервисом.

OCI:

Причина, по которой один образ работает и в Docker, и в Podman, и в Kubernetes, называется Open Container Initiative. Это три спецификации: image-spec (формат образа), runtime-spec (как запускать контейнер, эталонная реализация runc) и distribution-spec (протокол registry). Docker, containerd, CRI-O, Podman и любой registry из главы 14 говорят на этом общем языке. Меняется обвязка, образ и принципы остаются.

Типичные грабли:

Kubernetes на единственном VPS. Плата за оркестрацию это сложность: etcd, сертификаты, сетевые плагины, обновления кластера. Для одного сервера compose с restart-политиками честно закрывает задачу, k8s берите, когда серверов несколько или этого требует работа.

Ожидание, что Podman сам поднимет контейнеры после ребута. Демона нет, рестартить некому: без quadlet или podman-restart.service после перезагрузки всё лежит. А инструментам, которые ходят в /var/run/docker.sock (testcontainers, CI-агенты), нужен включённый podman.socket.

Попытка выучить всё сразу. Kubernetes это месяцы практики, не приложение к финальной главе.

Что дальше:

Прогоните итоговый проект от git push до работающего прода без ручных шагов, это и есть экзамен. Дальше дорога ветвится: поднять кластер k3s из трёх узлов и перенести туда тот же проект, перевести домашний сервер на Podman с quadlet или копать вглубь, к containerd и runc. Docker вы уже знаете. Спасибо, что дошли до конца.
👍3 ❤️1 🔥3 😄 🤔2
✔ Лучший ответ сформирован автоматически — elastic13
Marina_DevOps писал(а):на узлах крутится containerd или CRI-O, поэтому docker ps на узле кластера пуст прочувствовал на своей шкуре. дали доступ на ноду managed-кластера, дебажу инцидент, docker ps пустой, решил что кластер лег целиком. полчаса паники, потом коллега молча прислал crictl ps. знал бы раньше, сэкономил бы нервы
Перейти к ответу →
Аватара пользователя
elastic13
Сообщения: 1
Зарегистрирован: 12 май 2026, 15:21

Re: Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)

Сообщение elastic13 »

✔ Лучший ответ — сформирован автоматически
Marina_DevOps писал(а):на узлах крутится containerd или CRI-O, поэтому docker ps на узле кластера пуст
прочувствовал на своей шкуре. дали доступ на ноду managed-кластера, дебажу инцидент, docker ps пустой, решил что кластер лег целиком. полчаса паники, потом коллега молча прислал crictl ps. знал бы раньше, сэкономил бы нервы
👍1 ❤️1 🔥 😄 🤔1
Аватара пользователя
sean5577
Сообщения: 2
Зарегистрирован: 08 июн 2026, 11:23

Re: Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)

Сообщение sean5577 »

про podman подтверждаю, у нас вся инфра на альме 9 и докера там нет в принципе. alias docker=podman реально закрывает почти все, споткнулись только на gitlab-runner, который хочет docker.sock. включили podman.socket и поехало, только путь к сокету в конфиге раннера пришлось руками прописать
👍1 ❤️ 🔥1 😄 🤔
Аватара пользователя
yura91
Сообщения: 1
Зарегистрирован: 14 май 2026, 21:37

Re: Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)

Сообщение yura91 »

а чем swarm так провинился? встроен в докер, манифесты почти как compose, для двух-трех серверов выглядит идеально. реально в 2026 его уже можно не учить или это снобизм k8s-тусовки?
👍2 ❤️ 🔥 😄 🤔2
Аватара пользователя
haskelladdict
Сообщения: 1
Зарегистрирован: 30 май 2026, 13:13

Re: Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)

Сообщение haskelladdict »

ради интереса поднял k3s на трех vps по 400р и перетащил туда итоговый проект. сам перенос занял вечер субботы, потом еще воскресенье дебажил ingress. для пет-проекта оверкилл конечно, вернулся на compose, но на собесе вопросы про rolling update уже не пугали, так что время не зря
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Docker в CI/CD: автосборка, сканирование образов (Trivy, Docker Scout), публикация

Все главы курса «Docker с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Docker с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость