Введение в безопасность контейнеров с Docker

CompTIABeginner
Практиковаться сейчас

Введение

Добро пожаловать в этот практический лабораторный практикум по основам безопасности контейнеров с помощью Docker. Docker — это мощная платформа для разработки, доставки и запуска приложений в контейнерах. Хотя контейнеры обеспечивают изоляцию процессов, их безопасность имеет решающее значение для защиты ваших приложений и хост-системы.

В этом лабораторном практикуме вы изучите основы безопасности контейнеров Docker. Сначала вы проверите правильность настройки Docker в среде LabEx. Затем вы запустите базовый веб-сервер Nginx в контейнере, проверите его запущенные процессы и изучите потребление ресурсов. Наконец, вы узнаете, как применять основные средства контроля безопасности, устанавливая ограничения ресурсов для контейнера.

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

Проверка установки и настройки Docker

На этом шаге вы проверите, что Docker уже установлен в среде LabEx, и убедитесь, что у вас есть соответствующие права для его использования.

Виртуальная машина LabEx поставляется с предустановленным Docker. Давайте сначала проверим версию Docker, чтобы убедиться, что он доступен.

docker --version

Вы должны увидеть вывод, похожий на этот, подтверждающий, что Docker установлен правильно:

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

Теперь проверим, запущен ли демон Docker:

sudo systemctl status docker

Эта команда покажет вам статус службы Docker. Вы должны увидеть, что она активна и запущена.

Чтобы выполнять команды Docker без sudo, ваш пользователь должен входить в группу docker. В среде LabEx ваш пользователь уже настроен с соответствующими правами. Давайте проверим это:

groups $USER

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

labex : labex sudo docker ssl-cert

Поскольку ваш пользователь уже входит в группу docker, вы можете выполнять команды Docker напрямую, не используя sudo.

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

docker info

Эта команда отобразит информацию о Docker в масштабах всей системы, подтверждая, что вы успешно взаимодействуете с демоном Docker.

Запуск базового контейнера веб-сервера

На этом шаге вы запустите свой первый контейнер. Мы будем использовать официальный образ nginx, который предоставляет легковесный и высокопроизводительный веб-сервер.

Для запуска контейнера используется команда docker run. Мы будем использовать несколько распространенных флагов:

  • -d: Запускает контейнер в отсоединенном режиме (в фоновом режиме).
  • -p 8080:80: Сопоставляет порт 8080 на хосте с портом 80 внутри контейнера. Это позволяет получить доступ к серверу Nginx через localhost:8080.
  • --name webserver: Присваивает контейнеру запоминающееся имя.
  • nginx: Имя образа для использования.

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

docker run -d -p 8080:80 --name webserver nginx

Docker сначала проверит, доступен ли образ nginx локально. Если нет, он автоматически загрузит его из Docker Hub, а затем запустит контейнер. Вы можете увидеть, что контейнер запущен, используя команду docker ps.

docker ps

Вывод покажет ваш контейнер webserver, его ID, образ, на котором он основан, и сопоставление портов.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   webserver

Теперь давайте проверим, работает ли веб-сервер. Используйте curl для отправки запроса к серверу на сопоставленном порту.

curl localhost:8080

В качестве вывода вы должны увидеть HTML-код стандартной приветственной страницы Nginx, что подтверждает, что ваш контейнер запущен и доступен.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. For further configuration, refer to the
      <a href="http://nginx.org/">nginx.org</a> documentation.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Анализ процессов и использования ресурсов контейнера

На этом шаге вы научитесь проверять процессы, запущенные внутри контейнера, и отслеживать его потребление ресурсов. Это фундаментальный навык для отладки и понимания поведения вашего контейнеризированного приложения.

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

Выполните следующую команду, чтобы увидеть процессы внутри вашего контейнера webserver:

docker top webserver

Вывод показывает мастер-процесс Nginx, запущенный от имени root, и его рабочие процессы, запущенные от имени systemd+ (системный пользователь для повышения безопасности). Обратите внимание, что существует несколько рабочих процессов, что типично для Nginx для эффективной обработки одновременных запросов.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4098                4078                0                   14:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4161                4098                0                   14:34               ?                   00:00:00            nginx: worker process
systemd+            4162                4098                0                   14:34               ?                   00:00:00            nginx: worker process

Далее давайте посмотрим на использование ресурсов контейнера. Команда docker stats предоставляет поток данных о ЦП, памяти, сети и вводе-выводе диска контейнера в реальном времени. Чтобы получить статичный снимок для этой лабораторной работы, мы будем использовать флаг --no-stream.

docker stats --no-stream webserver

Эта команда отобразит таблицу с текущими метриками ресурсов для контейнера webserver.

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
bda2386621a1   webserver   0.00%     3.125MiB / 3.505GiB   0.09%     6.31kB / 1.27kB   0B / 12.3kB   3

Из этого вывода вы можете увидеть, что контейнер использует очень мало ЦП (0,00%), около 3,1 МиБ памяти из доступных 3,5 ГиБ системной памяти (0,09%) и имеет 3 запущенных процесса (мастер-процесс Nginx и 2 рабочих процесса). Эта информация жизненно важна для выявления узких мест в производительности или потенциальных утечек ресурсов в ваших приложениях.

Проверка свойств безопасности контейнера, таких как ограничения ресурсов

На этом шаге вы изучите одну из самых базовых, но критически важных функций безопасности контейнеров: ограничения ресурсов. По умолчанию контейнер может использовать столько ресурсов ЦП и памяти хоста, сколько ему нужно. Установка ограничений предотвращает потребление всех доступных ресурсов одним контейнером и влияние на другие контейнеры или сам хост.

Сначала давайте проверим конфигурацию контейнера webserver, который мы создали ранее. Команда docker inspect предоставляет подробный вывод в формате JSON со всеми настройками контейнера.

docker inspect webserver

Вывод очень длинный. Вы можете использовать флаг --format, чтобы извлечь определенные поля. Давайте проверим, установлено ли какое-либо ограничение памяти.

docker inspect --format='{{.HostConfig.Memory}}' webserver

Вывод будет 0, что означает отсутствие ограничения памяти.

0

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

docker stop webserver
docker rm webserver

Далее запустите новый контейнер Nginx, но на этот раз добавьте флаг --memory="100m", чтобы ограничить использование памяти до 100 мегабайт. Мы также дадим ему новое имя.

docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx

Теперь проверьте ограничение памяти этого нового контейнера.

docker inspect --format='{{.HostConfig.Memory}}' webserver-limited

На этот раз вывод будет представлять собой ограничение памяти в байтах (100 × 1024 × 1024).

104857600

Вы успешно применили ограничение ресурсов к контейнеру, что является основополагающим шагом в обеспечении безопасности контейнеров и управлении ресурсами.

Резюме

В этой лабораторной работе вы получили практический опыт работы с фундаментальными аспектами Docker и безопасности контейнеров.

Вы успешно:

  • Проверили установку Docker и настроили соответствующие права доступа в среде LabEx.
  • Запустили базовый веб-сервер Nginx в виде Docker-контейнера.
  • Сопоставили порты для доступа к контейнеризированному приложению с хоста.
  • Проверили процессы, запущенные внутри контейнера, с помощью команды docker top.
  • Отслеживали использование ресурсов в реальном времени с помощью команды docker stats.
  • Узнали, как устанавливать ограничения ресурсов, такие как память, для контейнера, чтобы повысить стабильность и безопасность системы.

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