如何启用docker API通过http访问

时间:2016-01-19 03:36:12

标签: php ubuntu curl docker

我试图通过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请求获得任何输出?

我在这里失踪了什么?

4 个答案:

答案 0 :(得分:2)

Ubuntu 15.10是一个使用systemd的系统。 /etc/init/docker.conf文件仅用于使用upstart的系统。

在有关如何在使用systemd的系统上配置守护程序选项的文档中阅读本节:

Custom Docker daemon options

请注意:

  • 端口4243不再是docker的标准端口。使用端口2375(普通)和2376(对于tls)
  • 请注意,任何能够获取API访问权限的人都有效 root权限。因此从不公开不受保护的API

另请注意,对于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/