June 13

Продвинутые подходы к использованию Docker: безопасность, масштабирование и отказоустойчивость

На продвинутом уровне Docker — это уже не просто запуск приложений, а обеспечение безопасности, мониторинг, оптимизация сборки и работа с оркестрацией через Docker Swarm.
В этой статье мы детально разберём тест продвинутого уровня. Вместе мы рассмотрим сложные сценарии: как выявлять проблемы, настраивать безопасность, повышать производительность. Всё будет объяснено на практических примерах, доступным языком — даже если вы не DevOps-инженер, вы всё поймёте.
Навыки этого уровня особенно важны для тех, кто работает с продакшн-средой, отвечает за стабильность и безопасность, взаимодействует с CI/CD или поддерживает микросервисную архитектуру.

Вопрос 1

Вы заметили, что docker build выполняется медленно, и одни и те же инструкции повторно выполняются, даже если они не менялись. Как решить эту проблему?

Обоснование:

Docker кэширует результат выполнения каждой инструкции (RUN, COPY, ADD и др.), если:

1.     базовый слой не изменился,

2.     сама инструкция не изменилась.

Если кэш не используется (например, из-за изменения слоёв выше), инструкции выполняются повторно.

Решение: убедиться, что Docker может использовать кэш:

1.     не менять порядок инструкций;

2.     избегать перемещений COPY перед RUN;

3.     не использовать --no-cache.

Почему не другие:

  • --no-cache наоборот отключает кеш, что ухудшает ситуацию.
  • Удаление инструкций или смена оборудования не решают проблему повторного выполнения неизменных слоёв.
  • Уменьшение базового образа не влияет на кэш поведения.

Выбранный ответ: Использование кеширования слоев Docker — все неизмененные инструкции будут пропускаться, что значительно сократит время сборки

Вопрос 2

У вас есть следующий Dockerfile для развертывания веб-приложения:

Dockerfile

FROM python: 3.9

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY .

CMD ["python", "app.py"]

Почему замена базового образа на python:3.9-slim и добавление --no-cache не помогли уменьшить размер и ускорить сборку?

Обоснование:

  • Замена базового образа (python:3.9 → python:3.9-slim) действительно немного уменьшает начальный размер, но не решает проблему временных файлов и промежуточных слоев.
  • Флаг --no-cache отключает кэш, из-за чего все команды (RUN, COPY) выполняются заново, даже если они не изменялись. Это замедляет сборку.
  • Чтобы реально сократить размер и ускорить процесс, нужен multi-stage build:

1.     В одном этапе вы собираете всё с временными файлами.

2.     Во втором — копируете только нужное (например, app.py, site-packages) в минимальный образ.

Остальные варианты:

  • --no-cache наоборот отключает кэш → замедляет.
  • Удаление временных файлов важно, но это частный случай.
  • COPY в один слой — не влияет.
  • Slim уменьшает базовый размер, но не решает всей проблемы.

Выбранный ответ: Размер образа уменьшается только при использовании multi-stage builds, что позволяет сохранить только необходимые файлы для финального образа

Вопрос 3

Вы разрабатываете приложение, состоящее из трех сервисов: frontend, backend и database. В Docker Compose файле для каждого сервиса назначена своя собственная сеть, а не общая. После запуска через Docker Compose frontend не может подключиться к backend, и в логах frontend появляются ошибки соединения.

Почему это происходит?

Варианты ответа:

1.     Отсутствие секции depends_on приводит к случайному порядку запуска контейнеров, что блокирует их сетевое взаимодействие

2.     Отсутствие healthcheck приводит к попытке подключения frontend к backend до полной готовности последних

3.     Сервисы запущены в отдельных сетевых пространствах, что препятствует их взаимодействию друг с другом

4.     Отсутствие настройки volumes вызывает потерю данных, но не влияет на сетевое взаимодействие между контейнерами

5.     Bridge-сеть в Docker Compose не поддерживает DNS-резолвинг, что делает невозможным взаимодействие сервисов

Объяснение:

  • По умолчанию Docker Compose создает одну общую сеть, и все сервисы могут обращаться друг к другу по имени сервиса (через встроенный DNS).
  • Если каждому сервису назначена отдельная пользовательская сеть, они изолированы и не видят друг друга по имени.
  • Это вызывает ошибку соединения: frontend не может найти backend.

Почему другие ответы неверны:

  • depends_on — влияет только на порядок запуска, не влияет на сетевое соединение.
  • healthcheck — может быть полезен, но не блокирует сетевое соединение.
  • volumes — это про данные, а не про сеть.
  • bridge-сеть поддерживает DNS-резолвинг, если сервисы в одной bridge-сети.

Выбранный ответ:
Сервисы запущены в отдельных сетевых пространствах, что препятствует их взаимодействию друг с другом

Вопрос 4

Вы разрабатываете приложение, состоящее из трех контейнеров: frontend, backend и database. Все контейнеры должны взаимодействовать через одну сеть, но при этом база данных должна быть недоступна для внешнего подключения. После настройки сети вы заметили, что frontend не может подключиться к backend, хотя они находятся в одной сети. Какое действие привело к этому?

Варианты ответа:

1.     Использование типа сети none для database

2.     Замена bridge-сети на overlay-сеть

3.     Добавление параметра --net=host для всех контейнеров

4.     Настройка пользовательской сети bridge со всеми контейнерами

5.     Указание дополнительных параметров для ограничения доступа в firewall

Объяснение:

  • Параметр --net=host отключает стандартную Docker-сеть и подключает контейнер к сетевому пространству хоста, в результате чего:

1.     Контейнер не участвует в bridge/overlay-сетях.

2.     Встроенный DNS-резолвинг Docker Compose не работает, сервисы не могут обратиться друг к другу по имени.

  • Даже если остальные контейнеры находятся в одной пользовательской bridge-сети, контейнер с --net=host будет вне этой сети, изолирован.

Почему другие ответы неверны:

  • Использование сети none для database — изолирует только базу данных, а проблема здесь с backend.
  • overlay-сеть — предназначена для кластеров (например, Docker Swarm), но поддерживает связи между контейнерами.
  • bridge-сеть со всеми контейнерами — наоборот, правильное решение.
  • firewall — не влияет на внутренние docker-сети, если явно не настроен блокировать loopback.

Выбранный ответ:
Добавление параметра --net=host для всех контейнеров

Вопрос 5

На продакшн-сервере контейнер web-analytics начал демонстрировать нестабильную работу, в недавнее время обновления контейнера не производилось: увеличились задержки в ответах приложения, CPU загружено на 100%. Логи не содержат ошибок, но работа сервиса ощутимо замедлена.

При этом:

·        Контейнер нельзя остановить для диагностики.

·        Интерактивный доступ внутрь контейнера запрещен по политике безопасности.

Какова наиболее вероятная причина проблем и правильный подход к диагностике?

Варианты ответа:

1.     Операционная система хоста стала источником проблемы сильного роста задержек, необходимо немедленно перезагрузить сервер и перезапустить все контейнеры заново

2.     Рост задержек происходит из-за того, что контейнер исчерпал лимиты открытых файловых дескрипторов, необходимо увеличить параметр ulimit через перезапуск контейнера

3.     Высокая нагрузка вызвана "зависшими" процессами внутри контейнера, их надо выявить помощью анализа активных процессов через docker top и мониторинга ресурсов через docker stats

4.     Увеличение задержек в ответах связаны с неправильной настройкой сети контейнера, требуется переподключение к виртуальной сети через docker network connect

5.     Плохо написанный код вызывает высокую нагрузку на CPU, для ликвидации проблемы требуется переписать код

Обоснование (в стиле понятного объяснения для читателя):

Когда контейнер перегружает CPU до 100%, а логи не показывают ошибок, наиболее вероятная причина — один или несколько процессов внутри контейнера вышли из-под контроля. Такие процессы могут "зависнуть" в бесконечном цикле, утекать по памяти или просто слишком часто обращаться к ресурсам.

  • Контейнер нельзя останавливать, и вход внутрь запрещён — это исключает действия вроде docker exec или docker stop.
  • Однако docker top позволяет увидеть список активных процессов в контейнере снаружи, а docker stats покажет текущие ресурсы: сколько CPU и памяти потребляет контейнер.
  • Эти команды не требуют входа в сам контейнер и помогут понять, какой процесс перегружает систему, что критично для продакшн-диагностики.

Почему другие варианты не подходят:

  • Перезагрузка хоста — это крайняя мера, особенно если другие контейнеры работают нормально.
  • ulimit и лимиты дескрипторов — вероятная, но менее подходящая причина: если бы были ошибки из-за ulimit, это было бы видно в логах.
  • Сетевые задержки — они не объясняют 100% загрузку CPU.
  • Плохой код — возможно, но сначала нужно подтвердить это анализом процессов, а не гадать и сразу переписывать.

Выбранный ответ: Высокая нагрузка вызвана "зависшими" процессами внутри контейнера, их надо выявить с помощью анализа активных процессов через docker top и мониторинга ресурсов через docker stats

Вопрос 6

На вашем сервере обнаружены контейнеры, которые:

  • Имеют доступ ко всем устройствам хоста.
  • Могут выполнять любые системные вызовы.
  • Работают в одной сети с другими контейнерами без ограничений.

Это повышает риски безопасности контейнерной платформы. При этом сами контейнеры работают стабильно и без сбоев.
Какова главная причина уязвимости в изоляции этих контейнеров?

1.     Контейнеры используют bridge-сеть с закрытыми портами, но доступ к устройствам хоста остался открыт

2.     Контейнеры запущены с настройкой seccomp-профиля, что позволяет получить доступ ко всем хостовым устройствам

3.     Контейнеры развернуты в режиме read-only, что снижает уровень угроз со стороны приложений

4.     Контейнеры были ограничены по CPU и памяти, но оставлены без настройки capabilities

5.     Контейнеры используют приватные пространства имен, но неправильно настроены ограничения cgroups на ресурсы

Контейнеры, работающие с:

  • полным доступом к устройствам хоста,
  • возможностью выполнения любых системных вызовов,
  • без сетевой изоляции — представляют высокий риск для всей контейнерной инфраструктуры.

Наиболее вероятная причина — ослабленные или отключённые меры безопасности, в частности:

  • seccomp-профиль — механизм, который ограничивает список допустимых системных вызовов. Его отсутствие или неправильно настроенный профиль позволяет контейнеру выполнять любые вызовы ядру, в том числе доступ к /dev, mount, ptrace, и др.
  • Это делает возможным эскалацию привилегий, вмешательство в другие контейнеры или хост, если container работает, например, с флагом --privileged.

Почему другие ответы неверны:

  • Bridge-сеть влияет на сетевую изоляцию, но не даёт доступа к системным вызовам и устройствам хоста.
  • Read-only режим — снижает риск изменения файлов, но не предотвращает доступ к хостовым ресурсам.
  • Ограничения по CPU и capabilities — защищают ресурсы, но не устраняют риск выполнения вредоносных системных вызовов.
  • Cgroups и namespace — изоляция на уровне ресурсов и пространств имён, но не регулируют именно системные вызовы, которые фильтрует seccomp.

Открытость всех системных вызовов — критическая уязвимость, и в Docker она регулируется через seccomp-профили. Их отсутствие — главный источник риска в данной ситуации.

Выбранный ответ: Контейнеры запущены с настройкой seccomp-профиля, что позволяет получить доступ ко всем хостовым устройствам

Вопрос 7

В вашей системе используются общие тома Docker для хранения данных базы данных и логов. Недавно вы столкнулись с проблемами:

1.     Несколько томов были повреждены после неожиданного завершения работы контейнеров.

2.     Данные базы данных оказались частично утерянными, а логи не обновлялись.

3.     Резервное копирование настроено, но занимает слишком много времени.

Что вызвало эти проблемы?

1.     Отсутствие настроек автоматического создания снапшотов томов

2.     Неоптимальная конфигурация политики резервного копирования

3.     Использование томов без проверки доступности при запуске контейнеров

4.     Использование локальных томов без отказоустойчивого хранилища

5.     Отсутствие регулярного тестирования восстановления из резервных копий

Симптомы указывают на:

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

2.     Невозможность восстановления логов — возможно, данные были в памяти (без flush на диск) или файловая система тома не обеспечивала целостность.

3.     Резервное копирование слишком медленное — вероятно, используется механизм, не предназначенный для обработки сбоев в реальном времени (например, копирование всей файловой системы вместо инкрементального подхода).

Это характерные признаки использования локального хранилища (local volumes) без дополнительных мер:

  • Нет репликации или отказоустойчивости, как это обеспечивают внешние системы хранения (например, NFS, Ceph, EBS).
  • В случае падения контейнера или хоста данные могут быть утеряны, особенно если буферы ОС не были сброшены (flush).

Почему другие ответы не подходят:

  • Автоматическое создание снапшотов — полезно, но не решает проблему потери данных при сбоях, если том сам по себе ненадёжен.
  • Неоптимальная политика резервного копирования — влияет на производительность, но не объясняет потерю данных после сбоя.
  • Проверка доступности томов при запуске — важна, но не связана с потерей данных.
  • Отсутствие тестирования восстановления — связано с надёжностью восстановления, но не объясняет исходную потерю.

Вывод:

Проблема — не в механике копирования, а в уязвимости самой архитектуры хранения. Для критичных данных, особенно БД и логов, требуется устойчивое к сбоям хранилище, а не только бэкапы.

Выбранный ответ: Использование локальных томов без отказоустойчивого хранилища

Вопрос 8

Ваше приложение сталкивается с периодическим снижением производительности после запуска контейнеров.
В логи не поступают критические ошибки, но сервисы работают нестабильно, что вызывает задержки в обработке запросов. Контейнеры запускаются без явных сбоев, однако приложение начинает реагировать медленно, особенно при пиковых нагрузках. Внешние сервисы, с которыми приложение взаимодействует, работают корректно, что исключает проблемы на уровне интеграции, но производительность все равно оставляет желать лучшего.

Используя инструменты мониторинга и логирования, какие проблемы вы могли бы выявить?

1.     Неоптимальная настройка контейнеров, включая неправильно выставленные лимиты на ресурсы и очередь задач

2.     Ошибки в Dockerfile, такие как неэффективные команды сборки, что может замедлять запуск контейнеров

3.     Неполадки с ресурсами хоста, такие как недостаток CPU или памяти, которые ограничивают работу контейнеров

4.     Низкая производительность хранилища данных, если контейнеры сильно зависят от внешних томов или базы данных

5.     Неправильная конфигурация сетевого взаимодействия между контейнерами, из-за чего возникают задержки

Выраженная картина:

  • Нет ошибок в логах, но производительность проседает при нагрузке.
  • Контейнеры запускаются стабильно, но начинают "тормозить" под нагрузкой.
  • Интеграции работают нормально, то есть проблемы внутри самого контейнера.

Такая ситуация наиболее вероятна при следующих настройках:

Не указаны или заданы слишком жесткие ограничения по CPU и памяти (--cpus, --memory, --memory-swap).

Очереди задач внутри приложений переполняются, если ресурсы не позволяют их обрабатывать с нужной скоростью.

Docker по умолчанию не ограничивает использование ресурсов, но если лимиты установлены неправильно, это может привести к:

1.     сильным просадкам производительности

2.     неэффективному использованию планировщика задач ОС

3.     проблемам с задержками даже при отсутствии ошибок.

Почему другие ответы менее уместны:

  • Ошибки в Dockerfile — могут замедлить старт, но не влияют на производительность после запуска.
  • Неполадки с ресурсами хоста — были бы заметны по другим контейнерам, а здесь проблема только у приложения.
  • Хранилище данных — здесь речь не о логах или БД, а о задержках на пиковых нагрузках, а не постоянных I/O-проблемах.
  • Сетевые конфигурации — интеграции работают нормально, проблема не в сетях.

Вывод:

Если приложение не падает, интеграции работают, но оно тормозит при росте нагрузки — в первую очередь стоит проверить лимиты CPU, memory и внутренние очереди, чтобы Docker не «душил» контейнер искусственно.

Выбранный ответ: Неоптимальная настройка контейнеров, включая неправильно выставленные лимиты на ресурсы и очередь задач

Вопрос 9

Ваша команда внедрила Docker в существующий CI/CD пайплайн.
Какие преимущества по сравнению с подходом без контейнеризации предоставляет Docker на разных этапах этого пайплайна?

1.     Автоматически разделяет пайплайны на этапы без необходимости использования дополнительных инструментов

2.     Используется только для развертывания приложений, остальные этапы выполняются без него

3.     Используется для хранения конфигурации пайплайна, а не для выполнения приложений

4.     Исключает необходимость тестирования приложений, так как они запускаются в контейнерах

5.     Позволяет создавать контейнеризированные среды, которые могут быть использованы на каждом этапе пайплайна

Внедрение Docker в CI/CD-пайплайн даёт ключевое преимущество — изоляцию и воспроизводимость среды. Благодаря этому:

  • Каждый этап пайплайна (сборка, тестирование, деплой) может выполняться в контейнере с предсказуемой средой.
  • Это исключает "работает у меня, не работает у тебя", потому что окружение всегда одно и то же.
  • Docker-контейнеры можно повторно использовать, ускоряя сборки и автоматизируя инфраструктуру.

Почему другие ответы неверны:

  • Автоматически разделяет пайплайны на этапы — это задача CI-инструментов, а не Docker.
  • Используется только для развертывания — Docker применим на всех этапах (build, test, deploy).
  • Используется для хранения конфигурации — Docker описывает среду, но не заменяет конфигурационные файлы пайплайна (например, .gitlab-ci.yml, Jenkinsfile).
  • Исключает необходимость тестирования — напротив, Docker облегчает и стандартизирует тестирование, но не отменяет его.

Docker позволяет воспроизводимо запускать каждый этап пайплайна в одинаковом, заранее описанном окружении, что критически важно для стабильности CI/CD.

Выбранный ответ: Позволяет создавать контейнеризированные среды, которые могут быть использованы на каждом этапе пайплайна

Вопрос 10

Выберите вариант ответа, в котором перечислены только корректные методы повышения безопасности контейнеров Docker

1.     Использование минимальных базовых образов, запуск контейнеров в read-only режиме, регулярное обновление зависимостей, актуальных версий

2.     Ограничение прав пользователя внутри контейнера, использование многостадийной сборки, сохранение временных файлов в слоях образа

3.     Настройка контейнеров с доступом к /var/run/docker.sock, автоматический запуск с правами root, хранение секретов в переменных окружения

4.     Включение привилегированного режима, игнорирование обновлений образов, отключение изоляции сети

5.     Установка пакетов через apt-get без очистки кэша, настройка сетевого доступа между контейнерами, монтирование системных директорий хоста

Это корректные и рекомендуемые меры повышения безопасности Docker-контейнеров:

1.     Минимальные базовые образы — уменьшают площадь атаки (меньше ПО — меньше уязвимостей).

2.     Read-only режим — защищает контейнер от записи в файловую систему (например, при взломе).

3.     Обновление зависимостей — защищает от известных уязвимостей, устраняет критические CVE.

Остальные варианты неверные:

  • Ограничение прав + многослойность — частично верно, но сохранение временных файлов в слоях образаплохая практика, увеличивает размер и потенциальную уязвимость.
  • Доступ к /var/run/docker.sock + root-доступгрубая ошибка безопасности. Контейнер может получить полный контроль над хостом.
  • Привилегированный режим + отключение изоляции сетипрямое нарушение изоляции и безопасности.
  • Установка через apt-get без clean + монтирование системных директорийсоздаёт уязвимости и увеличивает размер образа, нарушая принцип наименьших привилегий.

Вывод:

Первый вариант — единственный полностью безопасный и соответствующий best practices DevSecOps и рекомендациям Docker.

Выбранный ответ: Использование минимальных базовых образов, запуск контейнеров в read-only режиме, регулярное обновление зависимостей, актуальных версий

Вопрос 11

На сервере с 10 развернутыми Docker-контейнерами вы замечаете резкое увеличение входящего трафика на нестандартные порты и одновременно несколько контейнеров начинают потреблять в 3 раза больше CPU и памяти.
Что могло привести к этой ситуации, и какие могут возникнуть дополнительные сложности, если ее не устранить?

1.     Неправильная настройка сетевых политик Docker позволила злоумышленникам отправлять подозрительный трафик через нестандартные порты. Это может привести к использованию контейнеров для выполнения DDoS-атак

2.     Отсутствие ограничений на доступ к системным ресурсам контейнеров могло вызвать резкий рост нагрузки. Это приведет к снижению производительности других приложений на сервере

3.     Использование скомпрометированных образов Docker могло привести к запуску вредоносного кода. Это может привести к утечке данных или использованию контейнеров для майнинга

4.     Игнорирование обновлений Docker Engine и связанных библиотек могло оставить сервер уязвимым. Если это не исправить, сервер может быть взломан через известные уязвимости

5.     Неправильное распределение прав доступа к контейнерам позволило неавторизованным пользователям вносить изменения. Это может привести к полной потере контроля над системой, если уязвимость не будет устранена

Симптомы:

  • резкий рост входящего трафика на нестандартные порты;
  • существенное увеличение потребления CPU и памяти несколькими контейнерами.

Эти признаки указывают на возможное заражение или компрометацию контейнеров, и классическим примером такой активности является скрытый майнинг криптовалют или использование контейнера как прокси/ботнет-участника в DDoS-сетях.

Почему другие ответы менее уместны:

1.     Неправильная настройка сетевых политик — объясняет трафик, но не рост нагрузки (CPU/память).

2.     Отсутствие ограничений на ресурсы — увеличит нагрузку, но не объясняет странный сетевой трафик.

3.     Игнорирование обновлений Docker Engine — потенциальная угроза, но не объясняет актуальное поведение и нагрузку.

4.     Неправильное распределение прав доступа — критично, но проявляется иначе (обычно — сбоем доступа, а не CPU и трафиком).

Скомпрометированные образы — наиболее вероятная причина. Они часто используются злоумышленниками для скрытого запуска вредоносных процессов. Контейнеры могут быть скачаны из публичного реестра без верификации (например, с Docker Hub) и содержать вредоносный код.

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

Вопрос 12

Как Docker тома помогают ускорить работу приложения в контейнере, если оно активно использует файловую систему?

1.     Позволяют обходить слоистую файловую систему контейнера, обеспечивая быстрый доступ к данным

2.     Автоматически кэшируют файлы внутри контейнера, сокращая время доступа к необходимым данным

3.     Размещают данные на нескольких дисках хоста, сильно увеличивая скорость доступа к ним

4.     Используют оперативную память контейнера для хранения данных, минимизируя задержки

5.     Шифруют выбранные файлы, что сильно снижает накладные расходы при операциях чтения и записи

Объяснение:

Docker использует слоистую файловую систему (Union FS), в которой каждый слой представляет собой набор изменений. При каждом изменении внутри контейнера создаются новые копии файлов в верхнем слое. Это замедляет работу приложений, интенсивно работающих с файловой системой.

Docker volumes (тома) позволяют обойти эту систему, предоставляя прямой доступ к файловой системе хоста без участия Union FS. Это означает:

  • нет накладных расходов на монтирование слоев;
  • производительность близка к "нативной" работе с файловой системой хоста;
  • особенно полезно для баз данных и систем логирования.

Почему другие варианты неверны:

  • «Автоматически кэшируют файлы» — тома не кэшируют, а предоставляют постоянное хранилище.
  • «Размещают данные на нескольких дисках» — это задача систем хранения, не самого Docker.
  • «Используют оперативную память» — Docker volume работает с диском, не RAM.
  • «Шифруют файлы» — Docker не шифрует данные по умолчанию, это не связано с ускорением.

Тома Docker ускоряют работу за счёт исключения посредников (слоёв образа) и предоставления прямого доступа к файловой системе хоста.

Выбранный ответ: Позволяют обходить слоистую файловую систему контейнера, обеспечивая быстрый доступ к данным

Вопрос 13

Вы развернули приложение на Docker, которое выполняет обработку большого количества сетевых запросов.
Однако вы замечаете увеличенные задержки в сетевых операциях. Логи показывают, что стандартная сеть Docker имеет высокую задержку при обработке запросов.
Это снижает производительность приложения, особенно при высокой нагрузке.
Какой способ поможет поднять производительность и снизить задержки?

1.     Использовать пользовательскую сеть overlay для оптимизации сетевого взаимодействия

2.     Добавить лимиты на количество подключений для каждого контейнера

3.     Ограничить доступ контейнеров к внешним API

4.     Произвести замену текущей сети на bridge-сеть Docker

5.     Настроить репликацию контейнеров для обработки сетевых запросов

По умолчанию контейнеры, развернутые без указания пользовательской сети, подключаются к default bridge-сети, которая:

  • имеет низкую производительность,
  • не поддерживает DNS-резолвинг между контейнерами,
  • добавляет дополнительную задержку при маршрутизации пакетов.

Пользовательская bridge-сеть (созданная с помощью docker network create) оптимизирована для взаимодействия между контейнерами и:

  • обеспечивает меньшие сетевые задержки,
  • поддерживает имена контейнеров как DNS,
  • улучшает производительность в условиях высокой нагрузки.

Почему другие варианты не подходят:

  • Overlay-сеть полезна в кластерах (Swarm, Kubernetes), но добавляет оверхед, особенно на одном хосте.
  • Лимиты на количество подключений ограничивают соединения, но не устраняют сетевые задержки.
  • Ограничение доступа к внешнему API – это про безопасность, не производительность.
  • Репликация контейнеров — масштабирует нагрузку, но не уменьшает задержку сети.

Замена стандартной сети на пользовательскую bridge-сеть — лучший способ повысить производительность и уменьшить сетевые задержки в контейнерах, обрабатывающих много сетевых запросов.

Выбранный ответ: Произвести замену текущей сети на bridge-сеть Docker

Вопрос 14

Как в Docker Compose правильно подключить секрет к сервису?

1.     Через добавление опции –secret в команду запуска

2.     Через подключение файла env_file

3.     Через секцию secrets на уровне сервиса и корня, указывая файл-источник

4.     Через передачу переменной в разделе environment

5.     С помощью тома в разделе volumes

В Docker Compose (при использовании Docker Swarm или Compose v3+), секреты подключаются с помощью специальной секции secrets. Это самый безопасный и официальный способ работы с конфиденциальными данными (например, пароли, ключи).

Примерконфигурации:

version: '3.7'

secrets:

my_secret:

file: ./my_secret.txt

services:

web:

image: nginx

secrets:

- my_secret

Такой подход:

  • хранит секрет не в переменных среды (что небезопасно),
  • монтирует секрет в контейнер как файл только для чтения,
  • защищён от случайной утечки в логах или через docker inspect.

Почему другие варианты неверны:

  • --secret — CLI-флаг, работает в Swarm CLI, но не применим в Compose-файле.
  • env_file и environment — небезопасно: значения могут быть видны через docker inspect.
  • volumes — не предназначены для безопасного хранения секретов, нет контроля доступа.

Секция secrets — правильный, безопасный и рекомендуемый способ подключения секретов в Docker Compose.

Выбранный ответ: Через секцию secrets на уровне сервиса и корня, указывая файл-источник

Вопрос 15

Вы настраиваете Docker Swarm для приложения, которое использует несколько секретов, таких как ключи API и пароли. После развертывания несколько сервисов не могут получить доступ к своим секретам, а логи указывают на отсутствие необходимых данных. Сервисы продолжают работать нестабильно, что приводит к сбоям в приложении и возможным нарушениям безопасности. Как правильно настроить доступ к секретам, чтобы устранить затруднение?

1.     Добавить секреты в сам файл Docker Compose

2.     Настроить автоматическую синхронизацию секретов через общий реестр

3.     Использовать общий том для передачи секретов между контейнерами

4.     Сохранить секреты в переменных окружения для каждого сервиса

5.     Привязать секреты к конкретным сервисам, которые их используют

Объяснение:

В Docker Swarm, секреты не передаются автоматически всем сервисам.
Их нужно явно привязывать к тем сервисам, которые их используют. Иначе:

  • контейнер не получит доступ к секрету;
  • приложение будет работать нестабильно;
  • в логах будут ошибки вида "No such file or directory" при попытке доступа к секрету.

Пример корректной привязки в docker-compose.yml:

secrets:

api_key:

file: ./api_key.txt

services:

app:

image: myapp:latest

secrets:

- api_key

Почему другие варианты неверны:

  • Добавить секреты в файл Docker Compose — не достаточно, если их не привязать к сервису.
  • Синхронизация через общий реестр — Docker Swarm не поддерживает подобную "магическую" синхронизацию.
  • Общий том для передачи секретов — нарушает безопасность, может привести к утечке.
  • Переменные окружения — небезопасны, их можно увидеть через docker inspect.

Чтобы сервисы в Docker Swarm могли безопасно и корректно работать с секретами, секреты нужно явно указывать в секции secrets конкретного сервиса.

Выбранный ответ: Привязать секреты к конкретным сервисам, которые их используют

Заключение:

Изучив материал, вы поймёте, как Docker работает в боевых условиях. Вы научитесь диагностировать проблемы, улучшать сборку, избегать уязвимостей и управлять доступом.
Эти знания делают вас не просто технарём, а специалистом, способным брать ответственность за инфраструктуру. Это следующий шаг к позициям middle или senior уровня, к переходу в DevOps и к роли технического эксперта.