標籤:

Docker Remote API 如何使用?

docker 的 Remote API 定義如下:

這個API看著是http協議的但是我用 curl http://127.0.0.1:4243/containers/json 這個命令卻什麼也得不到,我從網上另外搜到的命令 echo -e "GET /images/json HTTP/1.0
" | nc -U /var/run/docker.sock 可以得到所有容器的信息,我想知道如果是 http 協議的介面的話為什麼用 curl 得不到數據?


Docker Remote API是一個取代遠程命令行界面(rcli)的REST API。本文中,我們將使用命令行工具cURL來處理url相關操作。cURL可以發送請求、獲取以及發送數據、檢索信息。具體內容你可以看看這篇文章:Docker入門教程(八)Docker Remote API


你要把 docker daemon 綁定到該埠上。默認情況下,docker daemon使用unix socket(unix:///var/run/docker.sock)

先停止docker daemon再重新啟動:

service docker stop
docker -d -H unix:///var/run/docker.sock -H 0.0.0.0:4243

之後就可以:

curl http://127.0.0.1:4243/containers/json


-----更新----

填坑來了,現在使用docker作為開發環境,操作系統是ubuntu16.10,pycharm中使用remote interpreter,需要用到remote api,結果發現自己的原答案是針對ubuntu 14.04的,ubuntu15及以上版本的可參見Control and configure Docker with systemd,說說主要用到的幾個命令:

# 查看配置文件位於哪裡

systemctl show --property=FragmentPath docker

#編輯配置文件內容,接收所有ip請求

sudo gedit /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376

#重新載入配置文件,重啟docker daemon

sudo systemctl daemon-reload

sudo systemctl restart docker

-----原答案----

docker官方文檔上有相關說明(Configure and run Docker on various distributions),ubuntu上是可行的

sudo vi /etc/default/docker

DOCKER_OPTS="-H tcp://0.0.0.0:2375"

也可以不通過配置,直接用這種方式啟動,這種方式不是以守護式的方式啟動服務的,但是可以通過nohup命令掛起

docker daemon -H=0.0.0.0:2375

在win平台上好像目前還不支持docker通過http訪問,不過可以通過tcp訪問(我使用pycharm可以直接連接docker的服務端)


在centos7.2下,可以進行這樣的操作:

直接在ExecStart=/usr/bin/dockerd後面增加需要的啟動參數即可。我這裡增加了DockerHub鏡像加速地址和開啟了tcp連接(--registry-mirror=https://xxoo.mirror.acs.aliyun.com -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock)

vim /etc/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --registry-mirror=https://xxoo.mirror.acs.aliyun.com -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

systemctl daemon-reload

systemctl restart docker


1 修改配置文件
CentOS6:

/etc/sysconfig/docker

添加一行: DOCKER_OPTS=-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

CentOS7:

/usr/lib/systemd/system/docker.service
修改一行:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

2. 重啟Docker
CentOS6: service docker restart

CentOS7:

systemctl daemon-reload

systemctl restart docker.service

3. 測試

在本機 curl http://127.0.0.1:2375/info

在其他機器上:curl http://hostanme:2375/info

*此時本地client可以繼續通過Unix sock與docker daemon通行

例如:docker info 命令繼續有效。


這裡還有一個問題,curl如果想直接與unix socket通信的話,需要添加命令選項,具體你可以查下。


默認以文件socket方式啟動docker的,改成tcp的就可以了


推薦閱讀:

基於OSS搭建私有(跨區域)Docker鏡像倉庫
把docker鏡像當作桌面系統來用
Docker 重要更新: 原生支持多階段構建(multi-stage build)
Docker Remote API 開發(一)
docker的幾點疑問?

TAG:Docker |