Запуск Docker-контейнеров из PHP

0

Когда я пытаюсь запустить контейнер Docker через PHP, я получаю следующую ошибку

level="fatal" msg="Get http:///var/run/docker.sock/v1.16/containers/json?limit=1: dial unix 
/var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon 
without TLS?" 

Я пытаюсь выполнить команду запуска docker через shell_exec, поэтому исполняющий пользователь на Ubuntu 14.04 является www-данными. Для хорошей меры я попытался запустить команду docker как sudo, но это не имело значения. Googling вокруг для "Вы пытаетесь...", появляется несколько ссылок, которые могут иметь некоторую информацию, которая имеет значение, например, здесь, но я еще не смог ее полностью понять.

Также для хорошей меры я выводю docker comamnd, который я пытаюсь выполнить для stderr, скопировал его и выполнил непосредственно через SSH. Вот эта команда

docker run -h user118 -d -p 8406:443 -v /var/docks/user118/logs:/var/log/apache2 -v 
/var/docks/user118/mysql:/var/lib/mysql -v /var/docks/user118/redis:/var/lib/redis -v 
/var/docks/user118/secure:/var/secure -v /var/docks/user118/site:/var/www/html lamp

с последующим

docker ps -a

а затем просмотр этого контейнера - никаких проблем, все работает отлично.

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

Я пытаюсь сделать невозможное здесь или есть относительно простой способ манипулировать докером через PHP-скрипт и shell_exec? Я был бы очень благодарен за любую помощь

  • 0
    Можете ли вы опубликовать полную команду, используемую в PHP для запуска вашего докера?
  • 0
    Смотрите мой отредактированный вопрос - как вы видите, команда не является проблемой. Он работает без проблем при запуске из Bash
Показать ещё 4 комментария
Теги:
docker

2 ответа

-1
Лучший ответ

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

www-data hostname = (ВСЕ) NOPASSWD: ВСЕ по умолчанию! requiretty

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

Я попытался заменить NOPASSWD: ALL на NOPASSWD: /path/to/script, но это не работает, так как ожидается, что NOPASSWD: application.

Если бы кто-нибудь мог предложить способ, который предлагает более безопасное решение, я был бы самым обязанным.

3

Я думаю, вы можете решить это, добавив пользователя www-data в группу docker.

От https://docs.docker.com/installation/ubuntulinux/#giving-non-root-access:

Предоставление доступа без полномочий root

Демон docker всегда работает как пользователь root, а с версии Docker версии 0.5.2 демон docker привязывается к сокету Unix вместо TCP-порта. По умолчанию этот сокет Unix принадлежит пользователю root, и поэтому по умолчанию вы можете получить доступ к нему с помощью sudo.

Начиная с версии 0.5.3, если вы (или ваш установщик Docker) создаете группу Unix, называемую докере, и добавьте к ней пользователей, тогда демон docker сделает доступ к сокету Unix для чтения/записи группой докеров при запуске демона, Демон-докер должен всегда запускаться как пользователь root, но если вы запустите клиент докеров в качестве пользователя в группе докеров, вам не нужно добавлять sudo ко всем клиентским командам. Начиная с версии 0.9.0 вы можете указать, что группа, отличная от докера, должна иметь сокет Unix с опцией -G.

Пример:

  • Добавьте группу докеров, если она еще не существует.

    sudo groupadd docker
    
  • Добавьте подключенного пользователя "$ {USER}" в группу докеров. Измените имя пользователя в соответствии с вашим предпочтительным пользователем.

    sudo gpasswd -a ${USER} docker
    
  • Перезапустите демон Docker:

    sudo service docker restart
    
  • Если вы используете Ubuntu 14.04 и вместо этого используйте docker.io:

    sudo service docker.io restart
    
  • Либо newgrp docker либо войдите в систему, чтобы активировать изменения в группах.

  • 0
    Спасибо за ответ. К сожалению, это не делает ничего полезного - точно такое же сообщение в error.log - поэтому я застрял с моим решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню