Как запустить Docker в режиме без корня

Эта статья была обновлена ​​с тех пор, когда она была первоначально опубликована 5 марта 2022 года.

Хотя можно развернуть контейнеры Docker без корневых привилегий, это не обязательно означает, что они без корней. Это связано с тем, что в стеке есть и другие компоненты (такие как Runc, Containerd и Dockerd), которые требуют запуска корневых привилегий. Это может привести к проблеме безопасности посредством повышенных привилегия.

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

Итак, что вы делаете? Вы всегда можете пойти без корней.

Как работает без корня

По сути, запуск Docker использует преимущества пространств имен пользователей. Эта подсистема обеспечивает как изоляцию привилегий, так и сегрегацию идентификации пользователей между процессами. Эта функция была доступна для ядра Linux со времен версии 3.8 и может использоваться с Docker для составления диапазона идентификаторов пользователей, чтобы пользователь root в внутренних картах пространства имен в неполноценном диапазоне в родительском пространстве имен.

Докер в течение некоторого времени смог воспользоваться функцией пространства имен пользователей. Это делается с использованием опции-Userns-REMAP. Единственная проблема с этим — то, что двигатель времени выполнения все еще работает как root, поэтому он не решает нашу проблему.

Вот где вступит в игру Docker.

Ограничения доступа к порту привилегии

К сожалению, режим без корней не идеален. Первая проблема заключается в том, что Docker без root не будет иметь доступа к привилегированным портам, которые представляют собой любой порт ниже 1024. Это означает, что вам нужно помнить, чтобы выставить ваши контейнеры на порты выше 1024, в противном случае они не будут работать.

Ограничение ресурсов контейнеров

Другая проблема заключается в том, что ограничение ресурсов такими опциями, как –cpus, –memory и –pids-limit, поддерживаются только при работе с CGRUP V2 и SystemD.

Другие ограничения, с которыми вы можете столкнуться, включают:

  • Нет поддержки для Apparmor, Checkpoint, Overlay Network и экспозиции порта SCTP.
  • Поддерживается поддержка водителей с ограниченным хранилищем (поддерживается только Overlay2, Fuse-Overlayfs и VFS-драйверы).
  • Не поддерживает –net-host.

С учетом всего сказанного, как мы устанавливаем Docker так, чтобы его можно было запустить в режиме без root? Это на самом деле довольно просто. Позвольте мне показать вам, как.

Я буду демонстрировать на своем выборе на своем выборе сервера Ubuntu Server 20.04, но вы можете сделать это практически на любом распределении Linux. Единственной разницей будет команда установки для запуска для одной зависимости.

Установка одинокой зависимости

Первое, что мы должны сделать, это установить единственную зависимость для этой настройки. Эта зависимость — UIDMAP, которая обрабатывает отображение пространства имен пользователей для системы. Чтобы установить UIDMAP, войдите в свой сервер и выпустите команду:

sudo apt -get установить uidmap -y

Это все, что есть для зависимостей.

Установка Docker

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

Загрузите и запустите установщик Docker Rootless

Мы можем скачать и установить версию Docker без root с одной командой:

curl -fssl | шнур

Добавить необходимые переменные

Когда эта установка завершится, вам нужно добавить пару переменных среды в .bashrc. Откройте файл с помощью:

Nano ~/.bashrc

В этом файле добавьте следующие строки внизу:

Экспортный путь =/home/jack/bin: $ export docker_host = unix: //run/user/1000/docker.sock 12 export path =/home/jack/bin: $ pathexport docker_host = unix: //run/user/1000/docker.sock = unix: //run/user/1000/docker.sock.

Примечание. Обязательно добавьте свой конкретный идентификатор пользователя. В приведенном выше коде мой идентификатор был 1000. Чтобы найти свой идентификатор пользователя, выпустите команду:

идентификатор

Вы захотите добавить номер после uid = в линии:

Export Docker_host = Unix: //run/user/id/docker.sock 1 Export docker_host = Unix: //run/user/id/docker.sock

Где ИДЕНТИФИКАТОР Ваш идентификатор пользователя.

Сохраните и закройте файл.

Войдите и войдите обратно на сервер (так что изменения вступит в силу), и вы готовы проверить Docker без root.

Тестирование без корней докера

Мы развертываем наш верный контейнер Nginx в качестве теста. Помните, мы не добавили нашего пользователя в группу Docker. Если бы это была стандартная установка Docker, мы не смогли бы успешно развернуть контейнер NGINX, не добавляя нашего пользователя в группу Docker или запустив команду Deploy с привилегиями SUDO.

Тестирование без корней докера с nginx

Чтобы протестировать режим без root (развертывание Nginx в отдельном режиме), выпустите команду:

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

Откройте веб -браузер и укажите его (где сервер является IP -адресом вашего сервера Docker), и вы должны увидеть страницу приветствия Nginx.

Этот контейнер был развернут без использования ROOT, поэтому весь стек без этих повышенных привилегий.

Тестирование режима без корней с контейнером Ubuntu

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

Docker Run —IT Ubuntu Bash

Все это сделано, не касаясь привилегий корней.

Заключение

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

Попробуйте Docker без root и посмотрите, не облегчает ли это ваши головные боли безопасности.

FAQ MODE без корней. Что такое режим Docker без корней?

О: Docker Rootless Mode позволяет запускать контейнеры, не требуя привилегий суперпользователя, используя пространства имен и CGROUPS, предоставляемые ядром Linux.

2. Зачем использовать режим Docker без корней?

Runng Docker в режиме без root предоставляет несколько преимуществ:

Безопасность: Снижает потенциальные риски безопасности, так как никакие процессы не работают с повышенными разрешениями.

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

Гибкость: Позволяет использовать пользователей, не являющихся корнями, и избегает конфликтов с существующими корневыми приложениями.

4. Мне все еще нужен Dockerd?

A: Да, вам все еще нужен Docker Daemon (Dockerd). Вы можете начать это следующим образом:

dockerd-rootless-setuptool.sh установка –non-suid

Эта команда запускает Dockerd в режиме без root.

5. Как мне запустить контейнеры?

A: После настройки режима Docker Rootless вы можете запустить контейнеры, используя стандартную команду Docker, такую ​​как:

Docker Run —IT Ubuntu Bash

6. Могу ли я использовать Docker Compose в режиме без корней?

A: Да, вы можете использовать Docker Compose в режиме без корня. Просто убедитесь, что установлены и Docker, и Docker Compose.

7. А как насчет конфигурации сети?

A: В режиме без root настройка сети отличается от корневого режима. По умолчанию, Dockerd-Rootless-Setuptool.sh Настройка пользовательского сетевого стека с использованием SLIRP4NETNS для сети. Эта настройка может быть настроена путем изменения файлов конфигурации в разделе /HOME/USER/.local/share/docker/rootless (где пользователь является вашим именем пользователя).

8. Могу ли я поделиться объемами Docker с хостом?

A: Да, но вам нужно установить объемы, которые доступны в вашем пространстве имен пользователей. Например, вы можете сделать:

Docker run -v/host/data:/container/data ubuntu bash

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

9. Есть ли у меня доступ к Docker System Clune и другим командам?

A: Не все команды работают непосредственно в режиме без root. Например, вы не можете использовать Docker System Truneпоскольку это требует доступа к ядру хоста, который недоступен для пользователей, не являющихся корнями.

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

Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Джек Уоллен-это то, что происходит, когда генеральный разум с умом с современным Snark. Джек — искатель истины и писатель слов с квантовым механическим карандашом и разрозненным ударом звука и души. Хотя он проживает … читайте больше от Джека Валлена

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *