:title: Remote API v1.5 :description: API Documentation for Docker :keywords: API, Docker, rcli, REST, documentation :orphan: ====================== Docker Remote API v1.5 ====================== .. contents:: Table of Contents 1. Brief introduction ===================== - The Remote API is replacing rcli - Default port in the docker daemon is 4243 - The API tends to be REST, but for some complex commands, like attach or pull, the HTTP connection is hijacked to transport stdout stdin and stderr 2. Endpoints ============ 2.1 Containers -------------- List containers *************** .. http:get:: /containers/json List containers **Example request**: .. sourcecode:: http GET /containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json [ { "Id": "8dfafdbc3a40", "Image": "ubuntu:latest", "Command": "echo 1", "Created": 1367854155, "Status": "Exit 0", "Ports":[{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], "SizeRw":12288, "SizeRootFs":0 }, { "Id": "9cd87474be90", "Image": "ubuntu:latest", "Command": "echo 222222", "Created": 1367854155, "Status": "Exit 0", "Ports":[], "SizeRw":12288, "SizeRootFs":0 }, { "Id": "3176a2479c92", "Image": "centos:latest", "Command": "echo 3333333333333333", "Created": 1367854154, "Status": "Exit 0", "Ports":[], "SizeRw":12288, "SizeRootFs":0 }, { "Id": "4cb07b47f9fb", "Image": "fedora:latest", "Command": "echo 444444444444444444444444444444444", "Created": 1367854152, "Status": "Exit 0", "Ports":[], "SizeRw":12288, "SizeRootFs":0 } ] :query all: 1/True/true or 0/False/false, Show all containers. Only running containers are shown by default :query limit: Show ``limit`` last created containers, include non-running ones. :query since: Show only containers created since Id, include non-running ones. :query before: Show only containers created before Id, include non-running ones. :query size: 1/True/true or 0/False/false, Show the containers sizes :statuscode 200: no error :statuscode 400: bad parameter :statuscode 500: server error Create a container ****************** .. http:post:: /containers/create Create a container **Example request**: .. sourcecode:: http POST /containers/create HTTP/1.1 Content-Type: application/json { "Hostname":"", "User":"", "Memory":0, "MemorySwap":0, "AttachStdin":false, "AttachStdout":true, "AttachStderr":true, "PortSpecs":null, "Privileged": false, "Tty":false, "OpenStdin":false, "StdinOnce":false, "Env":null, "Cmd":[ "date" ], "Dns":null, "Image":"ubuntu", "Volumes":{}, "VolumesFrom":"", "WorkingDir":"" } **Example response**: .. sourcecode:: http HTTP/1.1 201 OK Content-Type: application/json { "Id":"e90e34656806" "Warnings":[] } :jsonparam config: the container's configuration :statuscode 201: no error :statuscode 404: no such container :statuscode 406: impossible to attach (container not running) :statuscode 500: server error Inspect a container ******************* .. http:get:: /containers/(id)/json Return low-level information on the container ``id`` **Example request**: .. sourcecode:: http GET /containers/4fa6e0f0c678/json HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "Id": "4fa6e0f0c6786287e131c3852c58a2e01cc697a68231826813597e4994f1d6e2", "Created": "2013-05-07T14:51:42.041847+02:00", "Path": "date", "Args": [], "Config": { "Hostname": "4fa6e0f0c678", "User": "", "Memory": 0, "MemorySwap": 0, "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "PortSpecs": null, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": null, "Cmd": [ "date" ], "Dns": null, "Image": "ubuntu", "Volumes": {}, "VolumesFrom": "", "WorkingDir":"" }, "State": { "Running": false, "Pid": 0, "ExitCode": 0, "StartedAt": "2013-05-07T14:51:42.087658+02:01360", "Ghost": false }, "Image": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", "NetworkSettings": { "IpAddress": "", "IpPrefixLen": 0, "Gateway": "", "Bridge": "", "PortMapping": null }, "SysInitPath": "/home/kitty/go/src/github.com/dotcloud/docker/bin/docker", "ResolvConfPath": "/etc/resolv.conf", "Volumes": {} } :statuscode 200: no error :statuscode 404: no such container :statuscode 500: server error List processes running inside a container ***************************************** .. http:get:: /containers/(id)/top List processes running inside the container ``id`` **Example request**: .. sourcecode:: http GET /containers/4fa6e0f0c678/top HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "Titles":[ "USER", "PID", "%CPU", "%MEM", "VSZ", "RSS", "TTY", "STAT", "START", "TIME", "COMMAND" ], "Processes":[ ["root","20147","0.0","0.1","18060","1864","pts/4","S","10:06","0:00","bash"], ["root","20271","0.0","0.0","4312","352","pts/4","S+","10:07","0:00","sleep","10"] ] } :query ps_args: ps arguments to use (eg. aux) :statuscode 200: no error :statuscode 404: no such container :statuscode 500: server error Inspect changes on a container's filesystem ******************************************* .. http:get:: /containers/(id)/changes Inspect changes on container ``id`` 's filesystem **Example request**: .. sourcecode:: http GET /containers/4fa6e0f0c678/changes HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json [ { "Path":"/dev", "Kind":0 }, { "Path":"/dev/kmsg", "Kind":1 }, { "Path":"/test", "Kind":1 } ] :statuscode 200: no error :statuscode 404: no such container :statuscode 500: server error Export a container ****************** .. http:get:: /containers/(id)/export Export the contents of container ``id`` **Example request**: .. sourcecode:: http GET /containers/4fa6e0f0c678/export HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/octet-stream {{ STREAM }} :statuscode 200: no error :statuscode 404: no such container :statuscode 500: server error Start a container ***************** .. http:post:: /containers/(id)/start Start the container ``id`` **Example request**: .. sourcecode:: http POST /containers/(id)/start HTTP/1.1 Content-Type: application/json { "Binds":["/tmp:/tmp"], "LxcConf":[{"Key":"lxc.utsname","Value":"docker"}] } **Example response**: .. sourcecode:: http HTTP/1.1 204 No Content Content-Type: text/plain :jsonparam hostConfig: the container's host configuration (optional) :statuscode 204: no error :statuscode 404: no such container :statuscode 500: server error Stop a container **************** .. http:post:: /containers/(id)/stop Stop the container ``id`` **Example request**: .. sourcecode:: http POST /containers/e90e34656806/stop?t=5 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 204 OK :query t: number of seconds to wait before killing the container :statuscode 204: no error :statuscode 404: no such container :statuscode 500: server error Restart a container ******************* .. http:post:: /containers/(id)/restart Restart the container ``id`` **Example request**: .. sourcecode:: http POST /containers/e90e34656806/restart?t=5 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 204 OK :query t: number of seconds to wait before killing the container :statuscode 204: no error :statuscode 404: no such container :statuscode 500: server error Kill a container **************** .. http:post:: /containers/(id)/kill Kill the container ``id`` **Example request**: .. sourcecode:: http POST /containers/e90e34656806/kill HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 204 OK :statuscode 204: no error :statuscode 404: no such container :statuscode 500: server error Attach to a container ********************* .. http:post:: /containers/(id)/attach Attach to the container ``id`` **Example request**: .. sourcecode:: http POST /containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/vnd.docker.raw-stream {{ STREAM }} :query logs: 1/True/true or 0/False/false, return logs. Default false :query stream: 1/True/true or 0/False/false, return stream. Default false :query stdin: 1/True/true or 0/False/false, if stream=true, attach to stdin. Default false :query stdout: 1/True/true or 0/False/false, if logs=true, return stdout log, if stream=true, attach to stdout. Default false :query stderr: 1/True/true or 0/False/false, if logs=true, return stderr log, if stream=true, attach to stderr. Default false :statuscode 200: no error :statuscode 400: bad parameter :statuscode 404: no such container :statuscode 500: server error Wait a container **************** .. http:post:: /containers/(id)/wait Block until container ``id`` stops, then returns the exit code **Example request**: .. sourcecode:: http POST /containers/16253994b7c4/wait HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json {"StatusCode":0} :statuscode 200: no error :statuscode 404: no such container :statuscode 500: server error Remove a container ******************* .. http:delete:: /containers/(id) Remove the container ``id`` from the filesystem **Example request**: .. sourcecode:: http DELETE /containers/16253994b7c4?v=1 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 204 OK :query v: 1/True/true or 0/False/false, Remove the volumes associated to the container. Default false :statuscode 204: no error :statuscode 400: bad parameter :statuscode 404: no such container :statuscode 500: server error Copy files or folders from a container ************************************** .. http:post:: /containers/(id)/copy Copy files or folders of container ``id`` **Example request**: .. sourcecode:: http POST /containers/4fa6e0f0c678/copy HTTP/1.1 Content-Type: application/json { "Resource":"test.txt" } **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/octet-stream {{ STREAM }} :statuscode 200: no error :statuscode 404: no such container :statuscode 500: server error 2.2 Images ---------- List Images *********** .. http:get:: /images/(format) List images ``format`` could be json or viz (json default) **Example request**: .. sourcecode:: http GET /images/json?all=0 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json [ { "Repository":"ubuntu", "Tag":"precise", "Id":"b750fe79269d", "Created":1364102658, "Size":24653, "VirtualSize":180116135 }, { "Repository":"ubuntu", "Tag":"12.04", "Id":"b750fe79269d", "Created":1364102658, "Size":24653, "VirtualSize":180116135 } ] **Example request**: .. sourcecode:: http GET /images/viz HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: text/plain digraph docker { "d82cbacda43a" -> "074be284591f" "1496068ca813" -> "08306dc45919" "08306dc45919" -> "0e7893146ac2" "b750fe79269d" -> "1496068ca813" base -> "27cf78414709" [style=invis] "f71189fff3de" -> "9a33b36209ed" "27cf78414709" -> "b750fe79269d" "0e7893146ac2" -> "d6434d954665" "d6434d954665" -> "d82cbacda43a" base -> "e9aa60c60128" [style=invis] "074be284591f" -> "f71189fff3de" "b750fe79269d" [label="b750fe79269d\nubuntu",shape=box,fillcolor="paleturquoise",style="filled,rounded"]; "e9aa60c60128" [label="e9aa60c60128\ncentos",shape=box,fillcolor="paleturquoise",style="filled,rounded"]; "9a33b36209ed" [label="9a33b36209ed\nfedora",shape=box,fillcolor="paleturquoise",style="filled,rounded"]; base [style=invisible] } :query all: 1/True/true or 0/False/false, Show all containers. Only running containers are shown by default :statuscode 200: no error :statuscode 400: bad parameter :statuscode 500: server error Create an image *************** .. http:post:: /images/create Create an image, either by pull it from the registry or by importing it **Example request**: .. sourcecode:: http POST /images/create?fromImage=ubuntu HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json {"status":"Pulling..."} {"status":"Pulling", "progress":"1/? (n/a)"} {"error":"Invalid..."} ... When using this endpoint to pull an image from the registry, the ``X-Registry-Auth`` header can be used to include a base64-encoded AuthConfig object. :query fromImage: name of the image to pull :query fromSrc: source to import, - means stdin :query repo: repository :query tag: tag :query registry: the registry to pull from :statuscode 200: no error :statuscode 500: server error Insert a file in an image ************************* .. http:post:: /images/(name)/insert Insert a file from ``url`` in the image ``name`` at ``path`` **Example request**: .. sourcecode:: http POST /images/test/insert?path=/usr&url=myurl HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json {"status":"Inserting..."} {"status":"Inserting", "progress":"1/? (n/a)"} {"error":"Invalid..."} ... :statuscode 200: no error :statuscode 500: server error Inspect an image **************** .. http:get:: /images/(name)/json Return low-level information on the image ``name`` **Example request**: .. sourcecode:: http GET /images/centos/json HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "id":"b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", "parent":"27cf784147099545", "created":"2013-03-23T22:24:18.818426-07:00", "container":"3d67245a8d72ecf13f33dffac9f79dcdf70f75acb84d308770391510e0c23ad0", "container_config": { "Hostname":"", "User":"", "Memory":0, "MemorySwap":0, "AttachStdin":false, "AttachStdout":false, "AttachStderr":false, "PortSpecs":null, "Tty":true, "OpenStdin":true, "StdinOnce":false, "Env":null, "Cmd": ["/bin/bash"] ,"Dns":null, "Image":"centos", "Volumes":null, "VolumesFrom":"", "WorkingDir":"" }, "Size": 6824592 } :statuscode 200: no error :statuscode 404: no such image :statuscode 500: server error Get the history of an image *************************** .. http:get:: /images/(name)/history Return the history of the image ``name`` **Example request**: .. sourcecode:: http GET /images/fedora/history HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json [ { "Id":"b750fe79269d", "Created":1364102658, "CreatedBy":"/bin/bash" }, { "Id":"27cf78414709", "Created":1364068391, "CreatedBy":"" } ] :statuscode 200: no error :statuscode 404: no such image :statuscode 500: server error Push an image on the registry ***************************** .. http:post:: /images/(name)/push Push the image ``name`` on the registry **Example request**: .. sourcecode:: http POST /images/test/push HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json {"status":"Pushing..."} {"status":"Pushing", "progress":"1/? (n/a)"} {"error":"Invalid..."} ... The ``X-Registry-Auth`` header can be used to include a base64-encoded AuthConfig object. :query registry: the registry you wan to push, optional :statuscode 200: no error :statuscode 404: no such image :statuscode 500: server error Tag an image into a repository ****************************** .. http:post:: /images/(name)/tag Tag the image ``name`` into a repository **Example request**: .. sourcecode:: http POST /images/test/tag?repo=myrepo&force=0 HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK :query repo: The repository to tag in :query force: 1/True/true or 0/False/false, default false :statuscode 200: no error :statuscode 400: bad parameter :statuscode 404: no such image :statuscode 409: conflict :statuscode 500: server error Remove an image *************** .. http:delete:: /images/(name) Remove the image ``name`` from the filesystem **Example request**: .. sourcecode:: http DELETE /images/test HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-type: application/json [ {"Untagged":"3e2f21a89f"}, {"Deleted":"3e2f21a89f"}, {"Deleted":"53b4f83ac9"} ] :statuscode 200: no error :statuscode 404: no such image :statuscode 409: conflict :statuscode 500: server error Search images ************* .. http:get:: /images/search Search for an image in the docker index **Example request**: .. sourcecode:: http GET /images/search?term=sshd HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json [ { "Name":"cespare/sshd", "Description":"" }, { "Name":"johnfuller/sshd", "Description":"" }, { "Name":"dhrp/mongodb-sshd", "Description":"" } ] :query term: term to search :statuscode 200: no error :statuscode 500: server error 2.3 Misc -------- Build an image from Dockerfile via stdin **************************************** .. http:post:: /build Build an image from Dockerfile via stdin **Example request**: .. sourcecode:: http POST /build HTTP/1.1 {{ STREAM }} **Example response**: .. sourcecode:: http HTTP/1.1 200 OK {{ STREAM }} The stream must be a tar archive compressed with one of the following algorithms: identity (no compression), gzip, bzip2, xz. The archive must include a file called `Dockerfile` at its root. It may include any number of other files, which will be accessible in the build context (See the ADD build command). The Content-type header should be set to "application/tar". :query t: repository name (and optionally a tag) to be applied to the resulting image in case of success :query q: suppress verbose build output :query nocache: do not use the cache when building the image :query rm: remove intermediate containers after a successful build :statuscode 200: no error :statuscode 500: server error Check auth configuration ************************ .. http:post:: /auth Get the default username and email **Example request**: .. sourcecode:: http POST /auth HTTP/1.1 Content-Type: application/json { "username":"hannibal", "password:"xxxx", "email":"hannibal@a-team.com", "serveraddress":"https://index.docker.io/v1/" } **Example response**: .. sourcecode:: http HTTP/1.1 200 OK :statuscode 200: no error :statuscode 204: no error :statuscode 500: server error Display system-wide information ******************************* .. http:get:: /info Display system-wide information **Example request**: .. sourcecode:: http GET /info HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "Containers":11, "Images":16, "Debug":false, "NFd": 11, "NGoroutines":21, "MemoryLimit":true, "SwapLimit":false, "IPv4Forwarding":true } :statuscode 200: no error :statuscode 500: server error Show the docker version information *********************************** .. http:get:: /version Show the docker version information **Example request**: .. sourcecode:: http GET /version HTTP/1.1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "Version":"0.2.2", "GitCommit":"5a2a5cc+CHANGES", "GoVersion":"go1.0.3" } :statuscode 200: no error :statuscode 500: server error Create a new image from a container's changes ********************************************* .. http:post:: /commit Create a new image from a container's changes **Example request**: .. sourcecode:: http POST /commit?container=44c004db4b17&m=message&repo=myrepo HTTP/1.1 Content-Type: application/json { "Cmd": ["cat", "/world"], "PortSpecs":["22"] } **Example response**: .. sourcecode:: http HTTP/1.1 201 OK Content-Type: application/vnd.docker.raw-stream {"Id":"596069db4bf5"} :query container: source container :query repo: repository :query tag: tag :query m: commit message :query author: author (eg. "John Hannibal Smith ") :statuscode 201: no error :statuscode 404: no such container :statuscode 500: server error Monitor Docker's events *********************** .. http:get:: /events Get events from docker, either in real time via streaming, or via polling (using `since`) **Example request**: .. sourcecode:: http POST /events?since=1374067924 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json {"status":"create","id":"dfdf82bd3881","from":"ubuntu:latest","time":1374067924} {"status":"start","id":"dfdf82bd3881","from":"ubuntu:latest","time":1374067924} {"status":"stop","id":"dfdf82bd3881","from":"ubuntu:latest","time":1374067966} {"status":"destroy","id":"dfdf82bd3881","from":"ubuntu:latest","time":1374067970} :query since: timestamp used for polling :statuscode 200: no error :statuscode 500: server error 3. Going further ================ 3.1 Inside 'docker run' ----------------------- Here are the steps of 'docker run' : * Create the container * If the status code is 404, it means the image doesn't exists: * Try to pull it * Then retry to create the container * Start the container * If you are not in detached mode: * Attach to the container, using logs=1 (to have stdout and stderr from the container's start) and stream=1 * If in detached mode or only stdin is attached: * Display the container's id 3.2 Hijacking ------------- In this version of the API, /attach, uses hijacking to transport stdin, stdout and stderr on the same socket. This might change in the future. 3.3 CORS Requests ----------------- To enable cross origin requests to the remote api add the flag "-api-enable-cors" when running docker in daemon mode. .. code-block:: bash docker -d -H="192.168.1.9:4243" -api-enable-cors