05-docker — Docker CE + Compose + Buildx

☐ Опциональный. Ставит движок контейнеров Docker CE, плагин Compose и Buildx из официального репозитория Docker и добавляет deploy-пользователя в группу docker.

Зачем нужен

Docker — движок контейнеризации: он запускает приложения в изолированных «контейнерах» вместе со всеми их зависимостями, не засоряя систему. Модуль ставит:

Модуль нужен, если вы деплоите приложения в контейнерах (в том числе через mitdev app/mitdev deploy, когда в проекте есть docker-compose.yml).

Когда включать и когда не нужен

Включайте, если:

Можно не ставить, если сервер отдаёт только статику/PHP через nginx, а базы вы ставите отдельными модулями (12-postgresql, 13-redis и т.д.).

Зависимости и требования

Что именно делает (по шагам module_install)

  1. Определяет набор пакетов по семейству ОС:
    • Debian/RHEL: docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin;
    • SUSE/Arch: docker docker-compose.
  2. Если Docker уже установлен — просто обновляет компоненты (лог «Docker уже установлен … — обновляю компоненты»).
  3. Подключает официальный репозиторий:
    • 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: ничего не подключает — ставит из базового репозитория.
  4. Ставит пакеты Docker и плагины.
  5. Включает и запускает службу docker (systemctl enable + restart).
  6. Добавляет deploy-пользователя в группу docker (usermod -aG docker), если он задан.
  7. Проверяет установку: docker run --rm hello-world — качает крошечный тестовый образ, запускает его и удаляет контейнер. Успешный вывод «Hello from Docker!» подтверждает, что демон работает и умеет тянуть образы.
  8. Выполняет 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.

Как переопределить настройки

Все три способа рабочие:

  1. Экспорт перед установкой (флаг -E сохраняет переменные для sudo):
    PRUNE_DOCKER=yes DEPLOY_USER_DEFAULT=web sudo -E ./install.sh
    
  2. Правка config/defaults.conf — измените строку PRUNE_DOCKER="${PRUNE_DOCKER:-no}".
  3. Вопросы установщика — 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.

Безопасность и продакшен

Откат и удаление

Автоматический откат (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 они удаляются полностью.

См. также