使用Docker REST API运行带有参数的容器

我正在使用Docker Engine API,我希望能够模仿Docker docker run

我在这个链接中看到了一些关于这个的注释,但没有具体的例子来传递参数。 例如,我怎样才能重现以下内容

docker run -d -p 27017:27017 -p 28017:28017 tutum/mongodb

使用REST API?

找出这个问题的一个方法就是在命令本身上运行strace:

 $ sudo strace -e write \ -o /tmp/docker.strace \ -s 10000 \ -f docker run -d -p 27017:27017 -p 28017:28017 tutum/mongodb 

在文件/tmp/docker.strace ,你会看到:

 10911 write(3, "POST /v1.25/containers/create HTTP/1.1\r\nHost: docker\r\nUser-Agent: Docker-Client/1.13.0 (linux)\r\nContent-Length: 1551\r\nContent-Type: application/json\r\n\r\n{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"ExposedPorts\":{\"27017/tcp\":{},\"28017/tcp\":{}},\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[],\"Cmd\":null,\"Image\":\"tutum/mongodb\",\"Volumes\":{},\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{},\"HostConfig\":{\"Binds\":null,\"ContainerIDFile\":\"\",\"LogConfig\":{\"Type\":\"\",\"Config\":{}},\"NetworkMode\":\"default\",\"PortBindings\":{\"27017/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"27017\"}],\"28017/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"28017\"}]},\"RestartPolicy\":{\"Name\":\"no\",\"MaximumRetryCount\":0},\"AutoRemove\":false,\"VolumeDriver\":\"\",\"VolumesFrom\":null,\"CapAdd\":null,\"CapDrop\":null,\"Dns\":[],\"DnsOptions\":[],\"DnsSearch\":[],\"ExtraHosts\":null,\"GroupAdd\":null,\"IpcMode\":\"\",\"Cgroup\":\"\",\"Links\":null,\"OomScoreAdj\":0,\"PidMode\":\"\",\"Privileged\":false,\"PublishAllPorts\":false,\"ReadonlyRootfs\":false,\"SecurityOpt\":null,\"UTSMode\":\"\",\"UsernsMode\":\"\",\"ShmSize\":0,\"ConsoleSize\":[0,0],\"Isolation\":\"\",\"CpuShares\":0,\"Memory\":0,\"NanoCpus\":0,\"CgroupParent\":\"\",\"BlkioWeight\":0,\"BlkioWeightDevice\":null,\"BlkioDeviceReadBps\":null,\"BlkioDeviceWriteBps\":null,\"BlkioDeviceReadIOps\":null,\"BlkioDeviceWriteIOps\":null,\"CpuPeriod\":0,\"CpuQuota\":0,\"CpuRealtimePeriod\":0,\"CpuRealtimeRuntime\":0,\"CpusetCpus\":\"\",\"CpusetMems\":\"\",\"Devices\":[],\"DiskQuota\":0,\"KernelMemory\":0,\"MemoryReservation\":0,\"MemorySwap\":0,\"MemorySwappiness\":-1,\"OomKillDisable\":false,\"PidsLimit\":0,\"Ulimits\":null,\"CpuCount\":0,\"CpuPercent\":0,\"IOMaximumIOps\":0,\"IOMaximumBandwidth\":0},\"NetworkingConfig\":{\"EndpointsConfig\":{}}}\n", 1703) = 1703 ... 10914 write(5, "POST /v1.25/containers/42844726d8bd925d9903a0922f380c295dd398475b779d7ae2099ec2b4ab494e/start HTTP/1.1\r\nHost: docker\r\nUser-Agent: Docker-Client/1.13.0 (linux)\r\nContent-Length: 0\r\nContent-Type: text/plain\r\n\r\n", 207) = 207 

第一个POST请求(用于容器创build),采用漂亮的forms:

 POST /v1.25/containers/create HTTP/1.1 Host: docker User-Agent: Docker-Client/1.13.0 (linux) Content-Length: 1551 Content-Type: application/json { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "27017/tcp": {}, "28017/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [], "Cmd": null, "Image": "tutum/mongodb", "Volumes": {}, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {}, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "", "Config": {} }, "NetworkMode": "default", "PortBindings": { "27017/tcp": [ { "HostIp": "", "HostPort": "27017" } ], "28017/tcp": [ { "HostIp": "", "HostPort": "28017" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 0, "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": null, "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": -1, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "NetworkingConfig": { "EndpointsConfig": {} } } 

现在,有很多默认值。 让我们删除它们,并创build一个最小集合,在这种情况下是:

 { "ExposedPorts": { "27017/tcp": {}, "28017/tcp": {} }, "Image": "tutum/mongodb", "HostConfig": { "PortBindings": { "27017/tcp": [ { "HostIp": "", "HostPort": "27017" } ], "28017/tcp": [ { "HostIp": "", "HostPort": "28017" } ] } } } 

现在,让我们尝试创build容器,并使用REST API自己启动它。

 $ sudo curl -v -H "Content-Type: application/json" -d '{"ExposedPorts":{"27017/tcp":{},"28017/tcp":{}},"Image":"tutum/mongodb","HostConfig":{"PortBindings":{"27017/tcp":[{"HostIp":"","HostPort": "27017"}],"28017/tcp":[{"HostIp":"","HostPort":"28017"}]}}}' --unix-socket /var/run/docker.sock http://docker/containers/create * Trying /var/run/docker.sock... * Connected to docker (/var/run/docker.sock) port 80 (#0) > POST /containers/create HTTP/1.1 > Host: docker > User-Agent: curl/7.50.3 > Accept: */* > Content-Type: application/json > Content-Length: 198 > * upload completely sent off: 198 out of 198 bytes < HTTP/1.1 201 Created < Api-Version: 1.25 < Content-Type: application/json < Docker-Experimental: false < Server: Docker/1.13.0 (linux) < Date: Tue, 31 Jan 2017 05:03:34 GMT < Content-Length: 90 < {"Id":"be10c2bb8f07e36717a10cdf102a304aaf2ee072661df0265e322bdeb5fc1d78","Warnings":null} * Curl_http_done: called premature == 0 * Connection #0 to host docker left intact 

确认容器已经被创build:

 $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES be10c2bb8f07 tutum/mongodb "/run.sh" About a minute ago Created inspiring_shannon 

现在,让我们开始容器。 从strace输出中,我们现在知道那个端点是/containers/UUID/start ,HTTP方法是POST ,我们也知道前一个curl命令输出的容器UUID

 $ sudo curl -X POST -v --unix-socket /var/run/docker.sock http://docker/containers/be10c2bb8f07e36717a10cdf102a304aaf2ee072661df0265e322bdeb5fc1d78/start * Trying /var/run/docker.sock... * Connected to docker (/var/run/docker.sock) port 80 (#0) > POST /containers/be10c2bb8f07e36717a10cdf102a304aaf2ee072661df0265e322bdeb5fc1d78/start HTTP/1.1 > Host: docker > User-Agent: curl/7.50.3 > Accept: */* > < HTTP/1.1 204 No Content < Api-Version: 1.25 < Docker-Experimental: false < Server: Docker/1.13.0 (linux) < Date: Tue, 31 Jan 2017 05:05:46 GMT < * Curl_http_done: called premature == 0 * Connection #0 to host docker left intact 

我们来validation容器确实在运行。

 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES be10c2bb8f07 tutum/mongodb "/run.sh" 2 minutes ago Up 8 seconds 0.0.0.0:27017->27017/tcp, 0.0.0.0:28017->28017/tcp inspiring_shannon 

仅供参考,如果您不想在每次查找参数时都保持运行strace,则API文档非常有用。 也许他们也应该包括一些例子。 🙂