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.