Как исправить ошибку Docker “Got permission denied while trying to connect to the Docker daemon socket” [Актуальное руководство 2026]

スポンサーリンク

Как исправить ошибку Docker “Got permission denied while trying to connect to the Docker daemon socket” [Актуальное руководство 2026]

Одна из самых распространённых ошибок при начале работы с Docker — “Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock”. В этой статье подробно описаны причины и конкретные способы решения этой ошибки, обновлённые для актуальных окружений 2026 года. Это обязательное чтение для всех пользователей, работающих с Docker на Linux (Ubuntu, CentOS, Debian и др.).

  1. Что это за ошибка? Симптомы, с которыми вы столкнётесь
  2. Причины возникновения этой ошибки
    1. Причина 1: Текущий пользователь не входит в группу docker
    2. Причина 2: Не выполнен выход/вход после изменения группы
    3. Причина 3: Демон Docker не запущен
    4. Причина 4: Права доступа к /var/run/docker.sock были неправильно изменены
    5. Причина 5: Ограничения доступа SELinux или AppArmor
  3. Решение 1: Добавить пользователя в группу docker (Рекомендуется)
    1. Шаг 1: Проверить, существует ли группа docker
    2. Шаг 2: Добавить текущего пользователя в группу docker
    3. Шаг 3: Применить изменение группы
    4. Шаг 4: Проверить настройку
    5. Важные замечания
  4. Решение 2: Использовать sudo с командами Docker
  5. Решение 3: Использовать режим Rootless Docker (Продвинутый)
    1. Преимущества режима Rootless
    2. Шаги установки
    3. Важные замечания
  6. Как предотвратить эту ошибку
    1. 1. Настроить группу сразу после установки Docker
    2. 2. Автоматизировать с помощью Ansible или Shell-скриптов
    3. 3. Проверить настройки прав доступа в пайплайне CI/CD
    4. 4. Регулярно проверять состояние службы Docker
    5. 5. Никогда не использовать chmod 666
  7. Итоги
  8. Ссылки

Что это за ошибка? Симптомы, с которыми вы столкнётесь

После установки Docker или при выполнении команд docker на Linux-сервере вы можете увидеть следующее сообщение об ошибке:

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.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

Эта ошибка может возникнуть практически при любой команде Docker, включая docker ps, docker run и docker-compose up. В частности, вы можете столкнуться со следующими симптомами:

  • docker run hello-world не выполняется: Наиболее частый случай при проверке установки Docker
  • docker ps не показывает контейнеры: Невозможно увидеть работающие контейнеры из-за ошибок доступа
  • docker-compose up не запускается: Многоконтейнерные приложения не могут стартовать
  • Пайплайны CI/CD завершаются ошибкой: Команды Docker в Jenkins, GitHub Actions, GitLab CI и т.д. останавливаются из-за ошибок прав доступа
  • Расширение Dev Containers VS Code не может подключиться: Невозможно подключиться к Docker в средах удалённой разработки

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

Причины возникновения этой ошибки

Причина 1: Текущий пользователь не входит в группу docker

Это самая распространённая причина. Демон Docker по умолчанию общается через Unix-сокет (/var/run/docker.sock), который принадлежит пользователю root (администратору). Обычные пользователи должны входить в группу docker, чтобы выполнять команды Docker. Простая установка Docker не добавляет вашего пользователя в эту группу автоматически, что приводит к ошибкам доступа.

# Проверить права доступа к сокету
ls -la /var/run/docker.sock
# Пример вывода: srw-rw---- 1 root docker 0 Feb 12 10:00 /var/run/docker.sock

Причина 2: Не выполнен выход/вход после изменения группы

После выполнения sudo usermod -aG docker $USER для добавления пользователя в группу docker вы не вышли из системы и не вошли снова. В Linux изменения членства в группах не вступают в силу до начала нового сеанса (входа в систему). Это очень распространённая ошибка, и вопросы вроде “я выполнил команду, но всё равно не работает” часто появляются на Stack Overflow и Reddit.

Причина 3: Демон Docker не запущен

Аналогичная ошибка может возникнуть, когда служба Docker остановлена. Это происходит, когда Docker не настроен на автоматический запуск после перезагрузки сервера или когда установка Docker неполная.

# Проверить состояние службы Docker
sudo systemctl status docker

Причина 4: Права доступа к /var/run/docker.sock были неправильно изменены

Это происходит, когда права доступа к файлу сокета были изменены вручную или когда инструменты безопасности сбросили разрешения. Сокет должен иметь права srw-rw---- и принадлежать root:docker; если права отличаются, нормальное подключение будет невозможно.

Причина 5: Ограничения доступа SELinux или AppArmor

На дистрибутивах Linux с усиленной безопасностью (RHEL, CentOS, Fedora и др.) SELinux может блокировать доступ к сокету Docker. Аналогично, на Ubuntu и подобных системах причиной может быть AppArmor.

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

Это самое безопасное и рекомендуемое решение. Оно также рекомендуется в официальной документации Docker.

Шаг 1: Проверить, существует ли группа docker

Сначала убедитесь, что группа docker существует в вашей системе. Обычно она создаётся автоматически при установке Docker, но стоит проверить.

# Проверить существование группы docker
cat /etc/group | grep docker

Если группа не существует, создайте её следующей командой:

# Создать группу docker
sudo groupadd docker

Шаг 2: Добавить текущего пользователя в группу docker

Используйте следующую команду для добавления текущего пользователя в группу docker:

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

Объяснение команды:
usermod: Команда для изменения учётных записей пользователей
-a: Режим добавления (не удаляет из существующих групп)
-G docker: Указывает группу docker
$USER: Автоматически подставляется имя текущего пользователя

Для добавления конкретного пользователя замените $USER на имя пользователя:

# Пример: Добавить конкретного пользователя
sudo usermod -aG docker имя_пользователя

Шаг 3: Применить изменение группы

Способ A: Выйти и войти снова (самый надёжный)

# Для SSH-подключений
exit
# Затем подключиться повторно через SSH

# Для настольных сред
# Выйти из системы и войти снова

Способ B: Использовать newgrp для немедленного эффекта (только текущий терминал)

# Немедленно активировать группу docker в текущей сессии оболочки
newgrp docker

Этот способ работает только для текущей сессии терминала. При открытии новых терминалов нужно выйти и войти снова.

Шаг 4: Проверить настройку

# Проверить принадлежность к группе docker
groups

# Протестировать работу Docker
docker run hello-world

Если появится сообщение Hello from Docker!, настройка завершена успешно.

Важные замечания

  • Если забыть опцию -a (добавление), пользователь будет принадлежать “только” группе docker и будет удалён из всех остальных групп. Всегда используйте -aG вместе
  • Членство в группе docker даёт пользователю привилегии, эквивалентные root. Добавляйте только доверенных пользователей
  • В среде WSL2 (Windows Subsystem for Linux) может потребоваться перезапуск WSL (wsl --shutdown)

Решение 2: Использовать sudo с командами Docker

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

Просто добавьте sudo перед всеми командами Docker для выполнения с привилегиями root:

# Выполнить команды Docker с sudo
sudo docker run hello-world
sudo docker ps
sudo docker-compose up -d

Этот способ работает сразу, но имеет следующие недостатки:

  • Требует ввода sudo каждый раз
  • Делает выполнение в Docker Compose и скриптах громоздким
  • sudo может быть недоступен в пайплайнах CI/CD
  • Переменные окружения и настройки контекста Docker используются от пользователя root

Для долгосрочного использования настоятельно рекомендуется добавить пользователя в группу docker (Решение 1).

Для использования Docker Compose:

# Docker Compose
sudo docker compose up -d

# Устаревший Docker Compose (v1)
sudo docker-compose up -d

Решение 3: Использовать режим Rootless Docker (Продвинутый)

Режим Rootless, официально поддерживаемый с Docker 20.10, запускает демон Docker с привилегиями обычного пользователя. В 2026 году Docker Engine 27.x ещё больше повысил стабильность, что делает его рекомендуемым подходом для продакшн-сред, ориентированных на безопасность.

Преимущества режима Rootless

  • Привилегии root не требуются вообще
  • Значительно сниженные риски безопасности
  • Меньший риск компрометации хоста изнутри контейнеров

Шаги установки

Сначала установите необходимые пакеты зависимостей:

# Ubuntu/Debian
sudo apt-get install -y uidmap dbus-user-session

# CentOS/RHEL
sudo yum install -y shadow-utils fuse-overlayfs

Затем запустите скрипт настройки режима Rootless:

# Остановить существующий Docker (rootful)
sudo systemctl disable --now docker.service docker.socket

# Установить режим Rootless
dockerd-rootless-setuptool.sh install

Настройте переменные окружения:

# Добавить в ~/.bashrc или ~/.zshrc
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
# Применить настройки
source ~/.bashrc

# Проверить работоспособность
docker run hello-world

Важные замечания

  • Режим Rootless имеет некоторые ограничения (привязка привилегированных портов 80/443, определённые драйверы хранения и др.)
  • Образы и тома, созданные с привилегиями root, нельзя использовать напрямую
  • Сетевая конфигурация может отличаться от стандартного режима

Как предотвратить эту ошибку

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

1. Настроить группу сразу после установки Docker

Завершите добавление в группу docker перед выполнением первой команды после установки Docker. Включите это в документацию по настройке или скрипты для эффективной установки.

# Пример скрипта настройки после установки
#!/bin/bash
sudo groupadd docker 2>/dev/null
sudo usermod -aG docker $USER
echo "Пожалуйста, выйдите из системы и войдите снова"

2. Автоматизировать с помощью Ansible или Shell-скриптов

При автоматизации командной разработки или построения серверов включите установку Docker и настройку группы в ваши скрипты автоматизации.

3. Проверить настройки прав доступа в пайплайне CI/CD

Для GitHub Actions, GitLab CI, Jenkins и др. заранее убедитесь, что права доступа к сокету Docker настроены правильно. Многие платформы CI/CD требуют специальных настроек для использования Docker.

4. Регулярно проверять состояние службы Docker

# Включить автозапуск Docker
sudo systemctl enable docker

# Проверить состояние службы Docker
sudo systemctl status docker

5. Никогда не использовать chmod 666

Вы можете встретить chmod 666 /var/run/docker.sock в качестве «решения» в интернете, но это крайне опасно с точки зрения безопасности. Это предоставляет всем пользователям доступ к демону Docker, фактически давая привилегии root каждому. Никогда не используйте это в продакшн-средах.

Итоги

Ошибка Docker “Got permission denied while trying to connect to the Docker daemon socket” — это чрезвычайно распространённая ошибка, с которой сталкиваются практически все пользователи Linux, начинающие работать с Docker. Однако при правильном понимании причин и решений она устраняется за несколько минут.

Ключевые моменты:
Рекомендуется: Добавить пользователя в группу docker с помощью sudo usermod -aG docker $USER и выйти/войти снова
Временно: Использовать sudo docker для немедленного выполнения команд
С фокусом на безопасность: Рассмотреть режим Rootless Docker

Если проблема сохраняется, проверьте следующее:
1. Запущена ли служба Docker? (sudo systemctl status docker)
2. Правильны ли права доступа к файлу сокета? (ls -la /var/run/docker.sock)
3. Не мешают ли настройки SELinux/AppArmor?

Если решить проблему всё равно не удаётся, рекомендуем обратиться на форумы сообщества Docker или Stack Overflow, указав информацию о вашей среде (ОС, версия Docker, полное сообщение об ошибке).

Ссылки

コメント

タイトルとURLをコピーしました