Linux EACCESВысокая

Docker permission denied: причины и 5 проверенных способов решения

Статья объясняет, почему возникает ошибка доступа Docker в Linux, и предлагает 5 практических способов её устранения — от добавления пользователя в группу до настройки SELinux/AppArmor.

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 11+CentOS 8+RHEL 8+Fedora 35+

-и владелецroot:docker`."

  • name: "Временное решение через sudo" text: "Для срочного запуска используйте sudo docker ..., но это не рекомендуется для повседневной работы из-за рисков безопасности." howToTotalTime: "PT15M"

Что означает ошибка permission denied в Docker

Ошибка permission denied (иногда с кодом EACCES) означает, что текущий пользователь Linux не имеет прав на доступ к демону Docker (через сокет /var/run/docker.sock) или к файлам/директориям внутри контейнера/образов.

Типичный полный текст:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.41/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

Или при работе с файлами:

docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io: Temporary failure in name resolution.

Ошибка появляется при выполнении любых команд docker (run, ps, build, pull) от обычного пользователя.

Причины возникновения

  1. Пользователь не состоит в группе docker
    По умолчанию сокет /var/run/docker.sock принадлежит группе docker. Если пользователь не в этой группе, доступ запрещён.
  2. Неправильные права на сокет /var/run/docker.sock
    Например, если сокет создан с правами 600 (только root) или владельцем root:root.
  3. SELinux в режиме enforcing (RHEL/CentOS/Fedora)
    SELinux может блокировать доступ Docker к сокету или файлам. Часто проявляется в сообщениях avc: denied в audit.log.
  4. AppArmor (Ubuntu/Debian)
    Профили AppArmor могут ограничивать доступ Docker. Ошибки в syslog или dmesg.
  5. Попытка монтирования хостовой директории без прав
    При docker run -v /host/path:/container если у пользователя нет прав на чтение/запись в /host/path.
  6. Файловая система смонтирована с опцией noexec или nosuid
    Может мешать выполнению бинарников внутри контейнера.

Способ 1: Добавить пользователя в группу docker (рекомендуемый)

Это каноническое решение для большинства дистрибутивов.

  1. Добавьте текущего пользователя в группу docker:
sudo usermod -aG docker $USER

Флаг -aG (append to group) критически важен — без него пользователь может быть удалён из других групп.

  1. Примените изменения: выйдите из терминала и системы (или перезагрузите). В новом сеансе проверьте:
groups

В списке должна быть docker.

  1. Проверьте, что команды работают без sudo:
docker run hello-world

Если контейнер запустился — проблема решена.

⚠️ Важно: После добавления в группу необходимо новый логин. Это распространённая ошибка.

Способ 2: Временный запуск через sudo (не для продакшена)

Если нужно срочно запустить контейнер, а настройку групп сделать нельзя:

sudo docker run -it ubuntu bash

Недостатки:

  • Контейнер получает root-права хоста (опасность).
  • Файлы, созданные в контейнере, будут принадлежать root на хосте.
  • Неудобно для повседневной работы.

Способ 3: Проверить/исправить права на сокет вручную

Если группа docker есть, но доступ всё равно denied:

  1. Проверьте текущие права:
ls -l /var/run/docker.sock

Ожидаемый вывод:

srw-rw---- 1 root docker 0 Фев 16 12:00 /var/run/docker.sock

Если группа не docker или права 600:

  1. Установите правильного владельца и права:
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
  1. Перезапустите Docker (на всякий случай):
sudo systemctl restart docker

💡 Совет: Права на сокет сбрасываются при перезагрузке Docker. Если проблема возвращается, проверьте конфигурацию демона (/etc/docker/daemon.json) или системные unit-файлы.

Способ 4: Настройка SELinux (для RHEL/CentOS/Fedora)

Если getenforce возвращает Enforcing:

  1. Проверьте логи SELinux на наличие отказов:
sudo ausearch -m avc -ts recent
  1. Самый быстрый способ (временно, до перезагрузки):
sudo setenforce 0

Попробуйте запустить Docker. Если сработало — проблема в SELinux.

  1. Для постоянного решения:
    • Либо переведите SELinux в режим permissive в /etc/selinux/config (небезопасно).
    • Либо создайте правильный политику:
sudo semanage permissive -a docker_t
  • Или установите пакет docker-selinux (если не установлен):
sudo yum install docker-selinux
  1. Верните enforcing:
sudo setenforce 1

Способ 5: Настройка AppArmor (Ubuntu/Debian)

  1. Проверьте, загружен ли профиль Docker:
sudo apparmor_status | grep docker

Должно быть docker-default (enforced).

  1. Если профиль вызывает проблемы, можно его отключить (временно):
sudo aa-disable /etc/apparmor.d/docker

Или для конкретного контейнера:

docker run --security-opt apparmor=unconfined ...
  1. Для постоянного решения переустановите Docker (профиль пересоздастся):
sudo apt-get install --reinstall docker-ce

Профилактика

  • Никогда не работайте от root без необходимости. Добавляйте пользователей в группу docker вместо использования sudo.
  • Регулярно проверяйте права на /var/run/docker.sock после обновлений системы или Docker.
  • В продакшн-среде используйте rootless Docker (если поддерживается дистрибутивом) — это изолирует демон от root.
  • Для монтирования хостовых директорий убедитесь, что у пользователя есть права на них (например, chmod o+rx /host/path для чтения).
  • В дистрибутивах с SELinux/AppArmor не отключайте их полностью — настраивайте политики под Docker.
  • После Changes в группах напоминайте пользователям о необходимости перелогина.

FAQ

Q: Почему после добавления в группу docker ошибка всё ещё есть?
A: Скорее всего, вы не вышли и не зашли заново в систему. Группы загружаются при логине. Проверьте id -nG — если docker нет, нужно новый сеанс.

Q: Можно ли изменить группу сокета на sudo вместо docker?
A: Технически sudo chown root:sudo /var/run/docker.sock сработает, но это нарушает принцип наименьших привилегий. Группа docker создана специально для этого.

Q: Как добавить группу docker, если её нет?
A: Группа создаётся автоматически при установке Docker. Если её нет, переустановите Docker или создайте вручную: sudo groupadd docker (обычно не требуется).

Q: В чём разница между docker и docker-root группами?
A: В некоторых дистрибутивах (например, older RHEL) может быть группа docker-root. Она используется для rootless mode. Для обычного Docker нужна docker.

Q: Почему chmod 666 /var/run/docker.sock — плохая идея?
A: Это даёт всем пользователям полный доступ к Docker-демону. Любой локальный пользователь сможет управлять контейнерами, включая запуск с привилегиями --privileged, что эквивалентно root-доступу.

Q: Как проверить, какой пользователь запущен в контейнере?
A: docker exec <container> id. Если uid/gid не совпадают с хостовыми, могут быть проблемы с правами на смонтированные volumes.

Часто задаваемые вопросы

Почему Docker требует sudo, а другие команды нет?
Можно ли игнорировать ошибку permission denied и работать с sudo?
Чем отличается способ с `usermod` от изменения прав на сокет (`chmod`)?
Ошибка остаётся после добавления в группу docker?

Полезное

Добавить текущего пользователя в группу docker
Применить изменения групп
Проверить членство в группе
Проверить права на сокет (альтернатива)

Эта статья помогла вам решить проблему?