【问题标题】:Starting Docker containers from PHP从 PHP 启动 Docker 容器
【发布时间】:2015-03-03 04:07:22
【问题描述】:

当我尝试通过 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 命令输出到 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

然后浏览到该容器 - 没问题,一切正常。

我知道该命令将按照“您应该每个容器只有一个应用程序”这样的方式激怒 cmets。这不是这里的问题。

我是在这里尝试不可能的事情,还是有一种相对简单的方法可以通过 PHP 脚本和 shell_exec 来操作 Docker?

【问题讨论】:

  • 你能发布 PHP 中使用的完整命令来启动你的 docker 容器吗?
  • 查看我编辑的问题 - 正如您所见,命令不是问题。从 bash 运行时,它可以毫无问题地完成工作
  • 我猜当你从 bash 成功启动这个命令时,你的用户是 root(或者你有 docker 的别名,比如 sudo docker.io)。当你从 PHP 启动它时,它是用 sudo 启动的吗?
  • www-data是不是类似root(uid,gid)的账号?
  • 你是对的 - 从 bash 我以 root 用户身份运行 docker 命令。从 PHP shell_exec 我以用户 www-data 运行:Ubuntu 上的“标准”apache 用户。你是什​​么意思类似于root。

标签: php shell docker


【解决方案1】:

我认为您可以通过将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 守护进程将使 Unix 套接字的所有权可以由 docker 组读取/写入守护进程启动。 docker 守护程序必须始终以 root 用户身份运行,但如果您以 docker 组中的用户身份运行 docker 客户端,则无需将 sudo 添加到所有客户端命令。从 0.9.0 开始,您可以使用 -G 选项指定 docker 以外的组拥有 Unix 套接字。

示例:

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

     sudo groupadd docker
    
  • 将连接的用户“${USER}”添加到 docker 组。更改用户名以匹配您的首选用户。

     sudo gpasswd -a ${USER} docker
    
  • 重启 Docker 守护进程:

     sudo service docker restart
    
  • 如果您使用的是 Ubuntu 14.04 及更高版本,请改用 docker.io:

     sudo service docker.io restart
    
  • 发送newgrp docker 或注销/登录以激活对组的更改。

【讨论】:

  • 感谢您的回答。可悲的是,它没有任何用处 - error.log 中的消息完全相同 - 所以我坚持使用我的解决方案。
【解决方案2】:

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

www-data 主机名=(ALL)NOPASSWD:ALL 默认值 !requiretty

这为问题提供了完整的解决方案——我现在可以从 PHP 脚本启动 Docker 容器。 Allv 非常好,但我确实担心以这种方式放松 sudoers。这一切发生的环境是可控的,但即便如此,这听起来也不是完美的解决方案。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2015-07-09
    • 2022-01-14
    • 1970-01-01
    • 2018-08-28
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多