Урок 1. Что такое Docker: образы и контейнеры
Знакомая история: программа работает на компьютере разработчика, а на сервере не запускается. На сервере другая версия Python, не хватает библиотеки или настройки лежат не там. Docker решает эту задачу так: программу упаковывают вместе со всем, что ей нужно для работы, в один пакет — образ. Из образа запускается контейнер, и он ведёт себя одинаково на любом компьютере с Docker.
Образ
Образ (image) — это заготовка для запуска программы. В нём лежат:
- сама программа — например, веб-сервер Nginx или база данных PostgreSQL;
- библиотеки и файлы, без которых она не работает;
- минимальный набор файлов операционной системы — обычно урезанный Debian, Ubuntu или Alpine Linux;
- настройки запуска: какую команду выполнить, какие порты слушает программа.
Образ не меняется: из него только читают. Устроен он слоями — каждый слой добавляет или меняет файлы предыдущего. Если у двух образов общая основа, например один и тот же Debian, на диске она хранится один раз.
У образа есть имя и тег — метка версии через двоеточие: nginx:alpine, postgres:18, python:3.13-slim. Без тега подставляется latest. Это просто имя метки, которое авторы образа обычно ставят на свежую версию, а не гарантия, что версия самая новая.
Контейнер
Контейнер (container) — запущенный экземпляр образа. Образ похож на установочный диск, контейнер — на программу, установленную с него и работающую прямо сейчас. Из одного образа можно запустить сколько угодно контейнеров: они не мешают друг другу.
Что есть у каждого контейнера:
- свои файлы — содержимое образа плюс тонкий слой для записи сверху: всё, что программа создаёт или меняет, попадает в этот слой;
- свои процессы — изнутри контейнера видны только его программы, а не вся система;
- своя сеть — свой адрес, свои порты;
- ограничения — сколько памяти и процессора можно занять.
Когда контейнер удаляют, его слой для записи удаляется вместе с ним. Поэтому данные, которые нужно сохранить (базы данных, загруженные файлы), держат в томах — о них отдельный урок Данные: тома и папки.
Чем контейнер отличается от виртуальной машины
Виртуальная машина — это целый компьютер внутри компьютера: свой виртуальный процессор, диск и, главное, своё ядро операционной системы. Контейнер своего ядра не имеет — все контейнеры работают на ядре хоста: так называют компьютер или виртуальную машину, где работает Docker. Ядро само отделяет их друг от друга: в Linux для этого есть пространства имён (namespaces) и контрольные группы (cgroups).
| Контейнер | Виртуальная машина | |
|---|---|---|
| Ядро системы | общее с хостом | своё |
| Запуск | обычно доли секунды или секунды | десятки секунд и дольше, загружается вся система |
| Размер | от нескольких мегабайт до сотен | гигабайты |
| Память | столько, сколько занимает программа | заранее выделенный объём под всю систему |
| Изоляция | хорошая, но ядро общее | сильнее: отдельное ядро |
| Другая ОС внутри | только Linux на Linux | любая: Windows, Linux, BSD |
Отсюда правила выбора. Нужно запустить много служб на одном сервере, быстро и с малыми затратами — контейнеры. Нужна другая операционная система, своё ядро или строгая изоляция от соседей — виртуальная машина. Их часто совмещают: Docker ставят внутрь виртуальной машины, и в ней работают контейнеры — тогда хост для них эта виртуальная машина.
Контейнеры Linux работают только на ядре Linux. На Windows и macOS Docker Desktop запускает небольшую виртуальную машину с Linux и уже в ней — контейнеры. Для команд это незаметно: они одинаковые везде.
Как устроен Docker
Docker Engine состоит из двух частей:
- служба
dockerd(её ещё называют демоном) — работает в фоне от root, скачивает образы, создаёт и запускает контейнеры, настраивает их сеть; - команда
docker— то, что вы набираете в терминале. Она передаёт просьбы службе и показывает ответ.
Команда docker run nginx по шагам: команда передаёт службе просьбу запустить контейнер из образа nginx; служба ищет образ у себя, не находит и скачивает его из реестра; создаёт контейнер, подключает сеть и запускает в нём Nginx.
Откуда берутся образы
Реестр (registry) — сервер, где хранят образы. Основной общедоступный — Docker Hub (hub.docker.com). Там есть:
- официальные образы —
nginx,postgres,python,ubuntu,mariadbи другие; их собирают по открытым правилам и регулярно обновляют. Имя у них без косой черты; - образы организаций и людей — имя вида
организация/образ, напримерgrafana/grafana.
Кроме Docker Hub есть другие реестры, а компании часто держат свой. Тогда имя образа начинается с адреса реестра: registry.example.com/team/app:1.4.
Образ — это чужая программа, которая работает на вашем сервере. Берите официальные образы и образы самих разработчиков программы. Образ «с готовыми настройками» от неизвестного автора может содержать что угодно.
Слова, которые понадобятся
- образ (image) — заготовка: программа и всё для её запуска;
- контейнер (container) — запущенный экземпляр образа;
- тег (tag) — версия образа после двоеточия:
postgres:18; - реестр (registry) — хранилище образов, например Docker Hub;
- том (volume) — место для данных, которое переживает удаление контейнера;
- Dockerfile — файл с инструкциями, по которым собирают свой образ;
- хост — компьютер, на котором работает Docker.
Коротко
- Образ — неизменная заготовка из слоёв: программа, библиотеки, файлы системы и настройки запуска.
- Контейнер — запущенный образ со своими файлами, процессами и сетью; из одного образа — сколько угодно контейнеров.
- У контейнера нет своего ядра: все контейнеры работают на ядре хоста, поэтому они лёгкие и быстрые.
- Виртуальная машина тяжелее, но может запустить любую ОС и изолирована сильнее.
- Образы хранятся в реестрах; главный общедоступный — Docker Hub, начинать лучше с официальных образов.