В предыдущих уроках мы разобрались, зачем нужен Docker и чем контейнеры отличаются от виртуальных машин. Прежде чем переходить к практике, давайте познакомимся с тремя понятиями, вокруг которых строится вся работа с Docker. Это как выучить три слова перед поездкой в другую страну — без них вы не прочитаете меню и не спросите дорогу. Начнём с образа (image).
Вспомните аналогию с доставкой еды из первого урока. Там контейнер — это готовое блюдо: всё внутри, ничего доустанавливать не нужно. А образ — рецепт, по которому это блюдо приготовлено. Рецепт можно передать кому угодно, и каждый приготовит по нему одинаковое блюдо. Сам рецепт при этом не расходуется — по одному рецепту можно приготовить сколько угодно порций.
Ключевое слово — неизменяемый. Образ нельзя изменить после создания. Нужно что-то поменять? Создаётся новый образ. Это как коммит в Git: каждая версия зафиксирована навсегда.
Применительно к TaskMaster: мы создадим образ, в котором будет Python 3.11 и наш файл taskmaster.py. Этот образ можно передать кому угодно — коллеге, на сервер, в CI/CD. И везде TaskMaster запустится одинаково.
Примеры готовых образов: python:3.11, postgres:16, nginx:1.25, redis:7. Каждый — готовый шаблон, из которого за секунду создаётся рабочий контейнер.
Теперь контейнер (container).
Если образ — это рецепт, то контейнер — готовое блюдо. Из одного образа можно создать сколько угодно контейнеров, и каждый будет работать независимо.
Возвращаемся к TaskMaster. Из образа taskmaster:1.0 мы можем запустить три контейнера — и в каждом будет своя копия менеджера задач со своим файлом tasks.json. Они не знают друг о друге.
Вот аналогия, которая помогает запомнить:
Образ — это класс. Контейнер — это объект (экземпляр класса). Из одного класса можно создать сколько угодно объектов.
Если вы знакомы с ООП — эта аналогия точна. Образ описывает что должно быть. Контейнер — это конкретный запущенный экземпляр. Последнее понятие — реестр (registry).
Где хранятся образы? Не на вашем компьютере (хотя после скачивания — и на нём тоже). Образы хранятся в реестрах — хранилищах, откуда их можно скачать или куда загрузить.
Docker Hub — это как «магазин приложений» для Docker. Хотите PostgreSQL? docker pull postgres:16 — и через 30 секунд у вас готовая база данных. Хотите Redis? docker pull redis:7. Не нужно ходить по сайтам, скачивать установщики, разбираться с конфигурацией.
Когда мы упакуем TaskMaster в образ, мы сможем загрузить его на Docker Hub — и любой человек в мире сможет запустить наш менеджер задач одной командой. Давайте соберём все три понятия в одну картину. Вот как выглядит типичный рабочий процесс:
1. Вы пишете Dockerfile (инструкция для сборки образа)
↓
2. Docker собирает образ (taskmaster:1.0)
↓
3. Образ загружается в реестр (Docker Hub)
↓
4. Коллега скачивает образ из реестра
↓
5. Из образа создаётся контейнер
↓
6. TaskMaster работает на компьютере коллеги!
Шесть шагов — от кода на вашем ноутбуке до работающего приложения у коллеги. Без установки Python, без pip install, без настройки окружения. Одна команда: docker run taskmaster:1.0 list.
Кроме этих трёх понятий, в Docker есть ещё Volume (хранение данных, которые переживают перезапуск контейнера) и Network (связь между контейнерами). Мы разберём их в отдельных блоках — сейчас они не нужны.
Образ (Image) — неизменяемый шаблон для создания контейнеров. Содержит ОС, код, зависимости. Аналогия: рецепт, по которому готовят блюда. Или класс, из которого создают объекты.
Контейнер (Container) — запущенный экземпляр образа. Имеет собственную файловую систему и процессы. Из одного образа можно создать сколько угодно независимых контейнеров.
Реестр (Registry) — хранилище образов. Docker Hub — публичный реестр с миллионами готовых образов (python, postgres, nginx). Можно создать приватный реестр.
Рабочий процесс: Dockerfile → образ → реестр → скачивание → контейнер → работающее приложение.
Volume — хранение данных отдельно от контейнера. Network — связь между контейнерами. Подробности — в отдельных блоках.