Как решить проблемы с правами доступа для Docker в Ubuntu?

Вопрос или проблема

Я установил 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 причиной, следующим образом:

  1. Отключите SELinux: setenforce 0
  2. Повторите попытку

Если отключение SELinux решило вашу проблему, это не причина оставить его отключенным:

  1. Включите SELinux: setenforce 1
  2. Разрешите подключение сокета в конфигурации SELinux: setsebool docker_connect_any true
  3. Запустите ваш контейнер 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.

Примеры проблем

  1. Ошибка доступа при запуске контейнеров:

    • При выполнении команды, например, 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
  2. Проблемы с выполнением команды docker info:

    • Появляется ошибка:
      Get http:///var/run/docker.sock/v1.12/info: dial unix /var/run/docker.sock: permission denied

Эти ошибки означают, что пользовательский процесс не может установить соединение с сокетом Docker из-за недостаточных прав.

Применение: как решить проблему

  1. Добавление пользователя в группу docker:

    • Убедитесь, что группа docker создаётся автоматически на большинстве современных дистрибутивов Ubuntu при установке Docker. Чтобы проверить это, выполните:

      $ sudo groupadd docker

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

    • Добавьте своего пользователя в группу docker:

      $ sudo usermod -aG docker $USER
    • Чтобы изменения вступили в силу, необходимо перелогиниться или использовать подгруппу, например:

      $ su - $USER
  2. Настройка прав доступа к сокету:

    Если добавление в группу docker не помогло, проверьте и измените права на сокет:

    $ sudo chmod a+rwx /var/run/docker.sock

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

  3. Перезапуск Docker демона:

    • Перезапустите Docker, чтобы применить изменения:
      $ sudo service docker restart
    • На более новых системах, использующих Snap, может понадобиться:
      $ sudo systemctl restart snap.docker.dockerd
  4. Проверка после изменений:

    • Убедитесь, что изменения сработали, выполнив команду:
      $ docker run hello-world

      Если Docker настроен правильно, вы увидите сообщение "Hello from Docker!"

  5. Необходимость SELinux:

    • В случаях с CentOS или RedHat может потребоваться временно отключить SELinux:
      $ setenforce 0
    • Убедитесь, что SELinux не блокирует операции Docker, и создайте нужные исключения, если это необходимо.

Заключение

Основная задача — правильно настроить права доступа так, чтобы они соответствовали требованиям безопасности вашей инфраструктуры. Не следует забывать о необходимости поддерживать надлежащий уровень безопасности, особенно на корпоративных серверах. Убедитесь, что ваши изменения не позволят злоумышленникам получить несанкционированный доступ к Docker-сокету и другим критически важным компонентам вашей системы. Надеюсь, данная инструкция поможет вам эффективно и безопасно решить проблемы с правами Docker на Ubuntu.

Оцените материал
Добавить комментарий

Капча загружается...