Как использовать Docker без sudo?

Как использовать Docker без sudo?

На страницах документации Docker все примеры команд показаны без sudo, например, этот:

docker ps

В Ubuntu бинарник называется docker.io. Он также не работает без sudo:

sudo docker.io ps

Как настроить Docker так, чтобы не нужно было добавлять префикс sudo?

решение1

Хорошие новости: новая версия Docker 19.03 (в настоящее время экспериментальная) сможет работать без рута, устраняя проблемы, которые могут возникнуть при использовании пользователя root. Больше никаких проблем с повышенными правами, root и всем, что может открыть вашу машину, когда вы этого не хотите.

Видео об этом от[DockerCon 2019] Усиление защиты демона Docker с помощью режима Rootless

Несколько предостережений относительно режима Docker без прав root

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

  • Элементы управления ресурсами cgroups, профили безопасности AppArmor, контрольные точки/восстановление, оверлейные сети и т. д. не работают в режиме без прав root.
  • Для открытия портов из контейнеров в настоящее время требуется ручной вспомогательный процесс socat.
  • Только дистрибутивы на базе Ubuntu поддерживают оверлейные файловые системы в режиме rootless.
  • Режим Rootless в настоящее время доступен только для ночных сборок, которые могут быть не столь стабильны, как вы привыкли.

Начиная с Docker 19.3 это устарело (и более опасно, чем следовало бы):

TheРуководство по докерувот что он говорит по этому поводу:

Предоставление не-root-доступа

Демон docker всегда запускается как пользователь root, и начиная с версии Docker 0.5.2, демон docker привязывается к сокету Unix вместо порта TCP. По умолчанию этот сокет Unix принадлежит пользователю root, и поэтому по умолчанию вы можете получить к нему доступ с помощью sudo.

Начиная с версии 0.5.3, если вы (или ваш установщик Docker) создаете группу Unix с именем docker и добавляете в нее пользователей, то демон docker сделает владельца сокета Unix доступным для чтения/записи группой docker при запуске демона. Демон docker всегда должен запускаться от имени пользователя root, но если вы запускаете клиент docker как пользователь в группе docker, то вам не нужно добавлять sudo ко всем командам клиента. Начиная с версии 0.9.0 вы можете указать, что группа, отличная от docker, должна владеть сокетом Unix с помощью параметра -G.

Предупреждение: группа Docker (или группа, указанная с помощью -G) эквивалентна root; см.Подробности поверхности атаки Docker Daemonи этот блогпост наПочему мы не позволяем пользователям без прав root запускать Docker в CentOS, Fedora или RHEL(спасибо michael-n).

В недавнем выпускеэкспериментальный режим без прав root на GitHubИнженеры отмечают, что режим rootless позволяет запускать dockerd как непривилегированный пользователь, используя user_namespaces(7), mount_namespaces(7), network_namespaces(7).

Пользователям необходимо запустить dockerd-rootless.sh вместо dockerd.

$ dockerd-rootless.sh --experimental

Поскольку режим Rootless является экспериментальным, пользователям необходимо всегда запускать dockerd-rootless.sh с параметром –experimental.


Важно прочитать:Действия после установки для Linux(он также ссылается наПодробности поверхности атаки Docker Daemon).

Управляйте Docker как пользователь без прав root

Демон docker привязывается к сокету Unix вместо порта TCP. По умолчанию этот сокет Unix принадлежит пользователю root, и другие пользователи могут получить к нему доступ только с помощью sudo. Демон docker всегда запускается как пользователь root.

Если вы не хотите использовать sudo при использовании команды docker, создайте группу Unix с именем docker и добавьте в нее пользователей. Когда запускается демон docker, он делает владение сокетом Unix доступным для чтения/записи для группы docker.


  • Добавьте dockerгруппу, если она еще не существует:

     sudo groupadd docker
    
  • Добавьте подключенного пользователя "$USER" в dockerгруппу. Измените имя пользователя на имя предпочитаемого вами пользователя, если вы не хотите использовать своего текущего пользователя:

     sudo gpasswd -a $USER docker
    
  • newgrp dockerЧтобы активировать изменения в группах, выполните команду или выйдите из системы и войдите в нее снова.

  • Вы можете использовать

     docker run hello-world
    

    чтобы проверить, можно ли запустить Docker без sudo.

решение2

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

 sudo usermod -aG docker $USER

Теперь пусть пользователь выйдет из системы и снова войдет. Это решение хорошо объясненоздесьпри правильном процессе установки.

решение3

Механизм, с помощью которого добавление пользователя в группу dockerпредоставляет разрешение на запуск docker, заключается в получении доступа к сокету docker в /var/run/docker.sock. Если файловая система, которая содержит, /var/runбыла смонтирована с включенными списками управления доступом (ACL), этого также можно добиться с помощью ACL.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Я включил это только для полноты картины.

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

Предупреждение 1: Это имеет ту же rootэквивалентность, что и добавление $USERв dockerгруппу. Вы по-прежнему можете запустить контейнер таким образом, чтобы иметь rootдоступ к файловой системе хоста.

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

решение4

Контейнеры Docker должны запускаться суперпользователем. Вы можете добавить себя в группу docker(например, запустив sudo usermod -aG docker $USER), но это позволяет любому, у кого есть доступ к учетной $USERзаписи, легко получить root-доступ к машине (например, смонтировав root-том в привилегированном контейнере).

Более безопасным способом запуска контейнеров Docker от имени пользователя, не являющегося пользователем root, было бы использованиеПодман. С его веб-сайта:

Podman — это контейнерный движок без демона для разработки, управления и запуска контейнеров OCI в вашей системе Linux. Контейнеры могут быть запущены как root или врежим без прав root. Проще говоря: alias docker=podman.

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

Связанный контент