-и владелец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) от обычного пользователя.
Причины возникновения
- Пользователь не состоит в группе
docker
По умолчанию сокет/var/run/docker.sockпринадлежит группеdocker. Если пользователь не в этой группе, доступ запрещён. - Неправильные права на сокет
/var/run/docker.sock
Например, если сокет создан с правами600(только root) или владельцемroot:root. - SELinux в режиме enforcing (RHEL/CentOS/Fedora)
SELinux может блокировать доступ Docker к сокету или файлам. Часто проявляется в сообщенияхavc: deniedвaudit.log. - AppArmor (Ubuntu/Debian)
Профили AppArmor могут ограничивать доступ Docker. Ошибки вsyslogилиdmesg. - Попытка монтирования хостовой директории без прав
Приdocker run -v /host/path:/containerесли у пользователя нет прав на чтение/запись в/host/path. - Файловая система смонтирована с опцией
noexecилиnosuid
Может мешать выполнению бинарников внутри контейнера.
Способ 1: Добавить пользователя в группу docker (рекомендуемый)
Это каноническое решение для большинства дистрибутивов.
- Добавьте текущего пользователя в группу
docker:
sudo usermod -aG docker $USER
Флаг -aG (append to group) критически важен — без него пользователь может быть удалён из других групп.
- Примените изменения: выйдите из терминала и системы (или перезагрузите). В новом сеансе проверьте:
groups
В списке должна быть docker.
- Проверьте, что команды работают без
sudo:
docker run hello-world
Если контейнер запустился — проблема решена.
⚠️ Важно: После добавления в группу необходимо новый логин. Это распространённая ошибка.
Способ 2: Временный запуск через sudo (не для продакшена)
Если нужно срочно запустить контейнер, а настройку групп сделать нельзя:
sudo docker run -it ubuntu bash
Недостатки:
- Контейнер получает root-права хоста (опасность).
- Файлы, созданные в контейнере, будут принадлежать root на хосте.
- Неудобно для повседневной работы.
Способ 3: Проверить/исправить права на сокет вручную
Если группа docker есть, но доступ всё равно denied:
- Проверьте текущие права:
ls -l /var/run/docker.sock
Ожидаемый вывод:
srw-rw---- 1 root docker 0 Фев 16 12:00 /var/run/docker.sock
Если группа не docker или права 600:
- Установите правильного владельца и права:
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
- Перезапустите Docker (на всякий случай):
sudo systemctl restart docker
💡 Совет: Права на сокет сбрасываются при перезагрузке Docker. Если проблема возвращается, проверьте конфигурацию демона (
/etc/docker/daemon.json) или системные unit-файлы.
Способ 4: Настройка SELinux (для RHEL/CentOS/Fedora)
Если getenforce возвращает Enforcing:
- Проверьте логи SELinux на наличие отказов:
sudo ausearch -m avc -ts recent
- Самый быстрый способ (временно, до перезагрузки):
sudo setenforce 0
Попробуйте запустить Docker. Если сработало — проблема в SELinux.
- Для постоянного решения:
- Либо переведите SELinux в режим
permissiveв/etc/selinux/config(небезопасно). - Либо создайте правильный политику:
- Либо переведите SELinux в режим
sudo semanage permissive -a docker_t
- Или установите пакет
docker-selinux(если не установлен):
sudo yum install docker-selinux
- Верните enforcing:
sudo setenforce 1
Способ 5: Настройка AppArmor (Ubuntu/Debian)
- Проверьте, загружен ли профиль Docker:
sudo apparmor_status | grep docker
Должно быть docker-default (enforced).
- Если профиль вызывает проблемы, можно его отключить (временно):
sudo aa-disable /etc/apparmor.d/docker
Или для конкретного контейнера:
docker run --security-opt apparmor=unconfined ...
- Для постоянного решения переустановите 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.