从 PHP 开始 Docker 个容器

Starting Docker containers from PHP

当我尝试通过 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。为了更好地衡量,我尝试以 sudo 身份运行 docker 命令,但没有任何区别。谷歌搜索“你在尝试......”会出现一些链接,这些链接可能包含一些相关信息 - 例如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

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

我知道该命令会引发类似“每个容器应该只有一个应用程序”这样的评论。这不是这里的问题。

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

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

修改了 sudoers

www-数据主机名=(全部)NOPASSWD:ALL 默认值 !requiretty

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

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

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

我想你可以通过将 www-data 用户添加到 docker 组来解决这个问题。

来自https://docs.docker.com/installation/ubuntulinux/#giving-non-root-access

Giving non-root access

The docker daemon always runs as the root user, and since Docker version 0.5.2, the docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root, and so, by default, you can access it with sudo.

Starting in version 0.5.3, if you (or your Docker installer) create a Unix group called docker and add users to it, then the docker daemon will make the ownership of the Unix socket read/writable by the docker group when the daemon starts. The docker daemon must always run as the root user, but if you run the docker client as a user in the docker group then you don't need to add sudo to all the client commands. As of 0.9.0, you can specify that a group other than docker should own the Unix socket with the -G option.

Example:

  • 添加 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 或记录 out/in 以激活对组的更改。