从PHP启动Docker容器

当我尝试通过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,但没有任何区别。 search“您正在尝试….”出现几个链接,可能有一些相关的信息 – 例如在这里 – 但我还没有能够很好地理解它。

也是为了好的措施,我输出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吗? 我会很感激任何帮助

我想你可以通过添加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安装程序)创build一个名为docker的Unix组并向其添加用户,那么当守护进程启动时,docker守护进程将使docker组读/写的Unix套接字的所有权。 docker守护程序必须始终以root用户身份运行,但是如果您在docker组中以用户身份运行docker客户端,则不需要将sudo添加到所有客户端命令。 从0.9.0开始,可以指定docker以外的组拥有带-G选项的Unix套接字。

例:

  • 如果docker组不存在,则添加docker组。

     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或者注销/激活对组的更改。

我发布这个答案,而不是作为一个评论,因为它确实解决了这个问题。 但是,我对解决scheme有所保留,所以我希望在这里会有其他答案。 我通过添加修改了sudoers

www-data hostname =(ALL)NOPASSWD:ALL Defaults!requiretty

它提供了一个完整的解决scheme – 我现在可以从PHP脚本启动Docker容器。 Allv非常好,但是我也有一些关于这种方式来放松sudoers的问题。 所有这一切正在发生的环境是受到控制的,但即使如此,听起来也是一个远远完美的解决scheme。

我试图用NOPASSWD:/ path / to / scriptreplaceNOPASSWD:ALL,但是这样做不起作用,因为预期的是NOPASSWD:应用程序。

如果任何人都能提出一种提供更安全解决scheme的方法,我将非常感激。