Контейнеризация и оркестрация — итоги
Кратко — что стоит унести из раздела "Контейнеризация и оркестрация". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои при работе с Docker и Kubernetes, ситуации новичков и ответы на частые запросы в поиске ("docker daemon not running", "port is already allocated", "ImagePullBackOff"). Краткий ответ здесь; разбор — в главах раздела. Заучивание определений — в чек-листе.
Вопрос. docker ps или docker compose up пишут "Cannot connect to the Docker daemon" — что проверить?
Ответ. Демон Docker не запущен или клиент смотрит не туда: на Windows/macOS включите Docker Desktop; на Linux — sudo systemctl start docker и членство пользователя в группе docker. Проверьте переменную DOCKER_HOST. Подробнее здесь — Docker, справочник.
Вопрос. При docker run -p 8080:80 ошибка "port is already allocated".
Ответ. Порт 8080 на хосте уже занят другим процессом или контейнером. Найдите владельца (ss -tlnp, docker ps), остановите лишний контейнер или смените левую часть маппинга (-p 8081:80). Подробнее здесь — Docker, сеть.
Вопрос. Контейнер стартует и сразу исчезает — статус Exited (0) или Exited (1).
Ответ. Процесс внутри завершился: одноразовая команда без долгоживущего PID, падение приложения или неверный CMD/ENTRYPOINT. Смотрите docker logs <id> и docker inspect — поле State.ExitCode. Для отладки запустите с -it и shell. Подробнее здесь — объекты Docker, Dockerfile.
Вопрос. docker build падает на шаге RUN apt-get или COPY — "file not found".
Ответ. Контекст сборки — каталог, переданный в build, а не вся машина. Путь в COPY относителен контексту; лишние файлы режет .dockerignore. Проверьте синтаксис Dockerfile и базовый образ в FROM. Подробнее здесь — Dockerfile, справочник.
Вопрос. Образ получился на 3 ГБ — деплой и pull занимают вечность.
Ответ. Тяжёлый базовый образ, лишние слои, артефакты сборки внутри слоя. Используйте slim/alpine, multi-stage build, .dockerignore, объединяйте RUN. Подробнее здесь — Dockerfile, работа с Docker.
Вопрос. Данные в контейнере пропали после docker rm — это баг?
Ответ. Файловая система контейнера эфемерна. Постоянные данные храните в named volume или bind mount; без тома удаление контейнера стирает слой записи. Подробнее здесь — объекты Docker, Compose.
Вопрос. Bind mount на Linux: "Permission denied" при записи в /app/data.
Ответ. UID/GID процесса в контейнере не совпадает с владельцем каталога на хосте. Запускайте от non-root с нужным uid, поправьте chown на хосте или используйте named volume. Подробнее здесь — объекты Docker, работа с Docker.
Вопрос. Два контейнера в Compose не видят друг друга по имени сервиса.
Ответ. Сервисы должны быть в одной пользовательской сети Compose; обращайтесь по имени сервиса из YAML, не по localhost внутри контейнера. Проверьте networks: и что оба сервиса подключены. Подробнее здесь — сеть, Compose, примеры — готовые стеки.
Вопрос. depends_on в Compose есть, но приложение падает — "connection refused" к PostgreSQL.
Ответ. depends_on ждёт старт контейнера, а не готовность БД. Добавьте healthcheck у postgres, condition: service_healthy или retry/backoff в приложении. Подробнее здесь — Compose, работа с Docker, готовый пример app+db — стек №4.
Вопрос. Диск забит — Docker пишет "no space left on device".
Ответ. Старые образы, остановленные контейнеры и build cache копятся в /var/lib/docker. docker system df, затем docker system prune (осторожно с неиспользуемыми volumes). Подробнее здесь — работа с Docker, объекты Docker.
Вопрос. Контейнер убит с кодом 137 — что это значит?
Ответ. Часто OOM Kill: процесс превысил лимит памяти cgroup. Задайте --memory / mem_limit в Compose, профилируйте утечки, увеличьте лимит на хосте. Подробнее здесь — работа с Docker, Swarm и Kubernetes.
Вопрос. Запускаю всё от root внутри образа — "на локалке же норм".
Ответ. Root в контейнере при escape или монтировании docker.sock — root на хосте. В Dockerfile — USER, минимальные capabilities, read-only root FS где возможно. Подробнее здесь — работа с Docker, оглавление раздела.
Вопрос. kubectl get pods — статус ImagePullBackOff.
Ответ. Кластер не может скачать образ: неверное имя/тег, приватный registry без imagePullSecrets, сеть или rate limit Docker Hub. kubectl describe pod — Events внизу. Подробнее здесь — первые шаги K8s, справочник Kubernetes.
Вопрос. Pod в CrashLoopBackOff — контейнер перезапускается каждые секунды.
Ответ. Приложение падает при старте или liveness probe убивает pod слишком рано. kubectl logs pod --previous, events, проверьте env, ConfigMap и образ. Подробнее здесь — реализация Kubernetes, справочник Kubernetes.
Вопрос. Pod долго в Pending — "0/3 nodes are available: insufficient cpu".
Ответ. Запрошено requests больше, чем свободно на нодах, или taints без tolerations. Уменьшите requests, добавьте ноды или поправьте nodeSelector/affinity. Подробнее здесь — Swarm и Kubernetes, реализация Kubernetes.
Вопрос. kubectl apply прошёл, но в pod старый код — деплой "не сработал".
Ответ. Образ с тегом latest мог не перекачаться (imagePullPolicy: Always или смените тег). Проверьте revision deployment и что rollout завершился: kubectl rollout status. Подробнее здесь — реализация Kubernetes, Dockerfile.
Вопрос. Ingress отдаёт 502 Bad Gateway, pod Running.
Ответ. Service смотрит не на те labels/ports, приложение слушает другой порт, или readiness не пройден — трафик идёт на неготовые endpoints. Проверьте kubectl get endpoints, Service targetPort и логи ingress-controller. Подробнее здесь — реализация Kubernetes, сеть.
Вопрос. ConfigMap изменили, приложение в pod всё ещё со старыми значениями.
Ответ. Смонтированный ConfigMap не всегда hot-reload — часто нужен restart pod/deployment. Secrets и envFrom тоже фиксируются на старте контейнера. Подробнее здесь — справочник Kubernetes, реализация Kubernetes.
Вопрос. HPA не добавляет реплики при высокой нагрузке.
Ответ. Нужен рабочий metrics-server (или custom metrics), заданы requests у контейнеров, HPA ссылается на правильный Deployment. Проверьте kubectl describe hpa. Подробнее здесь — реализация Kubernetes, Swarm и Kubernetes.
Вопрос. kubectl пишет "Forbidden" — права есть у коллеги, у меня нет.
Ответ. RBAC: ваш ServiceAccount или user не входит в RoleBinding для namespace/ресурса. kubectl auth can-i create pods -n prod. Подробнее здесь — справочник Kubernetes, первые шаги K8s.
Вопрос. Helm install failed — release в статусе failed, ресурсы половиной висят.
Ответ. Смотрите helm status, hooks и pre-install jobs. Откат: helm rollback или helm uninstall с пониманием, что удалится. Values и chart version должны совпадать со средой. Подробнее здесь — реализация Kubernetes, Swarm и Kubernetes.
Вопрос. Docker Desktop на Windows — WSL2, контейнеры "тормозят" или не стартуют.
Ответ. Проверьте интеграцию WSL2, лимиты памяти/CPU в настройках Desktop, что диск не переполнен внутри дистрибутива. Перезапуск Docker Desktop и wsl --shutdown — типичный первый шаг. Подробнее здесь — первые шаги K8s, Docker.
Вопрос. Один сервер — ставить Swarm, Kubernetes или просто Compose?
Ответ. Локально и на малом стенде достаточно Compose; Swarm/K8s нужны для оркестрации множества сервисов, rolling update и self-healing в кластере. Не поднимайте полный K8s "ради одного контейнера". Подробнее здесь — Swarm и Kubernetes, оглавление.
Вопрос. Пробросил порт, с хоста сайт открывается, из другого контейнера — нет.
Ответ. -p публикует порт на интерфейс хоста; между контейнерами используйте внутреннюю сеть Docker и порт контейнера без publish. host.docker.internal — для доступа контейнера к сервисам на хосте (Desktop). Подробнее здесь — сеть, справочник.
Вопрос. docker compose up -d — сервис unhealthy, healthcheck fail.
Ответ. Команда healthcheck слишком строгая, короткий interval/start_period или приложение слушает не тот порт. Временно уберите healthcheck для отладки, поправьте test: и таймауты. Подробнее здесь — Compose, работа с Docker.
Вопрос. Смонтировали docker.sock в контейнер — CI "удобно", безопасно ли?
Ответ. Это полный контроль над хостом для процесса внутри контейнера. В prod и shared CI используйте Kaniko, buildkit в изолированном runner, rootless. Подробнее здесь — работа с Docker, оглавление.
Вопрос. Переключил kubectl config use-context — команды бьют не в тот кластер.
Ответ. Всегда проверяйте текущий context и namespace: kubectl config current-context, kubectl config set-context --current --namespace=…. Для prod — отдельный kubeconfig или prompt в shell. Подробнее здесь — первые шаги K8s, справочник Kubernetes.
Вопрос. Чем Docker отличается от виртуальной машины?
Ответ. Контейнер делит ядро хоста и изолирует процесс через namespaces и cgroups; VM поднимает отдельную ОС на гипервизоре. Контейнеры стартуют быстрее и легче по ресурсам, но изоляция слабее, чем у полноценной VM. Подробнее здесь — Docker, объекты Docker.
Вопрос. Как установить Docker на Windows 10 и 11?
Ответ. Скачайте Docker Desktop, включите WSL2 или Hyper-V по требованиям установщика, перезагрузите ПК и дождитесь запуска демона в трее. Проверка — docker version в PowerShell или терминале WSL. Подробнее здесь — Docker, первые шаги K8s.
Вопрос. Что такое Kubernetes простыми словами?
Ответ. Kubernetes — оркестратор контейнеров: распределяет pod по нодам, перезапускает упавшие, масштабирует реплики и обновляет версии без простоя. Вы описываете желаемое состояние в YAML, control plane приводит кластер к нему. Подробнее здесь — Swarm и Kubernetes, реализация Kubernetes.
Вопрос. Как посмотреть логи Docker-контейнера?
Ответ. Команда docker logs <container> показывает stdout/stderr процесса; -f — поток в реальном времени, --tail 100 — последние строки. Для упавшего контейнера укажите id или имя из docker ps -a. Подробнее здесь — работа с Docker, справочник.
Вопрос. Что означает инструкция FROM в Dockerfile?
Ответ. FROM задаёт базовый образ, на который накладываются следующие слои: ОС, runtime, зависимости. Первая инструкция в Dockerfile (кроме ARG перед FROM); тег или digest фиксируют версию для воспроизводимых сборок. Подробнее здесь — Dockerfile, объекты Docker.
Вопрос. Что такое Helm chart в Kubernetes?
Ответ. Helm chart — упакованный набор шаблонов манифестов K8s плюс values для параметров среды. helm install разворачивает release; обновления и откаты версионируются без ручного редактирования десятков YAML. Подробнее здесь — реализация Kubernetes, Swarm и Kubernetes.
Вопрос. Зачем нужен Ingress в Kubernetes?
Ответ. Ingress — HTTP-маршрутизация снаружи кластера к Service: host, path, TLS, балансировка через ingress-controller (nginx, traefik). Один внешний IP вместо NodePort на каждый сервис. Подробнее здесь — реализация Kubernetes, сеть.
Вопрос. Что такое Persistent Volume в Kubernetes?
Ответ. PersistentVolume (PV) — том с данными, переживающий перезапуск pod; PVC запрашивает объём у кластера. Без PV файлы в контейнере исчезают при удалении pod, как в Docker без volume. Подробнее здесь — справочник Kubernetes, объекты Docker.
Вопрос. Как установить и запустить minikube на ноутбуке?
Ответ. Установите minikube и драйвер (Docker, Hyper-V, KVM), выполните minikube start, затем kubectl использует context minikube. Подходит для локальной практики с Deployment, Service и Ingress без облачного кластера. Подробнее здесь — первые шаги K8s, оглавление.
Вопрос. Как уменьшить размер Docker-образа?
Ответ. Выбирайте slim/alpine базу, multi-stage build, .dockerignore, объединяйте RUN и не копируйте артефакты сборки в финальный слой. Меньший образ быстрее pull и деплой в CI/CD. Подробнее здесь — Dockerfile, работа с Docker.
Вопрос. Как зайти внутрь работающего Docker-контейнера?
Ответ. docker exec -it <container> /bin/sh (или bash) открывает интерактивную shell внутри уже запущенного контейнера. Для одноразовой отладки без долгоживущего процесса используйте docker run -it с нужным образом. Подробнее здесь — работа с Docker, справочник.
Вопрос. Чем Docker Compose отличается от Kubernetes?
Ответ. Compose описывает несколько контейнеров на одном хосте в YAML для dev и малых стендов; Kubernetes управляет кластером, репликами, self-healing и rolling update в prod. Compose проще стартовать, K8s — для масштаба и отказоустойчивости. Подробнее здесь — Compose, готовые стеки, Swarm и Kubernetes.
Вопрос. Зачем нужен файл .dockerignore?
Ответ. .dockerignore исключает каталоги и файлы из контекста сборки, который отправляется демону при docker build. Меньше данных — быстрее build и нет случайного COPY секретов или node_modules в образ. Подробнее здесь — Dockerfile, Docker.
Вопрос. Как создать namespace в Kubernetes?
Ответ. kubectl create namespace dev или манифест Namespace; дальше -n dev в командах и metadata.namespace в ресурсах. Namespace изолирует объекты и квоты внутри одного кластера для команд и сред. Подробнее здесь — справочник Kubernetes, первые шаги K8s.
Вопрос. Чем ClusterIP отличается от NodePort и LoadBalancer?
Ответ. ClusterIP — внутренний IP только внутри кластера; NodePort публикует порт на каждой ноде; LoadBalancer запрашивает внешний балансировщик у облака. Для HTTP снаружи часто добавляют Ingress поверх Service. Подробнее здесь — сеть, реализация Kubernetes.
Вопрос. Что такое multi-stage build в Dockerfile?
Ответ. Несколько инструкций FROM в одном Dockerfile: в первой стадии компиляция, во второй — только бинарник в минимальный runtime-образ. Компилятор и исходники не попадают в финальный слой. Подробнее здесь — Dockerfile, примеры Go, Node, SPA — галерея Lab, работа с Docker.
Вопрос. Что такое liveness probe в Kubernetes?
Ответ. Liveness probe проверяет, жив ли процесс в контейнере; при повторных fail kubelet перезапускает контейнер. От readiness отличается тем, что readiness снимает pod с балансировки, liveness — лечит зависшее приложение. Подробнее здесь — реализация Kubernetes, справочник Kubernetes.
Вопрос. Как работает Docker Hub и зачем нужен registry?
Ответ. Registry хранит образы по имени и тегу; Docker Hub — публичный реестр по умолчанию. docker push публикует образ, docker pull — скачивает на другой хост или в CI перед деплоем. Подробнее здесь — Docker, объекты Docker.
Вопрос. Когда нужен StatefulSet вместо Deployment?
Ответ. StatefulSet даёт стабильные имена pod и тома, упорядоченный старт и stop — для БД, очередей, кластеров с локальным состоянием. Deployment подходит для stateless-сервисов, где pod взаимозаменяемы. Подробнее здесь — реализация Kubernetes, Swarm и Kubernetes.
Вопрос. Чем Podman отличается от Docker?
Ответ. Podman запускает контейнеры без центрального демона, часто rootless; CLI сознательно похож на docker. Образы совместимы с OCI, но сеть и compose-стек могут отличаться от Docker Desktop. Подробнее здесь — Docker, оглавление.
Вопрос. Чем pod отличается от контейнера в Kubernetes?
Ответ. Pod — минимальная единица планирования в K8s: один или несколько контейнеров с общими network namespace и томами. Контейнер — изолированный процесс внутри pod; kubelet управляет pod, а не отдельным docker-контейнером напрямую. Подробнее здесь — справочник Kubernetes, первые шаги K8s.
Вопрос. Как посмотреть логи pod в Kubernetes?
Ответ. kubectl logs <pod> -n <namespace> выводит логи контейнера; -f — follow, -c — имя контейнера при нескольких в pod, --previous — логи упавшего рестарта. Для отладки CrashLoopBackOff начните с --previous. Подробнее здесь — первые шаги K8s, справочник Kubernetes.
Что вынести из раздела
- Контейнер — изолированный процесс с собственной файловой системой; образ — неизменяемый шаблон слоёв для его запуска.
- Docker Engine = клиент + демон на хосте (образы, контейнеры) + реестр для обмена образами;
build/pull/run/push— схема; оркестрация (Swarm, Kubernetes) — отдельный уровень для кластеров. - Жизненный цикл:
Dockerfile
docker build
docker push
docker pull
docker run
Разбор:
Dockerfile— декларативное описание слоёв образа — базовый образ, зависимости, команда запуска; из него собирают артефакт, а не "живой" контейнер.docker build— демон читает Dockerfile и контекст каталога, выполняет инструкции (FROM,RUN,COPY…) и складывает слои в локальный образ с тегом.docker push— загрузка собранного образа в удалённый registry (Docker Hub, ECR, GHCR), чтобы другие хосты и CI могли его скачать.docker pull— скачивание образа по имени и тегу (или digest) из registry в локальный кэш перед запуском или деплоем.docker run— создание и старт контейнера из образа — изоляция процесса, сеть, тома, проброс портов, переменные окружения.- Цепочка отражает типичный путь: описали → собрали → опубликовали → развернули на целевой машине или в оркестраторе.
- Данные вне контейнера — тома и bind mount; сеть между сервисами — пользовательские сети и DNS по имени сервиса в Compose.
- Compose описывает несколько контейнеров в YAML; CLI —
docker compose(V2).
docker compose
Разбор:
docker compose— подкоманда Docker CLI V2 для мультиконтейнерных стеков по файлуcompose.yaml(раньше отдельный бинарьdocker-compose).- Без аргументов часто подразумевают
docker compose up— поднять все сервисы, сети и тома, описанные в манифесте. - Compose читает YAML — образы,
ports,environment,volumes,depends_on, пользовательские сети — и согласует запуск через Engine. - Один файл заменяет длинную цепочку ручных
docker runи упрощает локальную разработку и тестовые стенды. - В продакшене тот же манифест может быть основой, но часто его заменяют или дополняют Kubernetes/Swarm.
- В продакшене — лимиты ресурсов,
restart, healthcheck, минимальные образы, non-root,--security-opt; при росте нагрузки — Kubernetes или Swarm.
Куда смотреть дальше
| Тема | Глава |
|---|---|
| Обзор Docker, CLI | Docker |
| Образы, слои, тома | Объекты Docker |
| Сети | Сеть в контейнерах |
| Dockerfile | Dockerfile |
| Готовые Dockerfile (Node, Python, Go…) | Dockerfile — 10 типовых образов |
| Compose | docker-compose |
| Готовые стеки (nginx, Postgres, WordPress…) | Docker Compose — готовые стеки |
| Swarm и Kubernetes | Docker Swarm и Kubernetes, Справочник по Kubernetes |
| Справочник команд | Справочник по Docker |
| Самопроверка | Чек-лист |
Куда идти дальше
| Тема | Раздел |
|---|---|
| "Микросервисы и интеграция — о разделе" | "Микросервисы и интеграция — о разделе" |
| "SQL — о разделе" | "SQL — о разделе" |
| "Методы защиты пользовательских и корпоративных данных" | "Методы защиты пользовательских и корпоративных данных" |
| "JavaScript — о разделе" | "JavaScript — о разделе" |
Проверьте себя: Чек-лист самопроверки.