当我尝试通过PHP启动Docker容器时,我收到以下错误
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?"
我尝试通过shell_exec执行docker run命令,因此执行用户在Ubuntu 14.04上是www-data。为了更好的衡量,我尝试将docker命令作为sudo运行,但它没有任何区别。谷歌搜索"你在尝试...."发现一些可能具有相关信息的链接 - 例如here - 但我还没有太多意义。
另外为了好的措施我输出了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来操纵docker?我非常感谢任何帮助
答案 0 :(得分: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安装程序)创建一个名为docker的Unix组并向其添加用户,则docker守护程序将使docker组的Unix套接字的所有权可读/写。守护进程开始。 docker守护程序必须始终以root用户身份运行,但如果您以docker组中的用户身份运行docker客户端,则不需要向所有客户端命令添加sudo。从0.9.0开始,您可以指定除docker之外的组应该拥有带-G选项的Unix套接字。
示例:强>
添加泊坞组,如果它尚未存在。
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
或注销/以激活对群组的更改。
答案 1 :(得分:-1)
我发布这个作为答案而非评论,因为它确实解决了这个问题。但是,我对解决方案有所保留,所以我希望这里有其他答案。我通过添加
修改了sudoerswww-data hostname =(ALL)NOPASSWD:ALL 默认值!requiretty
提供问题的完整解决方案 - 我现在可以从PHP脚本启动Docker容器。 Allv非常好,但我确实有一些关于以这种方式放松sudoers的担忧。所有这一切发生的环境都受到控制,但即使如此,它听起来也不是完美的解决方案。
我尝试用NOPASSWD替换NOPASSWD:ALL:/ path / to / script但是这不起作用,因为预期的是NOPASSWD:application。
如果有人能提出一种能提供更安全解决方案的方法,那么我将非常感激。