Вопрос или проблема
Я установил Docker, как описано здесь. Я использую Ubuntu Trusty 14.04 (LTS) (64-bit). Все прошло хорошо во время установки. Также команда $ sudo docker run -i -t ubuntu /bin/bash
выполняется успешно (после того, как я введу “exit” в открытой консоли). Но когда я пытаюсь сделать что-то другое, я получаю “отказ в доступе”. Например:
`$ sudo docker run -d -P training/webapp python app.py`
Результаты в Post http:///var/run/docker.sock/v1.12/containers/create: dial unix /var/run/docker.sock: permission denied
` docker info`
Результаты в Get http:///var/run/docker.sock/v1.12/info: dial unix /var/run/docker.sock: permission denied
Как это решить? Я искал в интернете проблему, но не могу найти решение для моего случая.
Добавьте группу docker, если она еще не существует.
$ sudo groupadd docker
Добавьте подключенного пользователя ${USER}
в группу docker. Измените имя пользователя, чтобы оно соответствовало вашему предпочтительному пользователю.
$ sudo gpasswd -a ${USER} docker
Перезапустите демон Docker:
$ sudo service docker restart # Или docker.io для старых версий
# 18.04+ с snap:
$ sudo systemctl restart snap.docker.dockerd
Вам следует выйти из системы и снова войти, чтобы обновить права группы. Чтобы этого избежать, вы можете переключиться на подшелл следующим образом. Или воспользуйтесь любым из других приемов, упомянутых в этом вопросе:
su - $USER
Если вы используете CentOS или RedHat, возможно, вам нужно сначала отключить SELinux, выполнив команду:
setenforce 0
Либо перезагрузите систему, чтобы снова включить SELinux, либо выполните setenforce 1
.
У меня была такая же проблема из-за SELinux. Вы можете проверить, является ли SELinux причиной, следующим образом:
- Отключите SELinux:
setenforce 0
- Повторите попытку
Если отключение SELinux решило вашу проблему, это не причина оставить его отключенным:
- Включите SELinux:
setenforce 1
- Разрешите подключение сокета в конфигурации SELinux:
setsebool docker_connect_any true
- Запустите ваш контейнер Docker с опцией
--privileged
Я предполагаю, что ваше имя пользователя уже в группе docker. Чтобы проверить это, выполните команду ниже.
id -nG
Если нет, вам нужно добавить вашего пользователя в группу docker выполнив команду ниже.
sudo groupadd docker
sudo usermod -aG docker $USER
Когда вы выполняете команду, sudo systemctl start docker
, создается процесс Docker. Этот процесс Docker содержит поток-демон dockerd
. Команда также создает по умолчанию Unix-сокет docker.sock
. Сокет docker.sock
постоянно прослушивается потоком-демоном dockerd
. Это позволяет вам выполнять межпроцессовое взаимодействие на уровне ядра с процессом docker.pid
. Чтобы иметь возможность использовать этот сокет Docker, вы должны иметь соответствующие разрешения на уровне процесса (docker.pid
) и уровне файла (docker.sock
). Таким образом, выполнение следующих двух команд должно решить вашу проблему.
sudo chmod a+rwx /var/run/docker.sock # Вы можете предоставить только разрешение на выполнение
sudo chmod a+rwx /var/run/docker.pid
С текущей версией нам не нужно добавлять группу docker
.
Она существует автоматически после установки. Вы можете проверить это, используя команду:
$ sudo groupadd docker
groupadd: group 'docker' already exists
Таким образом, чтобы управлять Docker как обычный пользователь, просто добавьте своего пользователя в группу docker, затем выйдите и снова войдите, чтобы в вашем групповом членстве произошли изменения:
$ sudo usermod -aG docker $USER
$ logout
Чтобы проверить это, когда вы снова войдете
$ docker run hello-world
Hello from Docker!
Это сообщение показывает, что ваша установка, похоже, работает правильно.
Вы даже можете принудительно использовать GROUP:docker
как свою новую основную группу:
$ sudo chown "$USER":"docker" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R
$ sudo usermod -g docker ${USER}
$ logout
Чтобы проверить это, когда вы снова войдете
$ id
uid=1001(<user_name>) gid=999(docker) groups=999(docker),...
.
Ответ или решение
Решение проблем с правами доступа при использовании Docker на Ubuntu может быть связано с различными аспектами работы системы и конфигурации Docker. Рассмотрим теорию, возможные примеры возникновения таких проблем и способы их решения.
Теория
При установке Docker на Ubuntu основные проблемы с правами доступа возникают из-за ограничения доступа к Unix-сокету /var/run/docker.sock
. Этот сокет используется демоном Docker для прослушивания запросов от клиента Docker, например, от команд docker run
или docker ps
. По умолчанию, доступ к этому сокету имеют только пользователи с административными привилегиями (root) или пользователи, которые вошли в группу docker
.
Примеры проблем
-
Ошибка доступа при запуске контейнеров:
- При выполнении команды, например,
docker run -d -P training/webapp python app.py
, выводится ошибка:Post http:///var/run/docker.sock/v1.12/containers/create: dial unix /var/run/docker.sock: permission denied
- При выполнении команды, например,
-
Проблемы с выполнением команды
docker info
:- Появляется ошибка:
Get http:///var/run/docker.sock/v1.12/info: dial unix /var/run/docker.sock: permission denied
- Появляется ошибка:
Эти ошибки означают, что пользовательский процесс не может установить соединение с сокетом Docker из-за недостаточных прав.
Применение: как решить проблему
-
Добавление пользователя в группу docker:
-
Убедитесь, что группа
docker
создаётся автоматически на большинстве современных дистрибутивов Ubuntu при установке Docker. Чтобы проверить это, выполните:$ sudo groupadd docker
Если группа существует, вы увидите сообщение о том, что группа уже создана.
-
Добавьте своего пользователя в группу
docker
:$ sudo usermod -aG docker $USER
-
Чтобы изменения вступили в силу, необходимо перелогиниться или использовать подгруппу, например:
$ su - $USER
-
-
Настройка прав доступа к сокету:
Если добавление в группу
docker
не помогло, проверьте и измените права на сокет:$ sudo chmod a+rwx /var/run/docker.sock
Но будьте осторожны с этой командой, так как она может снизить безопасность, открыв сокет для всех пользователей системы. Предпочтите предоставить доступ только группе
docker
. -
Перезапуск Docker демона:
- Перезапустите Docker, чтобы применить изменения:
$ sudo service docker restart
- На более новых системах, использующих Snap, может понадобиться:
$ sudo systemctl restart snap.docker.dockerd
- Перезапустите Docker, чтобы применить изменения:
-
Проверка после изменений:
- Убедитесь, что изменения сработали, выполнив команду:
$ docker run hello-world
Если Docker настроен правильно, вы увидите сообщение "Hello from Docker!"
- Убедитесь, что изменения сработали, выполнив команду:
-
Необходимость SELinux:
- В случаях с CentOS или RedHat может потребоваться временно отключить SELinux:
$ setenforce 0
- Убедитесь, что SELinux не блокирует операции Docker, и создайте нужные исключения, если это необходимо.
- В случаях с CentOS или RedHat может потребоваться временно отключить SELinux:
Заключение
Основная задача — правильно настроить права доступа так, чтобы они соответствовали требованиям безопасности вашей инфраструктуры. Не следует забывать о необходимости поддерживать надлежащий уровень безопасности, особенно на корпоративных серверах. Убедитесь, что ваши изменения не позволят злоумышленникам получить несанкционированный доступ к Docker-сокету и другим критически важным компонентам вашей системы. Надеюсь, данная инструкция поможет вам эффективно и безопасно решить проблемы с правами Docker на Ubuntu.