05-docker — Docker CE + Compose + Buildx
☐ Опциональный. Ставит движок контейнеров Docker CE, плагин Compose и Buildx из официального репозитория Docker и добавляет deploy-пользователя в группу
docker.
Зачем нужен
Docker — движок контейнеризации: он запускает приложения в изолированных «контейнерах» вместе со всеми их зависимостями, не засоряя систему. Модуль ставит:
- Docker CE (Community Edition) — сам движок и демон
dockerd; - Compose plugin — команда
docker composeдля запуска многоконтейнерных приложений по файлуdocker-compose.yml; - Buildx plugin — расширенная сборка образов (
docker buildx).
Модуль нужен, если вы деплоите приложения в контейнерах (в том числе через mitdev app/mitdev deploy, когда в проекте есть docker-compose.yml).
Когда включать и когда не нужен
Включайте, если:
- ваши приложения поставляются как Docker-образы или
docker-compose.yml; - вы хотите запускать сторонние сервисы (базы, очереди) в контейнерах, а не ставить их пакетами.
Можно не ставить, если сервер отдаёт только статику/PHP через nginx, а базы вы ставите отдельными модулями (12-postgresql, 13-redis и т.д.).
Зависимости и требования
- Отдельных модулей-зависимостей нет.
- Если задан deploy-пользователь (
02-user), модуль добавит его в группуdocker. - Официальный репозиторий Docker существует только для семейств Debian/Ubuntu и RHEL (Rocky/Alma/CentOS Stream/Fedora). На SUSE и Arch Docker берётся из штатных репозиториев дистрибутива (пакеты
docker,docker-compose).
Что именно делает (по шагам module_install)
- Определяет набор пакетов по семейству ОС:
- Debian/RHEL:
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; - SUSE/Arch:
docker docker-compose.
- Debian/RHEL:
- Если Docker уже установлен — просто обновляет компоненты (лог «Docker уже установлен … — обновляю компоненты»).
- Подключает официальный репозиторий:
- Debian/Ubuntu: импортирует GPG-ключ (
curl … /gpg→/etc/apt/keyrings/docker.asc, праваa+r), создаёт/etc/apt/sources.list.d/docker.listс указанием кодового имени релиза и архитектуры, затем обновляет индекс пакетов. GPG-ключ — это криптографическая подпись, которой пакетный менеджер проверяет подлинность пакетов. - RHEL: скачивает
docker-ce.repoв/etc/yum.repos.d/, обновляет индекс. - SUSE/Arch: ничего не подключает — ставит из базового репозитория.
- Debian/Ubuntu: импортирует GPG-ключ (
- Ставит пакеты Docker и плагины.
- Включает и запускает службу
docker(systemctl enable+restart). - Добавляет deploy-пользователя в группу
docker(usermod -aG docker), если он задан. - Проверяет установку:
docker run --rm hello-world— качает крошечный тестовый образ, запускает его и удаляет контейнер. Успешный вывод «Hello from Docker!» подтверждает, что демон работает и умеет тянуть образы. - Выполняет
module_verifyи печатает версии Docker и Compose.
Файлы, службы и порты
| Путь / юнит | Назначение | Права |
|---|---|---|
dockerd (служба docker) |
демон Docker | root |
/etc/apt/keyrings/docker.asc |
GPG-ключ репозитория (Debian) | a+r (0644) |
/etc/apt/sources.list.d/docker.list |
APT-репозиторий Docker (Debian) | 0644 |
/etc/yum.repos.d/docker-ce.repo |
YUM/DNF-репозиторий Docker (RHEL) | 0644 |
/var/lib/docker |
хранилище образов, контейнеров и томов | root |
/var/lib/containerd |
данные containerd | root |
/etc/docker |
конфигурация демона | root |
группа docker |
членство даёт доступ к сокету демона | — |
Docker сам по себе портов не открывает — их публикуют конкретные контейнеры (-p 8080:80 и т.п.).
Настройка
| Переменная | Значения | По умолчанию | Влияние | Когда менять |
|---|---|---|---|---|
DEPLOY_USER |
имя пользователя | deploy (из DEPLOY_USER_DEFAULT) |
кого добавить в группу docker |
если деплой-аккаунт назван иначе |
PRUNE_DOCKER |
yes / no |
no |
запускать ли docker system prune -f в модуле 99-cleanup |
включите yes, чтобы регулярная очистка удаляла неиспользуемые образы/сети |
У самого модуля 05 отдельных переменных нет — он управляется общими значениями из config/defaults.conf.
Как переопределить настройки
Все три способа рабочие:
- Экспорт перед установкой (флаг
-Eсохраняет переменные для sudo):PRUNE_DOCKER=yes DEPLOY_USER_DEFAULT=web sudo -E ./install.sh - Правка
config/defaults.conf— измените строкуPRUNE_DOCKER="${PRUNE_DOCKER:-no}". - Вопросы установщика — deploy-пользователь выбирается в интерактивном мастере установки.
Проверка, что всё работает
module_verify считает модуль исправным, если: команда docker есть, служба docker активна, работают docker compose version и docker buildx version.
Вручную:
docker --version # Docker version 27.x.x, build ...
docker compose version # Docker Compose version v2.x.x
docker run --rm hello-world # Hello from Docker!
mitdev docker status # версия, статус службы, таблица контейнеров
mitdev doctor # строка «Docker … » в отчёте
Ожидаемо: все команды отрабатывают без ошибок, hello-world печатает приветствие.
Типовые задачи
# Статус движка и список контейнеров
mitdev docker status
# Все контейнеры (в т.ч. остановленные)
mitdev docker ps
# Список образов
mitdev docker images
# Освободить место: удалить неиспользуемые образы, сети, кэш сборки
mitdev docker prune # = docker system prune -f (нужен root)
# Перезапустить демон Docker
mitdev docker restart
# Смотреть логи контейнера в реальном времени
mitdev docker logs <имя-контейнера>
# Запустить приложение из docker-compose.yml
cd ~/apps/myapp && docker compose up -d --build
Частые ошибки
Симптом: permission denied while trying to connect to the Docker daemon socket при запуске docker без sudo от deploy-пользователя.
Причина: членство в группе docker применяется только к новым сессиям — старый вход в систему группу ещё «не видит».
Решение:
# Перелогиньтесь (выйдите из ssh и зайдите снова) — либо в текущей сессии:
newgrp docker
id # убедитесь, что группа docker присутствует
Симптом: docker run hello-world падает с сетевой ошибкой при установке.
Причина: нет доступа в интернет / DNS не резолвит docker.io.
Решение: curl -I https://registry-1.docker.io/v2/ — проверьте связность; при необходимости настройте DNS/прокси.
Симптом: мало места на диске, no space left on device.
Причина: накопились старые образы, остановленные контейнеры и тома в /var/lib/docker.
Решение: mitdev docker prune (или docker system prune -a --volumes — осторожно, удалит и неиспользуемые тома).
Симптом: служба docker не стартует.
Причина: конфликт конфигурации /etc/docker/daemon.json или занятый ресурс.
Решение: journalctl -u docker -n 50 — смотрите причину; проверьте валидность daemon.json.
Безопасность и продакшен
- Членство в группе
dockerэквивалентно root. Пользователь из группыdockerможет смонтировать корень хоста в контейнер и получить полный доступ к системе. Не добавляйте в группуdockerаккаунты, которым нельзя доверять права root. Deploy-пользователь добавляется намеренно — относитесь к нему как к привилегированному. - После добавления в группу нужен перелогин (см. «Частые ошибки»).
- Публикуйте наружу (
-p) только те порты контейнеров, которые действительно должны быть доступны; закрывайте остальное файрволом (09-firewall). - Регулярно обновляйте образы и чистите мусор (
mitdev docker prune,PRUNE_DOCKER=yes).
Откат и удаление
Автоматический откат (module_rollback, срабатывает при сбое установки): останавливает и отключает службу docker, удаляет пакеты Docker и файлы репозитория (docker.list, docker.asc, docker-ce.repo).
Ручное удаление:
# Удалить Docker, СОХРАНИВ образы, контейнеры и тома (/var/lib/docker остаётся)
mitdev remove docker
# Полное удаление ВМЕСТЕ с данными (образы, контейнеры, тома — необратимо!)
mitdev remove docker --purge
Без --purge каталоги /var/lib/docker, /var/lib/containerd, /etc/docker сохраняются — переустановка вернёт все образы и тома. С --purge они удаляются полностью.
См. также
- ../COMMANDS.md — команды
mitdev docker,mitdev remove - ../SECURITY.md — модель прав и риски группы
docker - ../TROUBLESHOOTING.md — диагностика служб
- 09-firewall.md — какие порты контейнеров открывать наружу
- 99-cleanup — очистка — переменная
PRUNE_DOCKER