1.1. Требования к Linux
Цели
После этого материала вы сможете:
- проверить, что ваша система пригодна для Docker Engine, и сделать это осознанно, а не по принципу «попробуем поставить»;
- определить CPU architecture и понять, почему это влияет на выбор образов;
- определить версию kernel и убедиться, что она поддерживает нужные механизмы;
- определить, какая версия cgroup используется, и объяснить, почему это важно для всего курса;
- оценить требования к дисковому пространству и выбрать место для Docker data;
- понять, что делать, если система не соответствует требованиям.
Предварительные знания
- Работа в терминале Linux: выполнение команд, чтение вывода.
- Понимание, что такое ядро операционной системы (в общих чертах).
Ключевые термины
| Термин | Объяснение |
|---|---|
kernel | Ядро Linux — программа, управляющая процессами, памятью, файловыми системами и устройствами. Именно ядро реализует механизмы, на которых работают containers |
architecture | Архитектура процессора: x86_64 (он же amd64), aarch64 (он же arm64) и другие. Определяет, какие бинарные файлы могут выполняться |
cgroup | Control group — механизм ядра для учёта и ограничения ресурсов группы процессов |
cgroup v2 | Вторая версия механизма с единой иерархией. Современный стандарт |
overlay2 | Storage driver Docker, использующий OverlayFS для объединения слоёв образа |
LTS | Long Term Support — версия дистрибутива с длительным сроком поддержки |
Теория
Что Docker требует от системы
Docker Engine — это не виртуальная машина и не эмулятор. Он использует механизмы, которые уже есть в ядре Linux: namespaces, cgroups, capabilities, OverlayFS. Поэтому требования формулируются просто: нужно ядро Linux достаточно новой версии, собранное с нужными опциями, и файловая система, поддерживающая overlay.
Практически все современные дистрибутивы это обеспечивают. Проблемы возникают в трёх случаях: очень старая система, необычная файловая система, или контейнер/виртуальная машина с урезанным ядром (например, некоторые VPS на OpenVZ).
Официальные требования
Docker публикует список поддерживаемых версий Ubuntu. На момент написания курса (июль 2026) поддерживаются:
| Версия Ubuntu | Кодовое имя | Тип |
|---|---|---|
| 26.04 | Resolute | LTS |
| 25.10 | Questing | обычный релиз |
| 24.04 | Noble | LTS |
| 22.04 | Jammy | LTS |
Курс ориентируется на LTS-версии: 22.04, 24.04, 26.04. Все команды курса проверены на этих версиях.
Поддерживаются архитектуры x86_64/amd64, armhf, arm64, s390x, ppc64le. Практически вы столкнётесь с первыми двумя.
Факт против рекомендации. Факт: Docker официально поддерживает перечисленные версии. Рекомендация: используйте LTS. Обычные релизы Ubuntu живут девять месяцев, и обновление системы посреди курса создаст лишние проблемы.
Почему architecture имеет значение
Образ содержит скомпилированные бинарные файлы. Образ, собранный для amd64, не запустится на arm64 без эмуляции. Это регулярный источник путаницы: разработчик на ноутбуке с ARM-процессором собирает образ, публикует его, а на сервере с amd64 он не запускается.
Многие официальные образы публикуются как multi-platform: под одним тегом лежит несколько вариантов, и Docker выбирает подходящий автоматически. Но это верно не для всех образов — и не для образов, которые собираете вы.
Подробно тема разбирается в разделе 03. Сейчас достаточно знать свою архитектуру.
cgroup v1 против cgroup v2
Это важнее, чем кажется. Cgroups — механизм ограничения ресурсов, и у него две несовместимые версии интерфейса.
cgroup v1 — старая модель: отдельная иерархия для каждого контроллера (memory, cpu, blkio...). Файлы разбросаны по разным точкам монтирования в /sys/fs/cgroup/.
cgroup v2 — единая иерархия: все контроллеры работают с одним деревом. Файлы имеют другие имена и другую семантику.
Практические последствия для курса:
- Пути к файлам cgroup, показанные в разделе 02 и разделе 17, различаются между версиями.
- Часть возможностей (например, корректный учёт памяти в rootless mode) работает только на v2.
- Docker Engine 29 объявил поддержку cgroup v1 устаревшей.
Ubuntu использует cgroup v2 по умолчанию начиная с версии 21.10. Если у вас 22.04 или новее — почти наверняка v2. Курс написан под v2; для v1 добавлены отдельные примечания там, где это существенно.
Файловая система и storage driver
Docker хранит слои образов в каталоге данных (по умолчанию /var/lib/docker) и объединяет их через storage driver. Современный и единственный рекомендуемый драйвер — overlay2.
overlay2 работает поверх ext4, xfs (с ftype=1) и большинства других распространённых файловых систем. Проблемы возникают на экзотических конфигурациях и на xfs, отформатированной без ftype=1 — такая система не поддерживает overlay, и Docker откажется работать.
Начиная с Docker Engine 29 новые установки по умолчанию используют containerd image store вместо классического хранилища образов. Он использует те же снапшоттеры на базе OverlayFS, но хранит образы иначе. Последствия разбираются в разделе 03.
Дисковое пространство
Требования курса:
| Что | Объём |
|---|---|
| Docker Engine и зависимости | ~500 MB |
| Образы курса (Python, PostgreSQL, Redis, registry, вспомогательные) | ~4 GB |
| Build cache при выполнении упражнений | 2–5 GB |
| Volumes и данные упражнений | 1–2 GB |
| Запас на эксперименты | ~5 GB |
| Итого рекомендуется | не менее 20 GB свободно |
Это не преувеличение. Build cache растёт незаметно, и типичный сценарий на второй неделе курса — «на диске кончилось место, и я не понимаю почему». Раздел 13.04 посвящён именно этому.
Оперативная память
Минимум для базовых упражнений — 2 GB. Начиная с раздела 09 одновременно работают FastAPI, PostgreSQL, Redis и worker; комфортный минимум — 4 GB.
Внутренний механизм
Что именно проверяет Docker при запуске
При старте dockerd проверяет доступность механизмов ядра и выбирает драйверы. Основные проверки:
- Поддержка namespaces. Ядро должно быть собрано с
CONFIG_NAMESPACES,CONFIG_PID_NS,CONFIG_NET_NS,CONFIG_UTS_NS,CONFIG_IPC_NS,CONFIG_USER_NS. В стандартных дистрибутивных ядрах это включено. - Поддержка cgroups. Нужны контроллеры
memory,cpu,cpuset,pids,io. - Поддержка выбранного storage driver. Для
overlay2— модульoverlayи подходящая файловая система под каталогом данных. - Поддержка сетевых механизмов. Модули
bridge,veth,iptablesилиnftables,br_netfilter.
Если чего-то не хватает, daemon либо не стартует, либо стартует с предупреждениями. Предупреждения видны в docker info в конце вывода.
Почему на некоторых VPS Docker не работает
Виртуализация бывает разной. На KVM, Xen, VMware и физическом сервере у вас своё ядро — Docker работает. На OpenVZ и части LXC-конфигураций ядро общее с хост-системой провайдера, и вы не можете загружать модули или использовать все namespaces. Там Docker может не запуститься или работать частично.
Проверить тип виртуализации:
systemd-detect-virt
Вывод kvm, vmware, microsoft, none (физическая машина) — всё в порядке. Вывод openvz или lxc — возможны проблемы.
Команды и примеры
Проверка architecture
uname -m
Что делает: выводит машинную архитектуру.
Ожидаемый результат — одна строка:
x86_64
Или aarch64 на ARM-системах.
Соответствие обозначений, которое нужно помнить: x86_64 в выводе uname — это amd64 в терминологии Docker; aarch64 — это arm64. Одна и та же архитектура, два набора названий.
Второй способ, дающий сразу «докеровское» имя:
dpkg --print-architecture
amd64
Эта команда используется при настройке apt repository в следующем уроке.
Проверка версии kernel
uname -r
6.8.0-88-generic
Первые два числа — версия ядра (здесь 6.8). Docker Engine требует ядро не ниже 3.10, что сегодня не является практическим ограничением: любая поддерживаемая версия Ubuntu идёт с ядром 5.15 и новее.
Полная информация:
uname -a
Проверка дистрибутива
cat /etc/os-release
Важные поля:
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION_CODENAME=noble
UBUNTU_CODENAME=noble
VERSION_CODENAME понадобится при настройке репозитория. Извлечь его отдельно:
. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}"
Что делает: загружает переменные из файла в текущий shell и печатает кодовое имя, предпочитая UBUNTU_CODENAME. Конструкция ${A:-B} означает «значение A, а если оно пустое — значение B». Это нужно для производных дистрибутивов (Linux Mint, Pop!_OS), где VERSION_CODENAME содержит собственное имя, а UBUNTU_CODENAME — соответствующее имя Ubuntu.
Проверка версии cgroup
stat -fc %T /sys/fs/cgroup/
Что делает: выводит тип файловой системы, смонтированной в /sys/fs/cgroup.
| Вывод | Версия cgroup |
|---|---|
cgroup2fs | v2 — современная, ожидаемая курсом |
tmpfs | v1 или гибридный режим |
Дополнительная проверка для v2 — наличие файла с перечнем доступных контроллеров:
cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
Если файл существует и содержит memory, cpu, pids — cgroup v2 работает и нужные контроллеры доступны.
Проверка свободного места
df -h /var/lib
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 457G 89G 345G 21% /
Смотрите на колонку Avail для раздела, содержащего /var/lib. Именно там по умолчанию окажется /var/lib/docker.
Проверить тип файловой системы:
df -T /var/lib
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda2 ext4 478889968 92345678 362104290 21% /
ext4 или xfs — подходят. Если xfs, дополнительно проверьте ftype:
xfs_info /var/lib | grep ftype
Нужно ftype=1. При ftype=0 overlay2 работать не будет, и файловую систему придётся пересоздавать.
Проверка оперативной памяти
free -h
total used free shared buff/cache available
Mem: 15Gi 3.2Gi 8.1Gi 412Mi 4.4Gi 11Gi
Смотрите на available — это память, доступная приложениям без обращения к swap.
Проверка типа виртуализации
systemd-detect-virt
kvm
или none на физической машине.
Практическое упражнение
Соберите отчёт о пригодности вашей системы. Результатом должен быть текстовый файл, содержащий значения всех проверенных параметров и вывод о том, готова ли система.
Задание: напишите скрипт check-system.sh, который выводит:
- Дистрибутив и версию.
- Кодовое имя релиза (то, которое пойдёт в apt repository).
- Architecture в двух формах:
uname -mиdpkg --print-architecture. - Версию kernel.
- Версию cgroup.
- Тип файловой системы и свободное место под
/var/lib. - Доступную оперативную память.
- Тип виртуализации.
Скрипт должен работать без sudo и не должен ничего изменять в системе.
Подсказки
Подсказка 1
Начните с обычного набора echo и команд. Красивое форматирование добавите потом. Функция вида
row() { printf '%-24s %s\n' "$1:" "$2"; }
сделает вывод выровненным.
Подсказка 2
Кодовое имя удобно получить так:
codename="$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")"
Скобки создают subshell, поэтому переменные из os-release не «протекут» в остальной скрипт.
Подсказка 3
Для вывода о cgroup сравните результат stat -fc %T /sys/fs/cgroup/ со строкой cgroup2fs через if [ "$x" = "cgroup2fs" ].
Решение
Сначала выполните задание самостоятельно.
Показать решение
#!/usr/bin/env bash
# check-system.sh — проверка пригодности системы для Docker Engine.
set -euo pipefail
row() { printf '%-26s %s\n' "$1:" "$2"; }
echo "=== Пригодность системы для Docker Engine ==="
echo
# Дистрибутив
distro="$(. /etc/os-release && echo "$NAME $VERSION_ID")"
codename="$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")"
row "Дистрибутив" "$distro"
row "Кодовое имя релиза" "$codename"
# Architecture
row "Architecture (uname)" "$(uname -m)"
row "Architecture (dpkg)" "$(dpkg --print-architecture 2>/dev/null || echo 'dpkg недоступен')"
# Kernel
row "Kernel" "$(uname -r)"
# cgroup
cgroup_fs="$(stat -fc %T /sys/fs/cgroup/)"
if [ "$cgroup_fs" = "cgroup2fs" ]; then
cgroup_ver="v2"
else
cgroup_ver="v1 или гибридный режим ($cgroup_fs)"
fi
row "cgroup" "$cgroup_ver"
if [ -r /sys/fs/cgroup/cgroup.controllers ]; then
row "cgroup controllers" "$(cat /sys/fs/cgroup/cgroup.controllers)"
fi
# Файловая система и место
row "FS под /var/lib" "$(df -T /var/lib | awk 'NR==2 {print $2}')"
row "Свободно под /var/lib" "$(df -h /var/lib | awk 'NR==2 {print $4}')"
# Память
row "Доступно RAM" "$(free -h | awk '/^Mem:/ {print $7}')"
# Виртуализация
row "Виртуализация" "$(systemd-detect-virt 2>/dev/null || echo 'неизвестно')"
echo
echo "=== Вывод ==="
ok=true
avail_gb="$(df -BG --output=avail /var/lib | tail -1 | tr -dc '0-9')"
if [ "$avail_gb" -lt 20 ]; then
echo " [!] Свободно ${avail_gb} GB — рекомендуется не менее 20 GB."
ok=false
fi
if [ "$cgroup_fs" != "cgroup2fs" ]; then
echo " [!] Используется cgroup v1. Курс ориентирован на v2;"
echo " часть путей в /sys/fs/cgroup будет отличаться."
fi
virt="$(systemd-detect-virt 2>/dev/null || echo none)"
case "$virt" in
openvz|lxc|lxc-libvirt)
echo " [!] Виртуализация $virt может не поддерживать Docker полностью."
ok=false
;;
esac
if $ok; then
echo " [+] Система пригодна для установки Docker Engine."
fi
Запуск:
chmod +x check-system.sh
./check-system.sh
Проверка результата
Скрипт должен отработать без ошибок и вывести все восемь параметров. Проверьте, что:
./check-system.sh | wc -l
выводит не менее 14 строк, и что в выводе присутствует строка с cgroup.
Если получили [+] Система пригодна — переходите к установке.
Типичные ошибки
| Ошибка | Причина | Исправление |
|---|---|---|
Использование VERSION_CODENAME на Linux Mint или Pop!_OS | Эти дистрибутивы имеют собственные кодовые имена, которых нет в репозитории Docker | Использовать ${UBUNTU_CODENAME:-$VERSION_CODENAME} |
| Установка на систему с 5 GB свободного места | Требования кажутся завышенными, пока не начнётся build cache | Освободить место заранее или вынести /var/lib/docker на другой раздел |
Путаница x86_64 и amd64 при поиске образов | Два набора названий для одной архитектуры | Запомнить соответствие: x86_64 = amd64, aarch64 = arm64 |
| Игнорирование cgroup v1 на старой системе | Кажется несущественным, пока команды из раздела 17 не начнут выдавать «файл не найден» | Проверить версию заранее и учитывать примечания курса |
xfs с ftype=0 | Файловая система создана без поддержки типов файлов; overlay2 не работает | Пересоздать файловую систему с ftype=1 или использовать другой раздел под Docker data |
| Попытка установки на OpenVZ VPS | Общее ядро без нужных возможностей | Сменить тип VPS на KVM или использовать другую машину |
Контрольные вопросы
На понимание:
- Почему Docker не требует, чтобы в образе было ядро Linux?
- Что произойдёт, если попытаться запустить образ, собранный для
arm64, на машинеamd64? - Чем cgroup v2 отличается от cgroup v1 с точки зрения организации файлов?
- Почему на некоторых VPS Docker не работает, хотя там установлен Linux?
- Почему для storage driver важен тип файловой системы под каталогом данных Docker?
На применение:
- Какой командой получить кодовое имя релиза так, чтобы это работало и на Ubuntu, и на Linux Mint?
- Как проверить, что контроллер
memoryдоступен в cgroup v2? - Как узнать, сколько свободного места осталось на разделе, где будет лежать
/var/lib/docker?
На диагностику:
docker infoв конце вывода показывает предупреждение о недоступности контроллераmemory. Где искать причину?- На машине с 40 GB диска через две недели работы место закончилось, хотя проектов немного. Какие категории данных стоит проверить в первую очередь?
Краткое резюме
- Docker использует механизмы ядра хост-системы; отдельное ядро в образе не нужно.
- Курс ориентирован на Ubuntu LTS 22.04, 24.04 и 26.04 и на архитектуры
amd64иarm64. x86_64=amd64,aarch64=arm64— одно и то же в разных обозначениях.- Cgroup v2 — современный стандарт и основа примеров курса; Ubuntu использует его с версии 21.10.
- Docker Engine 29 объявил cgroup v1 устаревшим.
- Storage driver
overlay2требует подходящей файловой системы; наxfsнуженftype=1. - Реалистичное требование к диску — не менее 20 GB свободно.
- Для разделов начиная с девятого нужно не менее 4 GB оперативной памяти.
- На OpenVZ и части LXC-конфигураций Docker может не работать из-за общего ядра.
- Проверку системы имеет смысл автоматизировать скриптом — он пригодится и на других машинах.
Официальные источники
| Источник | Ссылка | Что подтверждает |
|---|---|---|
| Install Docker Engine on Ubuntu | https://docs.docker.com/engine/install/ubuntu/ | Список поддерживаемых версий Ubuntu и архитектур |
| Docker Engine installation overview | https://docs.docker.com/engine/install/ | Общие требования к платформе |
| Docker storage drivers | https://docs.docker.com/engine/storage/drivers/ | Требования overlay2 к файловой системе, включая ftype=1 для xfs |
| Docker Engine 29 release notes | https://docs.docker.com/engine/release-notes/29/ | Объявление cgroup v1 устаревшим, containerd image store по умолчанию |
| Control Group v2 (kernel documentation) | https://docs.kernel.org/admin-guide/cgroup-v2.html | Устройство единой иерархии cgroup v2 и файлы интерфейса |
os-release(5) man page | https://man7.org/linux/man-pages/man5/os-release.5.html | Поля VERSION_CODENAME и UBUNTU_CODENAME |
Навигация
Вернуться к разделу
Следующий материал → Установка Docker Engine
Главное оглавление