ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Docker с нуля: что такое контейнеризация, образ и контейнер

Автор: · Обновлено

Контейнеризация — способ запускать приложение вместе с его пользовательским окружением в изолированном процессе. В образ можно включить Python, библиотеки и файлы программы. Вместо инструкции «установите эти десять зависимостей» команда получает образ и параметры запуска. Это отправная точка Docker для новичков и джунов: сначала понять объекты, затем научиться наблюдать их состояние.

Образ, контейнер, виртуальная машина

Образ (image) — неизменяемый шаблон файлов и настроек. Контейнер (container) — созданный из образа экземпляр с собственным состоянием и записываемым слоем. Можно запустить два контейнера из одного образа: файлы основы общие, изменения и процессы разные. Изменение файла внутри одного экземпляра не переписывает исходный образ.

Linux-контейнеры используют ядро Linux-хоста; виртуальная машина загружает отдельное гостевое ядро. На Windows и macOS Docker Desktop предоставляет Linux-среду через виртуализацию. Поэтому фраза «в контейнере лежит вся ОС» неточна: там может быть пользовательская часть дистрибутива, а ядро обслуживает хост или VM. Совместимость архитектуры процессора и системных вызовов всё равно важна. Устройство Docker.

ОбъектНа какой вопрос отвечаетПример
DockerfileКак собрать окружение?Установить интерпретатор, скопировать код
ImageЧто именно запускаем?python:3.13-slim
ContainerКакой экземпляр сейчас работает?Локальный сервер разработчика
VolumeГде живут сохраняемые данные?Каталог базы данных
RegistryОткуда скачать образ?Docker Hub или реестр команды

Первый эксперимент

Предполагается установленный Docker: выберите [Linux](/lessons/without-university/docker-containerization/docker-developer-02) или [Windows](/lessons/without-university/docker-containerization/docker-developer-03). Команды ниже одинаковы в Bash и PowerShell.

docker version
docker run --rm hello-world
docker run --rm alpine:3.22 cat /etc/os-release
docker image ls alpine

В docker version должны быть секции Client и Server. hello-world выводит приветствие и завершается: это успешный результат, а не падение. Следующая команда показывает пользовательское окружение Alpine. После --rm контейнер удалён, но скачанный образ остаётся в docker image ls. При первом запуске нужен доступ к реестру; при повторном образ обычно берётся из локального хранилища.

Теперь выполните docker run --rm alpine:3.22 sh -c 'echo lesson > /tmp/note; cat /tmp/note'. Результат — lesson. Новый запуск docker run --rm alpine:3.22 cat /tmp/note выдаст ошибку отсутствия файла. Причина — новый контейнер имеет новый записываемый слой. Это проверяемое отличие упаковки приложения от хранения его данных.

Где находятся Compose и Kubernetes

Docker Engine запускает контейнеры; Docker CLI посылает ему команды. Docker Compose читает YAML с несколькими сервисами и создаёт согласованное окружение, например приложение и PostgreSQL. Kubernetes управляет желаемым состоянием приложений в кластере: выбирает узлы, поддерживает реплики и выполняет обновления. Начинающему разработчику полезно освоить сначала один контейнер, затем Compose, затем задачи кластера. Назначение Kubernetes.

Это обучение Docker с нуля не требует сразу строить кластер. Если задача — запустить проект на ноутбуке, начните с [первого Compose-проекта](/lessons/without-university/docker-containerization/docker-developer-05). Один и тот же образ позже может стать частью кластерного приложения, но параметры сети и хранения придётся спроектировать отдельно.

Если первая команда не работает

Cannot connect to the Docker daemon означает, что CLI не установил соединение с Engine. Проверьте запуск Desktop или службу Linux, затем docker context ls. Ошибка скачивания образа указывает на отдельный участок — DNS, прокси, авторизацию либо реестр; она не доказывает неисправность контейнеризации. Не начинайте диагностику с удаления всех образов и томов.

Практика и самопроверка

Запустите два одноразовых контейнера Alpine: в первом выведите uname -m, во втором — id. Объясните, что относится к архитектуре исполнения, а что к пользователю процесса. Затем ответьте: почему завершившийся hello-world не должен оставаться работающим; где искать данные, которые должны пережить удаление контейнера; какой инструмент описывает несколько локальных сервисов? Ожидаемый ответ: процесс закончил работу, данные нужно вынести в явное хранилище, окружение удобно описать Compose.

Источники