Устранение проблем с разрешениями Docker Permission Denied

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

В этом учебнике вы узнаете множество способов устранения ужасной ошибки отказа в разрешении Docker.

Предварительные требования

Этот учебник включает практические демонстрации. Чтобы следовать за ними, убедитесь, что у вас есть следующее:

  • Демонстрации в этом учебнике выполняются на Ubuntu 20.04, но также подходят для других дистрибутивов Linux.
  • Движок Docker, с версией учебника 20.10.8, сборка 3967b7d.

Запуск команд Docker с повышенными правами

Много факторов может привести к ошибке отказано в разрешении при подключении к Docker. Одним из таких факторов является возможность запуска команд Docker без предварительного добавления команды sudo. Команда sudo предоставляет вам повышенные административные права вместе с привилегиями безопасности при выполнении команд.

Ниже вы можете видеть ужасную ошибку отказано в разрешении при попытке выполнить команду docker.

Running into a permission denied error

Запустите ваш терминал и добавьте sudo перед командой docker ниже, чтобы запустить образ Docker hello-world. Поскольку вы выполняете повышенную команду, вам нужно будет ввести ваш пароль для продолжения.

sudo docker run hello-world

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

Running Elevated (sudo) Docker Commands

Перезапуск Docker Engine

Если выполнение повышенных команд Docker не устраняет ошибку permission denied, убедитесь, что ваш Docker Engine запущен. Подобно выполнению команды docker без команды sudo, остановленный Docker Engine вызывает ошибку permission denied. Как исправить ошибку? Перезапустите ваш Docker engine.

Выполните команду systemctl ниже, чтобы подтвердить статус Docker Engine (status docker) и проверить, работает ли он.

sudo systemctl status docker

Ниже вы можете увидеть, что Docker Engine работает, из возвращаемого статуса, который показывает активный (running).

Displaying Docker Engine status

Если Docker Engine не активен, выполните команду systemctl ниже, чтобы запустить Docker Engine (start docker).

sudo systemctl start docker

Теперь запустите команду Docker hello-world, как вы делали в разделе «Запуск повышенных Docker-команд», чтобы убедиться, что ошибка устранена.

sudo docker run hello-world

Добавление учетной записи пользователя в группу с доступом для не-root пользователя

Вы подтвердили, что ваш движок Docker работает, но по-прежнему получаете ошибку Docker permission denied? Если да, вам необходимо добавить вашу учетную запись в группу с доступом для не-root пользователя. Почему? Потому что любая команда Docker, которую вы запускаете на Linux-машине не в группе пользователя, вызывает ошибку permission denied.

  1. Запустите команду groupadd ниже, чтобы создать новую группу с именем docker. Введите свой пароль, чтобы продолжить выполнение команды.
sudo groupadd docker

Если группа docker существует в группе пользователя, вы увидите вывод, подобный приведенному ниже.

Creating a New Group Named ‘docker’

2. Затем запустите команду usermod ниже, где параметры -aG указывают команде добавить вашу учетную запись пользователя (programmer) в группу (docker). Эта команда позволяет вашей учетной записи иметь доступ не от пользователя.

sudo usermod -aG docker programmer

3. Запустите команду newgrp ниже, чтобы изменить текущий реальный идентификатор группы на группу docker.

Запускайте эту команду каждый раз, когда хотите запустить Docker как не-root пользователь.

sudo newgrp docker 

4. Наконец, повторно запустите образ Docker hello-world, чтобы подтвердить, что вы больше не видите ошибки. Если на этом этапе вы все еще получаете ошибку, то рассмотрите возможность предоставить больше доступа к файлу docker.sock. Файл docker.sock – это сокет UNIX, способ обмена информацией между процессами пользователей и системы, который прослушивает демон Docker в качестве точки входа в API Docker.

Выполните команду chmod ниже, чтобы предоставить всем пользователям доступ на чтение/запись (666) к файлу /var/run/docker.sock. Теперь снова запустите образ Docker hello-world, чтобы убедиться, что ошибка устранена.

sudo chmod 666 /var/run/docker.sock

Редактирование файла управления службой Docker

Если запуск Docker от имени пользователя без прав администратора не устраняет ошибку, попробуйте отредактировать файл управления службой Docker SystemD, системой управления службами. Файл службы Docker содержит чувствительные параметры, которые могут изменить поведение демона Docker. Вы можете изменить стандартное поведение файла unit Docker, добавив дополнительную команду для изменения стандартного поведения службы.

1. Выполните команду ниже, чтобы открыть файл управления службой Docker в вашем любимом текстовом редакторе. В этом примере файл службы Docker открывается в текстовом редакторе nano.

sudo nano /usr/lib/systemd/system/docker.service

2. Найдите область с заголовком [Service] внутри файла юнита службы Docker, как показано ниже. Скопируйте/вставьте указанные ниже команды в файл юнита службы Docker и сохраните изменения.

Ниже команда SupplementaryGroups устанавливает дополнительные группы Unix там, где выполняются процессы. В то же время команда ExecStartPost выполняет операции по очистке, даже если служба не запускается правильно.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. Теперь выполните указанные ниже команды для перезапуска и включения службы Docker. Это позволит вам запустить службу Docker заново, чтобы избежать ошибок при выполнении команд Docker.

# Перезагружает все файлы юнитов Docker и создает заново всё дерево зависимостей.
sudo systemctl daemon-reload
# Перезапускает службу Docker
sudo systemctl start docker
# Включает Docker для запуска на вашем компьютере.
sudo systemctl enable docker

4. Наконец, повторно запустите образ Docker hello-world и проверьте, получаете ли вы все еще ошибку с отказом в разрешении.

Запуск Docker в привилегированном режиме

Не последним в списке решения ошибки с отказом в разрешении Docker является запуск Docker в привилегированном режиме. Это предоставляет контейнеру Docker root-доступ к системе.

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

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

sudo docker ls -a
Listing all Docker Containers in the System

2. Затем выполните команду docker inspect ниже, чтобы проверить, находится ли контейнер, который вы хотите запустить, уже в привилегированном режиме (--format='{{.HostConfig.Privileged}}'). Замените CONTAINER_ID ниже на фактический идентификатор контейнера, который вы записали на шаге один.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

Если контейнер находится в привилегированном режиме, команда вернет значение true в консоль. Но если команда возвращает ложное значение, как показано ниже, перейдите к следующему шагу.

Checking if a Container is in Privileged Mode

3. Наконец, выполните команду docker ниже, чтобы запустить контейнер Docker в привилегированном режиме (--privileged hello-world).

sudo docker run --privileged hello-world

Заключение

На протяжении этого руководства вы узнали множество способов решения ошибки Docker permission denied, от выполнения повышенных команд до запуска Docker в привилегированном режиме.

Теперь вы знаете, как избавиться от ошибки при построении Docker-проектов приложений; возможно, вам также захочется всегда держать свои образы Docker в чистоте?

Source:
https://adamtheautomator.com/docker-permission-denied/