Глиф Учебники

Урок 1. Что такое Docker: образы и контейнеры

Курс «Docker» · урок 1 из 10 · 5 минут чтения

Знакомая история: программа работает на компьютере разработчика, а на сервере не запускается. На сервере другая версия Python, не хватает библиотеки или настройки лежат не там. Docker решает эту задачу так: программу упаковывают вместе со всем, что ей нужно для работы, в один пакет — образ. Из образа запускается контейнер, и он ведёт себя одинаково на любом компьютере с Docker.

Образ

Образ (image) — это заготовка для запуска программы. В нём лежат:

Образ не меняется: из него только читают. Устроен он слоями — каждый слой добавляет или меняет файлы предыдущего. Если у двух образов общая основа, например один и тот же Debian, на диске она хранится один раз.

У образа есть имя и тег — метка версии через двоеточие: nginx:alpine, postgres:18, python:3.13-slim. Без тега подставляется latest. Это просто имя метки, которое авторы образа обычно ставят на свежую версию, а не гарантия, что версия самая новая.

Контейнер

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

Что есть у каждого контейнера:

контейнер 1 контейнер 2 слой для записи слой для записи программа библиотеки файлы системы у каждого контейнера свой, удаляется с ним Образ только чтение, один на все контейнеры
Контейнеры одного образа делят его слои только для чтения, а сверху у каждого свой слой для записи.

Когда контейнер удаляют, его слой для записи удаляется вместе с ним. Поэтому данные, которые нужно сохранить (базы данных, загруженные файлы), держат в томах — о них отдельный урок Данные: тома и папки.

Чем контейнер отличается от виртуальной машины

Виртуальная машина — это целый компьютер внутри компьютера: свой виртуальный процессор, диск и, главное, своё ядро операционной системы. Контейнер своего ядра не имеет — все контейнеры работают на ядре хоста: так называют компьютер или виртуальную машину, где работает Docker. Ядро само отделяет их друг от друга: в Linux для этого есть пространства имён (namespaces) и контрольные группы (cgroups).

Контейнеры запуск за секунды, мегабайты Nginx PostgreSQL Python служба Docker ядро хоста — одно на всех компьютер Виртуальные машины десятки секунд, гигабайты программа ОС Linux своё ядро программа ОС Windows своё ядро программа виртуализации компьютер
Контейнеры работают на одном общем ядре хоста, а у каждой виртуальной машины своё ядро и целая система.
КонтейнерВиртуальная машина
Ядро системыобщее с хостомсвоё
Запускобычно доли секунды или секундыдесятки секунд и дольше, загружается вся система
Размерот нескольких мегабайт до сотенгигабайты
Памятьстолько, сколько занимает программазаранее выделенный объём под всю систему
Изоляцияхорошая, но ядро общеесильнее: отдельное ядро
Другая ОС внутритолько Linux на Linuxлюбая: Windows, Linux, BSD

Отсюда правила выбора. Нужно запустить много служб на одном сервере, быстро и с малыми затратами — контейнеры. Нужна другая операционная система, своё ядро или строгая изоляция от соседей — виртуальная машина. Их часто совмещают: Docker ставят внутрь виртуальной машины, и в ней работают контейнеры — тогда хост для них эта виртуальная машина.

Контейнеры Linux работают только на ядре Linux. На Windows и macOS Docker Desktop запускает небольшую виртуальную машину с Linux и уже в ней — контейнеры. Для команд это незаметно: они одинаковые везде.

Как устроен Docker

Docker Engine состоит из двух частей:

Команда docker run nginx по шагам: команда передаёт службе просьбу запустить контейнер из образа nginx; служба ищет образ у себя, не находит и скачивает его из реестра; создаёт контейнер, подключает сеть и запускает в нём Nginx.

Хост — компьютер с Docker $ docker run nginx команда docker 1 передаёт просьбу служба dockerd ищет образ у себя: нет 3 создаёт и запускает контейнер своя сеть, работает Nginx Реестр Docker Hub nginx postgres python 2 скачивает
По команде docker run nginx служба dockerd не находит образ у себя, скачивает его из Docker Hub и запускает контейнер.

Откуда берутся образы

Реестр (registry) — сервер, где хранят образы. Основной общедоступный — Docker Hub (hub.docker.com). Там есть:

Кроме Docker Hub есть другие реестры, а компании часто держат свой. Тогда имя образа начинается с адреса реестра: registry.example.com/team/app:1.4.

Образ — это чужая программа, которая работает на вашем сервере. Берите официальные образы и образы самих разработчиков программы. Образ «с готовыми настройками» от неизвестного автора может содержать что угодно.

Слова, которые понадобятся

Коротко

Проверьте себя

1. Чем образ отличается от контейнера?
2. Что происходит с файлами, которые программа создала внутри контейнера, если контейнер удалить?
3. Почему контейнер запускается намного быстрее виртуальной машины?
4. Что означает образ postgres без тега?