Как я могу использовать докер без sudo?


768

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

docker ps

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

sudo docker.io ps

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


1
Не забудьте включить ufw;)
Rinzwind

2
В Ubuntu 14.04 также есть бинарный файл 'docker'.
Анатолий Течтоник

@anatolytechtonik Я также использовал 'docker' вместо 'docker.io' в Ubuntu 14.04 LTS
Набин

2
Рекомендуемая установка не является докером в репозиториях Ubuntu по умолчанию; вместо этого, инструкции здесь ( docs.docker.com/engine/installation/linux/ubuntulinux ), рекомендую использовать докер репо. Удалите все существующие элементы докера и убедитесь, что вы получаете их из правильного источника: apt-cache policy docker-engine(apt url должен быть из dockerproject.org)
Майкл

2
Как насчет псевдонима? Таким образом, вы все еще используете sudo с защитой паролем. alias docker = "sudo docker"
Андрей Паньков

Ответы:


1137

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

Видео об этом из [DockerCon 2019] демона Hardening Docker в режиме Rootless

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

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

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

Начиная с докера 19.3 это устарело (и опаснее, чем нужно):

В руководстве по докеру есть что сказать об этом:

Предоставление некорневого доступа

Демон 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) является корневым эквивалентом; см. подробности Docker Daemon Attack Surface и этот пост в блоге Почему мы не позволяем некорневым пользователям запускать Docker в CentOS, Fedora или RHEL (спасибо michael-n).

В недавнем выпуске экспериментального режима без root на GitHub инженеры упоминают, что режим без root позволяет запускать 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 Attack Surface ).

Управление Docker от имени пользователя без полномочий root

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

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


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

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

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

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

    docker run hello-world
    

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


3
Да, но каждый привилегированный процесс открывает потенциал для использования. Докер подключается так глубоко в операционной системе, чтобы действительно наделить этим уровнем привилегий?
Мэтт

3
newgrp dockerне работал для меня, я должен был выйти.
lolmaus - Андрей Михайлов

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

2
вам НЕ нужно перезапускать демон docker для этого изменения !! просто добавьте пользователя, которого вы только что добавили, выйдите, а затем снова войдите
Tommy

4
если вы используете docker login, вы можете обнаружить, что .dockerпапка, созданная в вашей домашней папке, принадлежит root. Таким образом , вы столкнулись бы это предупреждение при выполнении команд Docker: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Я сделал мой профиль .dockerпапки доступны без Судо так: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. chgrpне похоже , чтобы помочь , хотя, так что, вероятно , я должен рекомендовать только CHOWN шаг.
Birchlabs

202

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

 sudo usermod -aG docker $USER

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


14
после добавления пользователя в группу выполните эту команду: sg group_name -c "bash"
madjardi

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

5
Чем эта команда отличается от "sudo gpasswd -a $ {USER} docker" в другом ответе? Если вообще ...
Эшли Айткен

9
Не могли бы вы добавить предупреждение, данное документами: «Докер-группа [...] является корневым эквивалентом», чтобы у людей была возможность подумать об этом
Murmel

2
Эффект тот же, что и у принятого на 2 года ответа, но без предупреждений о рисках безопасности
Герт ван ден Берг

57

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

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

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

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

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

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


5
Это работало 16.04
edib

Это то, что мне нужно, другие ответы, требуют, чтобы у пользователя были права root. Спасибо большое!
Мринал Саураб

1
Намного лучше, чем IMO. Докер группы является корневым эквивалентом, и это всегда является признаком опасности. И я не вижу никаких недостатков в том, чтобы стать владельцем этого файла.
Xerus

5
@ Xerus, если я правильно понимаю, тот , кто может писать в этот сокет, тоже может получить привилегии, эквивалентные root . Таким образом, предоставление кому-либо доступа к этому сокету через ACL имеет тот же эффект безопасности, что и добавление этого человека в группу Docker.
Паŭло Эберманн

1
Работал на Linux Mint 19 для меня. Благодарю.
Мы Борг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.