2016-01-19 23 views
2

我想通過PHP curl請求管理碼頭。 (使用Ubuntu 15.10)如何啓用碼頭API通過http訪問

我遵循API文檔,但它有點混亂,也遵循幾個在線教程,但沒有運氣。

這是我迄今所做的, 停止碼頭工人守護進程並添加

script 
    /usr/bin/docker -H tcp://127.0.0.1:4243 -d 
end script 

/etc/init/docker.conf 

碼頭工人守護進程開始

這是我的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

在最後一行,'loclhost'應該可能是'localhost'? :) – morphatic

+0

@morphatic不,這不是問題。我在Docker文檔中使用127.0.0.1 –

+0

嘗試過,我沒有看到任何提到已經添加到'docker.conf'文件腳本中的'-d'標誌。也許你的意思是'-D'。使用錯誤的標誌可能會阻止docker正常啓動。 – morphatic

回答

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腳本仍然可以訪問它。

2

Ubuntu 15.10是一個使用systemd的系統。 /etc/init/docker.conf文件僅用於使用upstart的系統。

閱讀關於如何使用systemd配置系統的後臺程序選項的文檔在本節:

Custom Docker daemon options

請注意:

  • 端口4243已不再是標準端口爲碼頭工人。使用端口2375(普通)和2376(用於tls)
  • 請記住,任何能夠獲得API訪問權限的人都可以在您的主機上有效地使用根權限。所以從未暴露未受保護的API

還要注意,有一個(非官方)PHP客戶端庫,對碼頭工人; http://stage1.github.io/docker-php/,這可以爲您節省大量的時間和頭痛:)

+0

感謝您的答案..順便說一句,我發現併發布解決方案在這裏。 –

1

我最近有同樣的問題。現有的解決方案並沒有讓我信服,所以我用PHP編寫了一個新的Docker API客戶端。我還發布了一個docker容器,通過HTTP提供API(jarkt/docker-remote-api)。 訪問此處的文檔項目頁面:https://github.com/jarkt/docker-php-client

0

而不是更改docker守護進程配置並重新啓動它,您可以使用Sherpa通過遠程代理打開遠程API的路徑。喜歡的東西:

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或直接回購:​​