使用docker API启动容器

我正在尝试使用Docker REST API部署容器。 我能够创build一个本地图像,并创build一个容器。 但是,在启动容器的时候,我收到以下错误:

{"message":"starting container with non-empty request body was deprecated since v1.10 and removed in v1.12"} 

start请求的dockerd日志是:

  err-code: 400 time="2017-06-13T07:33:12.679308012Z" level=debug msg="Calling POST /containers/67cf42e1cb92c754ec00a7ec6e02d22ef5ab2267406d7749a85e983481fc0c03/start" time="2017-06-13T07:33:12.679451206Z" level=debug msg="form data: {\"Binds\":[],\"PublishAllPorts\":true}" 

发送空的请求体后,我从dockerd得到以下错误日志:

  err-code: 404 (no such container - https://docs.docker.com/engine/api/v1.19/#2-endpoints) time="2017-06-13T07:54:16.483161021Z" level=debug msg="Calling POST /containers/dbaabc5f437f/start" time="2017-06-13T07:42:34.237522360Z" level=error msg="Create container failed with error: oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"None\\\": executable file not found in $PATH\"\n" 

在服务器上的docker ps的输出是:

  $ docker -H=<host-name>:2376 ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dbaabc5f437f tomcat:8.0 "None" 7 seconds ago Created my_tomcat_container_rnixfw 

我没有意识到,在创build容器时,我应该通过命令来执行。 Dockerfile具有CMD行,但显然如果必须使用REST API启动容器,则必须明确传递要执行的命令。

不知道这是一个预期的行为或docker引擎中的错误。

 time="2017-06-13T08:15:22.920664416Z" level=debug msg="Calling POST /containers/create?name=my_tomcat_container_ooztsn" time="2017-06-13T08:15:22.920815655Z" level=debug msg="form data: {\"AttachStderr\":true,\"AttachStdin\":true,\"AttachStdout\":true,**\"Cmd\":[\"catalina.sh\",\"run\"]**,\"CpuShares\":null,\"Dns\":null,\"Domainname\":null,\"Entrypoint\":null,\"Env\":null,\"ExposedPorts\":null,\"Hostname\":null,\"Image\":\"tomcat:latest\",\"Memory\":0,\"MemorySwap\":0,\"NetworkDisabled\":false,\"OpenStdin\":true,\"PortBindings\":{},\"PublishAllPorts\":true,\"StdinOnce\":false,\"Tty\":true,\"User\":\"\",\"Volumes\":null,\"VolumesFrom\":null,\"WorkingDir\":\"\"}" 

有关configurationdocker守护进程端口的更多详细信息, 请参阅configure-docker-daemon-port

一旦configuration了Docker端口,就可以访问远程主机中的Docker API。

JSONinput文件:

API来创build一个容器:

 curl -X POST http://192.168.56.101:6000/containers/create -d @container_create.json --header "Content-Type: application/json" | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 602 100 90 100 512 1737 9883 --:--:-- --:--:-- --:--:-- 10039 { "Warnings": null, "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940" } 

生成的ID是容器ID,状态不会被激活/运行。

用于启动创build的容器的API。

 # curl -X POST http://192.168.56.101:6000/containers/f5d3273e48350/start | jq . % Total % Received % Xferd Average Speed Time Time Time Current 

API来检查状态/检查容器:

 # curl -X GET http://192.168.56.101:6000/containers/f5d3273e48350/json | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 4076 0 4076 0 0 278k 0 --:--:-- --:--:-- --:--:-- 306k { "NetworkSettings": { "Networks": { "bridge": { "MacAddress": "02:42:ac:11:00:03", "GlobalIPv6PrefixLen": 0, "GlobalIPv6Address": "", "IPv6Gateway": "", "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "689d6b65ce1b06c93b2c70f41760a3e7fb2b50697d71cd9c1f39c64c865e5fa6", "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16 } }, "MacAddress": "02:42:ac:11:00:03", "SecondaryIPAddresses": null, "SandboxKey": "/var/run/docker/netns/24a031d9dfda", "Ports": { "0/tcp": null }, "LinkLocalIPv6PrefixLen": 0, "LinkLocalIPv6Address": "", "HairpinMode": false, "SandboxID": "24a031d9dfda70026a875f4841269c5e790b12ccafcc11869111faa240020b99", "Bridge": "", "SecondaryIPv6Addresses": null, "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "" }, }, "AttachStderr": true, "AttachStdout": true, "AttachStdin": true, "User": "", "Domainname": "", "Hostname": "f5d3273e4835", "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "ArgsEscaped": true, "Image": "ubuntu:14.04", <*************REMOVING THE OUTPUT CONTENT********> "ExecIDs": null, "HostnamePath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hostname", "ResolvConfPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/resolv.conf", "Image": "sha256:132b7427a3b40f958aaeae8716e0cbb2177658d2410554ed142e583ef522309f", "State": { "FinishedAt": "0001-01-01T00:00:00Z", "StartedAt": "2017-06-09T06:53:45.120357144Z", "Error": "", "Status": "running", "Running": true, "Paused": false, "Restarting": false, "Path": "/bin/bash", "Created": "2017-06-09T06:52:51.820429355Z", "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940", "HostsPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hosts", "LogPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940-json.log", "Name": "/objective_bartik", "RestartCount": 0, "Driver": "aufs", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "docker-default" } 

参考这个更多的信息:

如何使用Docker API构build图像?

如何使用API​​提交Docker容器

希望这个信息对他有帮助。

我可以通过运行以下命令来重现已经布置的问题:

 curl -v -d "{\"Binds\":[],\"PublishAllPorts\":true}" --unix-socket /var/run/docker.sock http://localhost/v1.27/containers/0df187bd421a/start * Trying /var/run/docker.sock... * Connected to localhost (/var/run/docker.sock) port 80 (#0) > POST /v1.27/containers/0df187bd421a/start HTTP/1.1 > Host: localhost > User-Agent: curl/7.53.0 > Accept: */* > Content-Length: 35 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 35 out of 35 bytes < HTTP/1.1 400 Bad Request < Api-Version: 1.29 < Content-Type: application/json < Docker-Experimental: false < Ostype: linux < Server: Docker/17.05.0-ce (linux) < Date: Tue, 13 Jun 2017 15:57:12 GMT < Content-Length: 109 < {"message":"starting container with non-empty request body was deprecated since v1.10 and removed in v1.12"} * Connection #0 to host localhost left intact 

这个错误信息是相对简单的。 试图启动一个容器时,我不应该包括任何东西,只是空的身体。 我可以调整命令发送一个空的身体,我可以启动我的容器:

 curl -v -d '' --unix-socket /var/run/docker.sock http://localhost/v1.27/containers/0df187bd421a/start * Trying /var/run/docker.sock... * Connected to localhost (/var/run/docker.sock) port 80 (#0) > POST /v1.27/containers/0df187bd421a/start HTTP/1.1 > Host: localhost > User-Agent: curl/7.53.0 > Accept: */* > Content-Length: 0 > Content-Type: application/x-www-form-urlencoded > < HTTP/1.1 204 No Content < Api-Version: 1.29 < Docker-Experimental: false < Ostype: linux < Server: Docker/17.05.0-ce (linux) < Date: Tue, 13 Jun 2017 15:59:20 GMT < * Connection #0 to host localhost left intact 

这个问题也在这个github问题中讨论: https : //github.com/moby/moby/issues/25667

简短的答案是确保在容器创build时传递适当的configuration,然后在调用POST /v1.27/containers/<container>/start api端点时传递空的正文。

在快速仪表板中 ,您可以应用几个步骤来启动并logging容器。

在开始快速的用户界面之后

 $ docker run -d --name rapid \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 8080:8080 \ ozlerhakan/rapid 

您可以键入以下步骤来执行此操作:

 POST images/create?fromImage=ubuntu&tag=latest POST containers/create?name=mycontainer { "Cmd": [ "date" ], "Entrypoint": "", "Image": "ubuntu" } POST containers/mycontainer/start GET containers/mycontainer/logs?stdout=true&tail=all 

以上所有命令都可以转换为有效的cURL命令:

 curl --unix-socket /var/run/docker.sock -XPOST "http:/v1.30/images/create?fromImage=ubuntu&tag=latest" curl --unix-socket /var/run/docker.sock -XPOST "http:/v1.30/containers/create?name=mycontainer" -H "Content-Type: application/json" -d' { "Cmd": [ "date" ], "Entrypoint": "", "Image": "ubuntu" }' curl --unix-socket /var/run/docker.sock -XPOST "http:/v1.30/containers/mycontainer/start" GET containers/mycontainer/logs?stdout=true&tail=all curl --unix-socket /var/run/docker.sock -XGET "http:/v1.30/containers/mycontainer/logs?stdout=true&tail=all"