我试图通过PHP curl请求管理docker。 (使用Ubuntu 15.10)
我已经关注了API文档,但它有点令人困惑,也很少有在线教程,但没有运气。
这是我到目前为止所做的, 停止了docker deamon并添加了
script
/usr/bin/docker -H tcp://127.0.0.1:4243 -d
end script
到
/etc/init/docker.conf
Docker deamon开始了
这是我的PHP脚本
function post_to_url($url, $data, $headers) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout in seconds
curl_setopt($ch, CURLOPT_URL, $url);
if ($headers != '') {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($ch, CURLOPT_POST, 1);
if ($data != '') {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$return = curl_exec($ch);
if ($return == '') {
return curl_getinfo($ch, CURLINFO_HTTP_CODE);
} else {
return $return;
}
curl_close($ch);
}
//Sample API request
echo post_to_url('http://127.0.0.1:4243/containers/json', '', '');
但是我无法通过CURL请求获得任何输出?
我在这里失踪了什么?
答案 0 :(得分:2)
Ubuntu 15.10是一个使用systemd
的系统。 /etc/init/docker.conf
文件仅用于使用upstart的系统。
在有关如何在使用systemd的系统上配置守护程序选项的文档中阅读本节:
请注意:
另请注意,对于docker,有一个(非官方的)PHP客户端库; http://stage1.github.io/docker-php/可能会为您节省大量时间和头痛:)
答案 1 :(得分:1)
我最近遇到了同样的问题。现有的解决方案并没有让我信服,所以我用PHP编写了一个新的Docker API客户端。我还发布了一个docker容器,通过HTTP(jarkt / docker-remote-api)提供API。 访问项目页面,其中包含以下文档:https://github.com/jarkt/docker-php-client
答案 2 :(得分:0)
最后我能够弄明白。
在/etc/defaults/docker
我放
DOCKER_OPTS='-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock'
(使用0.0.0.0而不是127.0.0.1通过任何主机访问API)
我在问题中的PHP函数与REST API不兼容,
所以我使用了以下功能(来源 - This)
// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value
function CallAPI($method, $url, $data = false)
{
$curl = curl_init();
switch ($method)
{
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// Optional Authentication:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
并调用上面的函数 -
echo CallAPI('GET', 'http://127.0.0.1:4243/images/json', $data = false)
它有效!
向公众开放Docker API是一个主要的安全风险,所以我使用了IP地址127.0.0.1而不是0.0.0.0,所以我的PHP脚本仍然可以访问它。
答案 3 :(得分:0)
您可以使用Sherpa通过远程代理打开远程API的路径,而不是更改docker守护程序配置并重新启动它。类似的东西:
docker run -d \
--name sherpa \
-e CONFIG='[
{
"Path" : "/",
"Access": "allow",
"Addresses": ["10.0.0.0/8"]
}
]' \
-v /var/run/docker.sock:/tmp/docker.sock \
-p 4550:4550 \
djenriquez/sherpa --allow
将允许您访问端口4550并仅接受来自10.0.0.0/8空间中的源客户端的请求。您也可以为远程API自定义各种ACL。在此处查看介绍性帖子:https://www.linkedin.com/pulse/easily-enable-docker-remote-api-sherpa-dj-enriquez或直接查看此处的回购:https://hub.docker.com/r/djenriquez/sherpa/