3 фатальные ошибки с Docker — и как обезопасить себя уже сегодня!

Контейнер с логотипом Docker плывёт по морю.

Только осваиваете Docker и не понимаете, где что происходит? Вот три ошибки, которые я совершал сам в начале — теперь вы сможете избежать их и сэкономить себе кучу времени и нервов.

В таких больших проектах, как Docker, самые ценные советы часто спрятаны в глубине сложной документации. Новичкам легко потеряться в море терминов и не найти понятных подсказок. Мне самому в начале было трудно: работа с несколькими сервисами, куча длинных команд и — самое главное — опасность запуска процессов в контейнерах от root. Если бы я знал об этом с самого начала, избежал бы многих проблем.

Не используете Docker Compose для запуска нескольких сервисов? Рассказываю, почему это зря

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

Docker Compose — это отдельная команда, где вся конфигурация сервисов описывается в YAML-файле (docker-compose.yaml). Вот пример из официальной документации к Gitea (это сервер для работы с Git):

В этом примере используется ночная (экспериментальная) сборка Gitea, которая работала на ноябрь 2025 года, но позже может стать несовместимой с Postgres 14. Поэтому рассматривайте этот YAML только как иллюстрацию.

Вверху Docker создаёт два сервиса с помощью «depends_on» — они связаны между собой. Но такой файл рабочим назвать трудно, в нём не хватает важных настроек. Ниже — более правильный пример.

Что особенно важно в этом Compose-файле:

Постоянный том сохраняет ваши данные вне контейнера, по адресу /var/lib/docker/volumes.

Теперь достаточно перейти в папку, где лежит docker-compose.yaml, и выполнить docker compose up. Docker сам скачает нужные образы и запустит ваши сервисы, которые тут же начнут взаимодействовать между собой. Compose избавляет от утомительных bash-скриптов и невероятно ускоряет запуск сложных приложений.

Запускаете процессы от root в контейнере? Это может угробить всю систему!

Когда я только начал разбираться с Docker, думал: контейнеры всё изолируют, внутри всё полностью безопасно. На деле это далеко не так.

По умолчанию приложения в Docker стартуют с тем же идентификатором пользователя (UID), что и на хосте. Если вы запускаете процесс от root, то он получает UID 0 как внутри, так и снаружи, пусть даже с ограничениями. На практике это гигантская дыра в безопасности: если злоумышленник найдёт уязвимость, то сможет выбраться из контейнера и получить полный доступ к вашей системе.

Даже если сервисы доступны только с localhost — это не гарантирует неприкосновенность. Любая обработка сетевого трафика, чтение файлов или приём запросов — это шанс получить вредоносные данные и стать жертвой взлома. Минимум — относитесь к root-процессам в контейнере так же осторожно, как к процессам от root на хосте, и избегайте лишних рисков.

Лучшее решение — запускать Docker в rootless-режиме. В официальной документации подробно описано, как запустить контейнеры и сам демон Docker не от root, а от ограниченного пользователя — это делается буквально в пару команд.

Если это невозможно, обязательно используйте флаг —user при запуске приложения или директиву USER в Dockerfile. Да, иногда приложение требует доступа к закрытым разделам файловой системы — тогда этот способ не подойдёт.

Я уже давно перешёл на Podman вместо Docker: по умолчанию, контейнеры не запускаются от root, совместимость полная, и есть отличная десктоп-версия Podman Desktop. Очень рекомендую — попробуйте сами.

Не используете графический интерфейс, автодополнение и алиасы? Теряете время в терминале!

Команды Docker зачастую очень длинные, а если вы работаете с ними часто, как и я, постоянная ручная печать сбивает с толку и тратит кучу времени.

Например, команда для Pi-hole из официальной документации выглядит так:

На практике для запуска лучше использовать либо Docker Compose, либо systemd, но длинные команды Docker никуда не денутся.

Упростить их ввод помогут три приёма: графический интерфейс (UI), автодополнение команд в терминале и алиасы.

Лично мне больше всего заходит UI. Многие выбирают Docker Desktop, но я предпочитаю консольный интерфейс — lazydocker. Оба варианта отличные: новичкам советую Docker Desktop, если же вам удобнее работать с клавиатурой — попробуйте lazydocker.

В терминале открыта панель управления Docker: 5 областей с отображением информации по образам, процессам, томам и сетям, а также подробная информация о выбранном объекте.

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

Последний лайфхак — алиасы. Их можно настроить как для Docker на вашей машине, так и для сервисов прямо внутри контейнеров. Внешние алиасы экономят время на стандартных командах, а внутренние помогают удобнее управлять сервисами изнутри.

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

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!

Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в:

Алекс Бежбакин
Оцените автора
Добавить комментарий