从PHP启动Docker容器

时间:2015-01-05 15:26:35

标签: php shell 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运行,但它没有任何区别。谷歌搜索"你在尝试...."发现一些可能具有相关信息的链接 - 例如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?我非常感谢任何帮助

2 个答案:

答案 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)

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

修改了sudoers

www-data hostname =(ALL)NOPASSWD:ALL 默认值!requiretty

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

我尝试用NOPASSWD替换NOPASSWD:ALL:/ path / to / script但是这不起作用,因为预期的是NOPASSWD:application。

如果有人能提出一种能提供更安全解决方案的方法,那么我将非常感激。