2017-01-30 3 views
2

私はDocker Engine APIを使用しており、docker runを模倣できるようにしたいと考えています。Docker REST APIを使用してパラメータを持つコンテナを実行する

私はin this linkを参照してください。ただし、パラメータの受け渡し方法の具体例はありません。例えば、どのように私は、REST APIを使用して、次の

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

を再現することができますか?

+0

[dockerリモートAPIを使用してコンテナを作成する方法は?](http://stackoverflow.com/questions/31381978/how-to-use-docker-remote-api-to-create-コンテナ) – Matt

答えて

3

それを見つけるための一つのハックの方法は、コマンド自体にstraceのを実行することです:ファイル/tmp/docker.strace

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

、あなたが表示されます。

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リクエスト(かなりの形になっています:

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": {} 
    } 
} 

ここでは、多くのデフォルトがありますプレゼント。

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

は今、コンテナを作成し、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 

コンテナが作成されていることを確認します。

$ 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であり、我々はまた、以前のカールコマンドの出力からコンテナ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 

のは、コンテナが実際に実行されていることを確認してみましょう。 FYI

$ 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 documentationは、かなり便利です。おそらく彼らにはまたいくつかの例が含まれているはずです。 :-)

+1

これは信じられないほど良い答えです。ありがとう@Nehal! – nmpg

関連する問題