From 993854f58fa4132ff82c2e1ffe291d90b301db5a Mon Sep 17 00:00:00 2001 From: Ben Firshman Date: Mon, 21 Nov 2016 15:30:57 +0000 Subject: [PATCH] Move API reference to new location See: https://github.com/docker/docker.github.io/pull/606 Also: - Add missing redirects to API reference pages - Remove v1.25 and 1.26, because they are being replaced with swagger generated docs. - Remove all other docs which aren't reference material, because this can live in docker/docker.github.io Signed-off-by: Ben Firshman --- .../v1.18.md} | 3 + .../v1.19.md} | 3 + .../v1.20.md} | 3 + .../v1.21.md} | 3 + .../v1.22.md} | 3 + .../v1.23.md} | 3 + .../v1.24.md} | 3 + .../version-history.md} | 147 +- docs/reference/api/README.md | 22 - .../_static/io_oauth_authorization_page.png | Bin 39458 -> 0 bytes docs/reference/api/docker-io_api.md | 20 - docs/reference/api/docker_io_accounts_api.md | 281 - docs/reference/api/docker_remote_api_v1.25.md | 6163 ----------------- docs/reference/api/docker_remote_api_v1.26.md | 6162 ---------------- docs/reference/api/hub_registry_spec.md | 23 - docs/reference/api/images/event_state.gliffy | 1 - docs/reference/api/images/event_state.png | Bin 78354 -> 0 bytes docs/reference/api/index.md | 20 - .../api/remote_api_client_libraries.md | 138 - 19 files changed, 32 insertions(+), 12966 deletions(-) rename docs/{reference/api/docker_remote_api_v1.18.md => api/v1.18.md} (99%) rename docs/{reference/api/docker_remote_api_v1.19.md => api/v1.19.md} (99%) rename docs/{reference/api/docker_remote_api_v1.20.md => api/v1.20.md} (99%) rename docs/{reference/api/docker_remote_api_v1.21.md => api/v1.21.md} (99%) rename docs/{reference/api/docker_remote_api_v1.22.md => api/v1.22.md} (99%) rename docs/{reference/api/docker_remote_api_v1.23.md => api/v1.23.md} (99%) rename docs/{reference/api/docker_remote_api_v1.24.md => api/v1.24.md} (99%) rename docs/{reference/api/docker_remote_api.md => api/version-history.md} (75%) delete mode 100644 docs/reference/api/README.md delete mode 100644 docs/reference/api/_static/io_oauth_authorization_page.png delete mode 100644 docs/reference/api/docker-io_api.md delete mode 100644 docs/reference/api/docker_io_accounts_api.md delete mode 100644 docs/reference/api/docker_remote_api_v1.25.md delete mode 100644 docs/reference/api/docker_remote_api_v1.26.md delete mode 100644 docs/reference/api/hub_registry_spec.md delete mode 100644 docs/reference/api/images/event_state.gliffy delete mode 100644 docs/reference/api/images/event_state.png delete mode 100644 docs/reference/api/index.md delete mode 100644 docs/reference/api/remote_api_client_libraries.md diff --git a/docs/reference/api/docker_remote_api_v1.18.md b/docs/api/v1.18.md similarity index 99% rename from docs/reference/api/docker_remote_api_v1.18.md rename to docs/api/v1.18.md index 8a97300ee3..d4b28c53ce 100644 --- a/docs/reference/api/docker_remote_api_v1.18.md +++ b/docs/api/v1.18.md @@ -2,6 +2,9 @@ title: "Remote API v1.18" description: "API Documentation for Docker" keywords: "API, Docker, rcli, REST, documentation" +redirect_from: +- /engine/reference/api/docker_remote_api_v1.18/ +- /reference/api/docker_remote_api_v1.18/ --- -# Docker Remote API - -Docker's Remote API uses an open schema model. In this model, unknown -properties in incoming messages are ignored. Client applications need to take -this behavior into account to ensure they do not break when talking to newer -Docker daemons. - -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. - -By default the Docker daemon listens on `unix:///var/run/docker.sock` and the -client must have `root` access to interact with the daemon. If a group named -`docker` exists on your system, `docker` applies ownership of the socket to the -group. - -To connect to the Docker daemon with cURL you need to use cURL 7.40 or -later, as these versions have the `--unix-socket` flag available. To -run `curl` against the daemon on the default socket, use the -following: - -When using cUrl 7.50 or later: - -```console -$ curl --unix-socket /var/run/docker.sock http://localhost/v1.25/containers/json -``` - -When using cURL 7.40, `localhost` must be omitted: - -```console -$ curl --unix-socket /var/run/docker.sock http://v1.25/containers/json -``` - -If you have bound the Docker daemon to a different socket path or TCP -port, you would reference that in your cURL rather than the -default. - -## Versioning - -It is required to to supply a version to API calls. This is done by prefixing -the URL with the version number. - -The current version of the API is 1.26, so to call the `/info` endpoint, you -would send a request to the URL `/v1.26/info`. To call, for example, version -1.24 of the API instead, you would request `/v1.24/info`. - -If a newer daemon is installed, new properties may be returned even when -calling older versions of the API. - -In previous versions of Docker, it was possible to access the API without -providing a version. This behaviour is now deprecated will be removed in a -future version of Docker. - -Use the table below to find the API version for a Docker version: - -Docker version | API version | Changes -----------------|------------------------------------|------------------------------------------------------ -1.14.x | [1.26](docker_remote_api_v1.26.md) | [API changes](docker_remote_api.md#v1-26-api-changes) -1.13.x | [1.25](docker_remote_api_v1.25.md) | [API changes](docker_remote_api.md#v1-25-api-changes) -1.12.x | [1.24](docker_remote_api_v1.24.md) | [API changes](docker_remote_api.md#v1-24-api-changes) -1.11.x | [1.23](docker_remote_api_v1.23.md) | [API changes](docker_remote_api.md#v1-23-api-changes) -1.10.x | [1.22](docker_remote_api_v1.22.md) | [API changes](docker_remote_api.md#v1-22-api-changes) -1.9.x | [1.21](docker_remote_api_v1.21.md) | [API changes](docker_remote_api.md#v1-21-api-changes) -1.8.x | [1.20](docker_remote_api_v1.20.md) | [API changes](docker_remote_api.md#v1-20-api-changes) -1.7.x | [1.19](docker_remote_api_v1.19.md) | [API changes](docker_remote_api.md#v1-19-api-changes) -1.6.x | [1.18](docker_remote_api_v1.18.md) | [API changes](docker_remote_api.md#v1-18-api-changes) - -Refer to the [GitHub repository]( -https://github.com/docker/docker/tree/master/docs/reference/api) for -older releases. - -## Authentication - -Authentication configuration is handled client side, so the -client has to send the `authConfig` as a `POST` in `/images/(name)/push`. The -`authConfig`, set as the `X-Registry-Auth` header, is currently a Base64 encoded -(JSON) string with the following structure: - -```JSON -{"username": "string", "password": "string", "email": "string", - "serveraddress" : "string", "auth": ""} -``` - -Callers should leave the `auth` empty. The `serveraddress` is a domain/ip -without protocol. Throughout this structure, double quotes are required. - -## Using Docker Machine with the API - -If you are using `docker-machine`, the Docker daemon is on a host that -uses an encrypted TCP socket using TLS. This means, for Docker Machine users, -you need to add extra parameters to `curl` or `wget` when making test -API requests, for example: - -``` -curl --insecure \ - --cert $DOCKER_CERT_PATH/cert.pem \ - --key $DOCKER_CERT_PATH/key.pem \ - https://YOUR_VM_IP:2376/v1.25/images/json - -wget --no-check-certificate --certificate=$DOCKER_CERT_PATH/cert.pem \ - --private-key=$DOCKER_CERT_PATH/key.pem \ - https://YOUR_VM_IP:2376/v1.25/images/json -O - -q -``` - -## Docker Events - -The following diagram depicts the container states accessible through the API. - -![States](images/event_state.png) - -Some container-related events are not affected by container state, so they are not included in this diagram. These events are: - -* **export** emitted by `docker export` -* **exec_create** emitted by `docker exec` -* **exec_start** emitted by `docker exec` after **exec_create** -* **detach** emitted when client is detached from container process -* **exec_detach** emitted when client is detached from exec process - -Running `docker rmi` emits an **untag** event when removing an image name. The `rmi` command may also emit **delete** events when images are deleted by ID directly or by deleting the last tag referring to the image. - -> **Acknowledgment**: This diagram and the accompanying text were used with the permission of Matt Good and Gilder Labs. See Matt's original blog post [Docker Events Explained](https://gliderlabs.com/blog/2015/04/14/docker-events-explained/). - -## Version history - -This section lists each version from latest to oldest. Each listing includes a link to the full documentation set and the changes relevant in that release. - -### v1.26 API changes +## v1.26 API changes [Docker Remote API v1.26](docker_remote_api_v1.26.md) documentation -### v1.25 API changes +## v1.25 API changes [Docker Remote API v1.25](docker_remote_api_v1.25.md) documentation @@ -204,7 +79,7 @@ This section lists each version from latest to oldest. Each listing includes a * `GET /images/json` now support a `reference` filter. -### v1.24 API changes +## v1.24 API changes [Docker Remote API v1.24](docker_remote_api_v1.24.md) documentation @@ -236,7 +111,7 @@ This section lists each version from latest to oldest. Each listing includes a * `POST /containers/create/` `HostConfig.PidMode` field now accepts `container:`, to have the container join the PID namespace of an existing container. -### v1.23 API changes +## v1.23 API changes [Docker Remote API v1.23](docker_remote_api_v1.23.md) documentation @@ -258,7 +133,7 @@ This section lists each version from latest to oldest. Each listing includes a * `GET /containers/(id or name)/logs` now accepts a `details` query parameter to stream the extra attributes that were provided to the containers `LogOpts`, such as environment variables and labels, with the logs. * `POST /images/load` now returns progress information as a JSON stream, and has a `quiet` query parameter to suppress progress details. -### v1.22 API changes +## v1.22 API changes [Docker Remote API v1.22](docker_remote_api_v1.22.md) documentation @@ -292,7 +167,7 @@ This section lists each version from latest to oldest. Each listing includes a * `GET /info` can now return a `SystemStatus` field useful for returning additional information about applications that are built on top of engine. -### v1.21 API changes +## v1.21 API changes [Docker Remote API v1.21](docker_remote_api_v1.21.md) documentation @@ -327,7 +202,7 @@ This section lists each version from latest to oldest. Each listing includes a badness heuristic. This heuristic selects which processes the OOM killer kills under out-of-memory conditions. -### v1.20 API changes +## v1.20 API changes [Docker Remote API v1.20](docker_remote_api_v1.20.md) documentation @@ -339,7 +214,7 @@ endpoint which can be used to download files and directories from a container. * The `hostConfig` option now accepts the field `GroupAdd`, which specifies a list of additional groups that the container process will run as. -### v1.19 API changes +## v1.19 API changes [Docker Remote API v1.19](docker_remote_api_v1.19.md) documentation @@ -355,7 +230,7 @@ end point now returns the new boolean fields `CpuCfsPeriod`, `CpuCfsQuota`, and * The `hostConfig` option now accepts the fields `CpuPeriod` and `CpuQuota` * `POST /build` accepts `cpuperiod` and `cpuquota` options -### v1.18 API changes +## v1.18 API changes [Docker Remote API v1.18](docker_remote_api_v1.18.md) documentation diff --git a/docs/reference/api/README.md b/docs/reference/api/README.md deleted file mode 100644 index eed782bd8b..0000000000 --- a/docs/reference/api/README.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -published: false ---- - - - -This directory holds the authoritative specifications of APIs defined and implemented by Docker. Currently this includes: - - * The remote API by which a docker node can be queried over HTTP - * The registry API by which a docker node can download and upload - images for storage and sharing - * The index search API by which a docker node can search the public - index for images to download - * The docker.io OAuth and accounts API which 3rd party services can - use to access account information diff --git a/docs/reference/api/_static/io_oauth_authorization_page.png b/docs/reference/api/_static/io_oauth_authorization_page.png deleted file mode 100644 index 455d631e178921fd513e05b5418fd9f588c6e6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39458 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 z zdH;3P)holLcsf@DY#u>+-RAK*k$gmrqUmC4lP{j=2I}`(WpGsD&FKTB{w*SzFtNNL zpNx-DTg&5K5{n;r8N%L1rr5~6&0w?3#?c{Ov>>Lh#KLeZEXe|%mjW)X9vhBwY_HWg zGfg}DS@9D3b&ROc%fI=CWwmND-psDQ2zb(=Vt()(3!nvj+JuKtn zzvA}NWg3j~-~C?5(e8A{tkrpis=PVmk@osxsc3csfZ!9JXlLqoQ!0e~Rxz7*^>1F| z)@9v2l);zc|?aWS_5MqzA4k1L=-Vrt;zu_gR8gmQ9oYF;OF2T7q9#rOE1K zy@Kt&6Wf#%6gE<^Is$n?6&zR?qO!fd{(dhQlK(Z5M=MB9UylFl#C8*SDkCL%4h{Wf z-`_=7VkHSqi`6v@-yso>Lp~;T+NQ%?l>52qCfcy?MSvLSy}HD6?5*mxq2Xyi+4Nzm z2p*m_N?1b+^Q76m4z#3x_jntqUbw~*Oj{`zm7gZpJ*aOJPZ`{V$AXanRf zyet4mo3RvAg@Q1N!BOv!%e!;kb1F78x8OmeYLYam;dttU*Y)aS)Aj0cP?!dcr7*Ny ztNegeTwE;hIDMd@LikGwoAi2(6x9_4vIX)?G3in?*&ckR` z&FGJ5!1GwoJk`V~(8;B-X^}QQr}_m%JND3RlG*57)-BGcch0Z#{usUb^vt@;!@;0D zH7m4-W{!y2HPlc}a{y8)Pc4D((bniU-a0MBIWpoEPg-fb!v8!)(>lQ-2;t$AqoC+j zT$xvxKhwk#KWRlDir)wsJjJm&crP$MB$X`IdmYlQA9BQFde8(od+pD_A;VPaPPvI< zmNY|yzCIl%a|s~9M}Zb^5fm`eBjSLC-TaCw*3R!fg_n!ph*fS%_QQYph|yw^L=+Xp zqcLwUlH5gIfWbIx|~DxW`*_nej>X#Ke5lmk`b>gQ_WRDdh%Xya-B8c4c;n5tPw2 z7-?!CiXVbaNp9I6Bg;q-?QnZR(FRW(unzN7bhfO;YDpAY!Px)TU{|?~Y8vGNXFM@_ zVH*s#01yZCt-KM?ZTF2YO2P^z!4J}%xk$%1=@#_kb4^tr!`g~`CZ3NuPK!GAAYC@A`~)Om{|I|^8X1AvyqmN(iz`rk5) z=hLRlq_G{_e7lZVMPW-!sP2()bi2#rC{9_*G_13%9x3R);o0?ry$VZ0_t>|S5TiqI z3z3P1Q2QU^Sc<|lb+6m3C4gAUz>xq^mVm<3h0E#jduxh?7HV&3H22yZe83Fb6I&5PMj z(*2=8koi@o4^VtPab+QP*dxneC-NE_9tPT)%1@xnThSn~*mK-(>JwviE(&Gg2>_3L zdvA*I*wQ?&HS+VrD{ER+*}YMPt}Pd0bul6_KS>RUwjZZKI!dr37(DZi+ zd6XLQz;QMc2u}q-fgK=$I$x9UDDB=o{a{%@;IncB`T;hZc5Y&`KSaKgha1v6bO?u` zQj~)qb+^+6f#kAp6VlzYQq`Cq^@ux z#S&!v;+Ud>@v4OBI==*yHZkiGk4$?-<_w0+f|XscxWKK#X{39=20-|-(G5bH2w1UX zC47v|G>kte?Gl=#WF*`w=p2E8{uq(mU-tvl%x`@n9Bh~Ki4F|1B&~NQI-u==!&jfz zhDOj|5~EMOU66y$c{;h{u8>`Td(Fq+>v3}EtN2V-BPu~7#TRQu=&A5X7O$q1U5Z|X z06vq5j*xrKU8Js$yJQcdxtjy7dxK5J7}Ad*z-2H^QoLp9bix`*5cGveS5jccS0R%O zD$p?p3^HsgOdTo_oSU7S1$a~(5E{v`?THz9+Ts{R8(gK;Vjru^!ZTM9_iNDM!G1g! znVyks2E&l7Udc)CQyMiM%SjTDfK(c6KEv;HS@br=kp(iQInWjrsEGgOI4&aH+bKl8 zh=dFA-Bx^{ik9tAS_?(C4S^onf`mT&$LTo1(^;xH)+LLnLB(wDVRO5P1z>U+z@whL5E)hHgogqIn<;a{ z7CjYCZ)R#@*Xs-TYuXpc+X=y5zZFtM5P|^7h3T39rNH1%o*DqRJx}=|vw-frE{(J( zoT>d(khQ2sOgVuv))V5SQlye|MKO>bW_5Fjxk~Kb&~x3}44WsUP?q=cc-;1NxXm~H ziygGP<2(6ZpR8fPk?!-ZIDV5PmvIF;qIO}NYN|;@=Y?;oHepMd4L|;~&-=5Z-1{zr z!Vi6K8Tp5ynQ616w8>ETE`1RD)T=EKbu(i3AuF+XTNpaxO@-~Ra4rGqNOu)0&~pCOcHM*}-&CEcc7Hm|{;tuUG) zeKOXyc73RU**k|KZ9=3M3*t8dlEGAUD3IM1OR*sl>y=2HI>$TvH3b2-2Q&zCNk4h% zVnWkH)Bzb67pvnDhRl%)gdcB1m5&D|t~k`z<0r{=&hP@1^CEmBYm2lL5vVMtZWxPQ zE@M%^k^k*t4>m4R@3cy2c<>oi$%sLEqh5XFs}$3CQgpD)l>m&34$zBUN8wLCi{HBo z?6)Gn0G*#m8Th=C5bT!eqRTMIPI$|s4+Ge+pJMG;sGHjW?AOwm1d$@=NzOk5lx!M8 z8;+4}rS)&p**%)i+}p({9Ft-Hjfi~MObP^{gJmjKWykhRU7wjfctFL^Zw=qr;a~gC zT3pPX@8lZzEn^ogh{OIih(5p%1Tk4|w}6~n@cGDc=P{7si_k+wy{eb{G3YeA%;hDn zS6Vxl^;ceJG}m}ECZ;g&Lp%dSCSIN?rbOiSm`LdQUm=aCl`62%J!1ZzB-B1rz|!k{ zWU9Z9;Kp_R1Z?9)L4ePXJ$|oVfazJ01~_E)Rs~~}AU;_(+FW)aY4^5`@kC!tcnpV0 zsQsW*yY4{wC~`Lf=G6IqgW@tZU!O}?Cu(Pz=j6oir@P_Dc=rC9{|>H4-!T@&cSR2W2`;J%h-521e=T{D9}BG2@2d9Rs7sk ztZH^bJMoT9{9w&LZhF`l{*zVNsX$|*(M^q8;S^NSw1p-bICgn-`>6G`?;W-txVTJ} zizpty&{EOCC;NGi!^GKvgqE#z2jn~NUI1CA#eng5cUm%8288UuYH(+P6_5&4DaYY~ zZ^(X4^TBpDNu!jzhye*SZu7HhJ$roAVX#5^5wxK%YbliBzN{#R3~`}g^PFTkE30Pv z6jY%6=7dl%yOjHk`pTPGq&o0pQql#1;f-=2>sgcg*zN2>N>pX8;Eqf%glJ`qHY(6w z+<+_Dc=BYrL(0!Jc1bOg`ln>BCET0cws0d~IY)Y5wIPm|mj@4|{{h!;=Gp~@H9Brb z$3ajqlxRi7=mmh-k7m@S@LM7;`#xvGpfQg(P<8~%!ZfV3?`;!@@cnyrPu)iZBDkn| z6xr%e`mL7YO65#ETSFOx{GYe>xPyj$eEX>UPwg<@0B8$olG)E{d2@So{~*$O%OE|M zHQhTH&@s#~bm+gclLq~hAU=fT?Z9F5_()ZW53EN!4JxjJ4PuxD(1F;?2Th{z3u+CL zf05Lk@$jL~hs!hh1SZLKzE5haZw2ITB4+-yW?uJ<=#I2?;oXlnd5im>)|K2C-Br99 z4B?c}^*6;3U>o8kP}7m4mdwsgVDq!3^O!!FKVbLhY`~_w2hwS0L;?U^ngxL+w3Kn`421(+StB5m#kZTbt-}jT`@YiPP zYF3dU0eqP2Leb)+bz6-klr}eoJCVtv7z~V}D-Ld!xOUiAuB^#Ev zJU*-(3yc6NpAR!yZJmrUmDh3x%^T1#`qiF!?luNIAd?nE9Of8}aQLR~Jc*s*nH1!R zv6iPH^(?QH)jPiN^WH3{#B(4-n5D=do4ui;=6F-7&R_Owqw zeu%$e1Y0;d%PfGReVB)9LiNZ|1rHL)3T*4I`%}|Q5bKsc%!PGtl4ZJBWkTEC!&Cnu zSQvub=8YE=m3poHNBQ$xs|LqWL4-9}_n0J22a0Q-M&yDDmcavjjX2oy_y!PN*+}ON zM>ntc)h>XL;NM_AI-Ki_K(|hJS6--!FI0N>Z{#kh+eQ3K@?w`D4PFN|b)>7ImWRlm(~;_}^Y&^fDa zcoxg1cQI*2IYAJuUoJ@QWJfZ`;KRFgADRVXoSYNe2fSEUSoh_NyC?Ht&h};L4heEH z2%6a+K|gs&{5!(>W}!!c?J*B^o&X6pigkkGIxsp}KmjZ#LqdX)c}t(hF#GJHc*xDP zow)iogD=(6p^8Rmc6PSRVO2n5i0BM=MnvVEya6*>=)fa ze!D}rXB36?`56_$#NLkpG&M0obYY}zpKIJpZxUcNl74$b26=yor(nEz&f{c1tKK&R z=YMj)hki6^$R&$TvYhOL9~bxVv2Cx?QfnF7Nm?$%f)rCG z7LLR~#B_Jo0bj5r(ZdZ3pIjCksC zZd_C|EKs9*=aJBx$il#U8*X6&;~W`{0&XBc8dFMN!m@@&kEdRjLIPXq+0A1wzY&XI z@W7KK-Vl@gKMV01k0m}nK0^2U#bluSm-_>52~M?^r$%;!%D~PQ`(pn6&Kho8DkQn0 z%#G5LgoHkU4y+WL2c@Xw_vt$~2#l2dpdeZ#UzebVZ zi<|m;{r%XVX9)hC{u3CVS}7d=xU*ec`c;4NJ4s02)EEY$Lt5c8%E14oI68v@fN&5$ zC2g5AU*#%gzc^Tj(E3`KA9!bpV{*;B4E|7%Lq)p%v>N;auJ^|GkkD&xXWTZ6_@$> zJvx_8xBQt#zl=*l;Y$TL&LILMk{J5%nfb0Ce+$0xMy0jw1RH1sz@blV3TuHhlzMEk zru@@)Om_?-xoyw*i(S8#Ybtp1ek*{F&b8aq+N=z7a2{4OKIO^{a!_h%HJ$P!i>Ntm zWQLc%<|Uhqp}1h;^QupM^5bz*x~2yGd_Aj;e%qSpxUmxmW}H1v;zM`-!rL?|bM-}E zx)LlBGCB`><}3b33@=o#@7oW1E=5j;Q6I_<^N*h47bB(|Wm1r3URR@UVCW3p?Z0irRIxFrAhAc%`_9T5Yt830e>}TTKK3TANR_ z(dqyPe%YZEIO7<<3gnh2neAbZkkgA$J^s3kiC3J&-WbLdx?1c`6u>*mB5?Z9 zl0>IEw~kVrYgs>C=oopV(Ap=qE)ZTHCyk1_N$KtX&=em4DP)XN5{P~nS~X{DsUp3L zrgM?TdLjDW(e$gEiO>%k>;SbckLdEL`;&)w*?7mzcxGFpR0}ff?sqPNrXpwR7sk*U zc%sWQO?$af1JA2cx7h~mK!1nCK%pnECRD58`{0KQ^qw~hdQGilEKKeE3}jfM{;$MK zDNdirhL&;&w1Dq|6|J+Jwo3vJ>dqnx1C^#Dg*@!+q@)UD@ER_(4{>2L5;RG(x&@RZ z4d8c2#R_^?{51pGfxOWLb$L(1#Z3O)ymY=~3nb1@y(czp0VayZ1fADf<-Ny0tnClDwg(cx{u?i7bI1@_`_y3bt?{xi=nePT3by&AP!6vZ={ON)rUu!V@*wiHfs!3vJl8j(zV<7fn&z zauw8AUkwYr`zEY_RUfNWOK|)L0aXez?q6xj4gxG{IKS>PX!+k47dk4+Z3W6>j0Bu_ zzLk{|K>Y>~A$Fi5=vP{&hg|L?yfS@^8&&f5HU-q2_eH!zxi#iq0-@DLMNH?D;R?0M z5(2-@=B4H@IkPC31%beCDT%4!)CkNas&4XJLao#wz&Vb#@h?*Ic8j0u2>lF#X-D5l zREX*Pc1cjM*l*L5fhaGLk~19PbYn`%S0#nGJ$FmThCZT|xJf~xAy6FI`Muq zTto%aOPOmujXuTCF8rAyhpYV>Qqo$bLpKc$y% zlm=n9hW3weoOJ=MICUMi0Lo;cbymx82h7hKjfaOE{(lGn`0IkSRuOSVNFtdv0)X_Y zQelUmJ`h!vq{B&auwWr$vFDKSKJd z+V-(tLPi)V3Ci|qg6b1^?CUoAV%{%AZbX^=_a>tz>d89?njgaBI3;8PvSA#_j7nu+ zQIj9e<#u;V9B%r_6uGdrSaeZF+J1EzoERy;Xna((8pyp41$0LrmKi$aOst$>-g{hH z-J!`hv2|YbNxAnnXxnT(eZ_-Ta5kWGd$PPgT#T2MT2iR30=o=0<-Us{``59ONmNVvnuwJn8|uL!8Zyfm8T%IrOXQCW&F6?SjToNztV~g7 zzMFAm+q3F+d<+NLUS9?Y1a`Y&Q7TCd`b!B*$pSN9zIQD=pg!^se!- z>!yenbb>k-Aew&ksx;}tz-W5kY}1(P*jA}+XJn{rrGg>ms?=@^QcbBYsB5;&YE6$^ z)h2<0L;B5VRM~TkCJyP9R_Uts=f9ad4XqCBJ2mUi*M3{2zx0uqvRtUFItVug8r40M zj`TqX24-Bdf}i)l*0PH3nBYVe>VT69VMW)zf`w>IS)@UMFs22OGe_AlD5(V2=s`1Z z)>zQk`mma7Kg!L*9elXrRAs1Z@LMXn$yS@isOW0Ubq7W!ZI-tj(rp`KfNHPCE-}K5 z7f*Goe^U~u)U&VAF)rUm-r$B1%z4Z_#Ai@z*6Qt-5v-tT==~4iJI897FI4C+X11U+ zbM3aKah?Mcx>|cIJg*ZkC~YH3a<`nwy)%YS$$X#Z30pCSoZm@G)ARCV%8%fuJuX|=M@h?6IvB;P zswn~q!%5%Z+-7FY5#w2WM{9<0ktx!_eL%mlLUME%kV9t#`Aq{AA0`BHD-Q~AH5KhiKkgn%E2 z34BNdg#AY=SWzkf3Jk>m5jBv48XQnD+w&h_^H=VhqAw*#!s~b>6ZQ`tPzI#38*_hu z-$XNS2%z|0=xHN|g+nnvObwEV4Cjw){G;%*EI|&CiSUXzsjO(ReB=Wv2u7g5h?nlK z2)Ch~nA2{BeiVhq1X98%CtJp)b2nRW97xAOQJVMDt+RK2pcC*3w>i&}64z7A# z3Fv42>*N2TKcmV}GPwW8=I7qVVV$-1=#zU`_9rQd0AewuiQdPxKr|39M}_QZ_)pS* z-_b3y0^2#3@Xvuvu0)5b7`_tg&}N$JN^k0e6LVPXX!EjPvS+yEMC*j z=$M4+LKecnS!h_OO{?cuHph7M{`9eHodGdmH=!;by8^mvU#sqC*%vW#{ay@-GC~C0 zpYc=noB6-JBGg{3TR}_CPFZ++7LtHGnwY;$P4edli$5}!MTCra@emb3PYY9&8v|3n)=4Liz;5We&K1mR9JM$KCAX?zwM&1A6t^0rTTU z^mll-3Rq%{w3KLC7$LtEH3@&TuTfiUOTJi6%uHO9IRsP*BYeLMO+eFbgXO;1Javrz zy!f{&TSc>!tF==bXY}=QYCVjjlMsJ(;bd7|N#;j3_@{K~b&aRx7E?Iylj9?^)fWNs zckkk`2EiMu(*F_nmQis$(c2&pAcGI?PH-o<4+M9DySoK<8(e}0hv4pRL4&&mcXxML z`2F8^_nbXvcR%i#F6n!3Ro{BL=L^Sekt2nD zM#-72&*NBjxFd}ylN=%OQH4H(l(-ILK(qbg_+YE{vx{~M$&i|hkM8Al&>HPFFE@Y2 z_--nJ&)Fi-N|@AeVWXG&Bd@$_=XCkl{tCV0wsBUvd z!~!Mc3C_oU#x-|jm+wK53r`ARH(e!^b604{NB?Ylfirq+d<{p3JL~7qnz2I;Z(#zY z3)ElQ_ZeS+s@jZ*7rkUpiRmH3YKTvS#R(n%&N$on&Q>lje4>wf`8srVu>pj7BySKv zLl~Qt*1PY)z(?XpPrJ+>bhhy5l$utD zk#9j)9G9Y!KA^0aY?!x0?aVgEmg^QB)2;=P-Fm!N z#1h;?|2Gmf6*m`1hB)%Ml)p$IHbEmeJ0Y$LO>rvbCo}#^xee<^ZcV1q2I8-Z$t0XD zo}g=)9_(0?Wc}3kt!TkTJL{TAf>>j{sl+!PolKS)M+vcXl{aYEFHnqPx2}z!L7@lF zwtZDIEN-jvz_0yWcr&Oly40yTogGtzZWuBmy1xhPMIdPMIK5_Nz(N#C#?WOMY5F+9 zr{YoS&18|ht9jep6n77SQ2^PjB$#IuE&L`c*y+jW+CQTK&H-ISB1lnGwGVc)n^6(7!I3|{h+oW95bK97&nyHW?6 z|7vG4fj#rSh?g(<)jWr}#88bS8dkm#YXMncSh`~KZ^UoLunkGMX*pUtW5Um9#idU| zwr}zG_v41vauca88pLwj)|LA8(tYsrEi^l-+{4us{;D_iEvJxz8j16X57`@x@ADUKYG`@FmA=wNVqxqQ($Elw25^ z@%1#^2AktI_4<&L$&{3+Ru42A>k;}T3*_fACSws;@$2~b8`IUYjH@6-R2r$zOiI%Ue=8P9;?<=llc})BPT|Jdrn1%gRNK6blY?3nMCI2D4wx! zeGe*Q=ow2*OL_TCHkzM#Ta4L7dgB-4P55Dw=Bky4esib!IThGtl~o^lT(Xr8jb|j8 z5Is*0kpll*K0p1lu<}mh;uK0ASry3icRTNN1CM^5?bZdCLV@MgcMUku;a(3W?Zg2) zV`X!$1gq|L=?!SpqttzLh;ey#wpFe5uagR-rp zt9v1d-FW!)M-xz$%q5Mrn&{+CzM)i;y5RH+#FE9SD*Nymx2N|csuL#F%CBcxl0V^> zu5_5)N{FPI!Je3^J>jnxiY!^pO{*{k>-JbD6ON8DvpBC%6mXZld%5CyFfy!2Xj9oX zPVO@=+^^fY+P}%1gID=AwAG{FJG}fzrtq#r6&!Y}*fUkljWdCGr+08rxk~!|f zWfS6%XF+s!ObC{nrw!N9j~S_J!DY)XLd}@qVPBbq?4%58(`|(Zzz_+9HSbJO;xpQO z9)9&AI|yr;3Tuy-b4YA~?$#$=0VGnfM=3C-y49TD*9&%}dFD}Uy#FKplXt^IANy9V zl}5#TSi{#@i3S!Hx99tWXBHP7OBTH&Cyo|{@aiY6HhtD^6Qjl40g?H_*!_qak^bOz zWY%I^uuIMj)u_D%!<%#81WnVS*68^pGr-k|=u4mV{eA{?Depo8)uT$wflTHxY_ffg z;)>}?{=ilO6~0x#!+t~tWk|4a(`8k)+J#um623&<4QGaacS;-5lhWM=B|g0?s9DT{ zDXk@IypIURoxf1o^*5>6maLg`sUB9SSv;bDRp(Xqck)T}u@%OLJJ${y+DQdKW4d^- zB?{=e)5;vf&2BN5;`A)5igr4{gmRm0G_cYNkyOkLawUcLQ!ium>-DC)IXH#JG~mx5 z4YMYyenh{1S!X0XPd29JGC>fAy6`Cc$zoG6gC~H2MhiTkU27SBZ!D!G6ZIfI>ymF-wpRO#&d(GtfzSNZ)Q`f3Avwuq|JJV< zT($pL@}%DX^7>TrbNXjOy65=WHo2av>tV;+v%z_N`D@lBw*H7du`%L4z=rK1IH_`& zwM#u7?ot-F`^o4H({-jX^2SM7l9$eF8U6P0j+aGm5Lhm9MDuVJw-GN#^TW*76$jka zK7b=Dw!G?!{?#~(Z-`2j>arq!o~q`Wu2jSYbJD?^SRSTlF0~Z(vMA0Gd9#kLgiHeK=6vEGcp!dGlYwX z16~`j#94WMp+g<&d4lDq7f0q38dp|x-#w@?w!xsQ)#`ztpnMESx z@YtbC2Yp$s07iHF&4O5w(n?&Aa(q~%mCE>rGzrDS$|pbO{K;f#6YulcRF&LeDy32V zOT7}>+CDSfu77ylgSdJp*LA9%SC>0!X5*`!(ZGfvyI!+#Q7&+P8u;UKZ!1Q%4%vPBO!YYaxzh$aGqQf}bO++Aov>~)RLH;wyg z|A^GN1U4`2J109;;bq+J)~6d~gMNZ7-9uUCQvAF%ZB%|;w4ylr+$qA}g3-WTL||kY zalOvjr?JYR{xD_8Y0j7KbBG1K^D(u@eAJ{KNKrd~@7G8iZ1tl8Y65R#BN26-@@zrt%%j|DlH=j3wRQ?Oi*XDmuSL~gZp&Mcd#)l9N-ekf+qLv(5B&y^RKjC&DvVSL z9LFSOMavJUfkk2MZ1CxJgkI?^DO%>G6@cz}s{Knk9Gqo;Fo%2ywwKWrB=Jpy0vJGxPbNdSmgNsQ+K+(zYe zmyUQ_+DgZBrYR187)<46lpC6;8?3*^og$=;Xr?h$m_l?XL&V_01q3gk#V>x5_Iku7 zdFE=;NF;n&Ia`f9oN&ggn<}ZPU9Q|Hl;Mmw^M=pr!1D1T7RFg)m_93t$v4Dq8g^P* z+2kuHQBHAb)Ecf^%y9z&3(*%1Th*=V1*3*La$<;zBpG8CjJ2$1!#59#{ZECtoKCJB zCcxVM%8!dG{!c2;nLuSWyRl5D5c#avQ&+v``$iO0z9-w1->wWw4UyL)Dc4m+#sQg9 zQYgjFS}EMg2CVq;g@!hgnrW#xx%P`wXqwneLrMW+0q1obH`VC64a}|ZmH#T?JAM)0 zXlgb)F=puAJo(=H30VkoiRZc^c1LRQMfV$C;KDFut*csNB@@XHDUTSGe`O!}VLpTX zk8}~|j>b8P!p{naXN4I-Q(D9ent9koIzo zVIRr6MX&gTMv9L(*PR(DPj?Qa1~K<%w_t!##_p#AQCf~YcP{E(s9(GS(R^MSjkX=(0{8(yb(hPRGee`{4c(UZlI2UZ9 z7z+vW%ig~F3PF~DcA)O!+F@I#nbWPO>*;e*5zxArd;fiY6oLfgp6b=~qWlyx+G3Dw zw2<{YKXsZ`I9%;S_6!RN%=T*hC1)x4$K7#$)$*s$)6KuE*Jgh8m^H*J4K!#WFl&z? z-)ques)b|yb1$C@Me8s8U$S24A%NKlF&&MC+1_-N5M+p_3h>#25TXExP#^>< z6a?9OVhBG#&u2dXB+vi|0pRbpGpeTXg#bR?YBr(Dt+o?FK%B}2dwzNLU`Gc)sCFQ; zbTf6_2eU!|L^~cfhk@j6r}hwlZEY0x?n(j}2q(wG``*!}74EpzB zkoNs&jv^&mp1kjHXkViMkWHSXe0>;~!bm^<<;ythe39s^qvk3>g#vDVkvNGH3nK`{ zKRa>!hV0dzMFD?7R3gXkP}yjA)XD99@*g;LeP~g1tUCVY!qyOnlgtL}ZQabP>KcA_W?2%;N0 zQF%yC36HnXiFFlP#fw=oKa%^>Ibi|jq$#Po)M_S;zQkpaxgxm^c_V9~5GVx~eG;|(T z<#epNQ(&SXI$XK&wYlCJ#BIe$x*TrKD%r&iySf+sG5^53|52|J(;~}KN}6}Cud9IH*e6Wci|dK)T;N9 z<2{uZyd4dT)WUyRTGRmHXQ+$2kn$dKa^5_Z8%pXmzsZp%Ra){dc`Vtf(x2Sx_YCk8 zEj&ED??rS=k3G0W4Pn;szJVKFax?MIlY~(Fhy$y_t?&6N=>Ab-rVZZYeBL&p0OGWV zlSxVEK}N*n$f`NZ*JnfL{yTnyqpppm+EeM5g%)yg6hJ!l?EVX8>1;x(9s#aYlf*U&vs<~Q~+@ggGwKAsYTm&)KimM+X z4+Mssky=)!^$S)fqa!UY8^R*kX6tWd|E53Ho;zxN31$A_H=Ug+pP$NWN}r`QMqph> z=>6)X{@AL>)`70pz1^TE_qR1n{K?FPZehf!^N z^h}=yOM#_w%D^nEtGyxFMWaXa5a)uN^|-Eh`8R{=u#E&XIW$Rv zqLfMyJZ*mX=1QBtRPQJ!C{dAH9%HD@^K7<6yPx`t0H((@trfGIW@wv~Zk|ED$ zGk#HY>`+i!2LRRRjM8mfS2v!ABhx;}lZjIMncJ7bx9x?|Rp2DK_<1B|9uJwDp$J=)I7lJiPz&UHsHM zI3OMhuIWkf@E(Z1vw;5-ytDql z1UGyac<-_}YUrZh^gJ!>L|b)&OzTms>L(djM#FW#C8*HSrlwn`N)UQdv-ZMX3GqSA zlk#=?b-|#KyuaKPkuV_%XwYyjhe8i1gbSAhqrt0=r?BYiSEm}<)C-P8#hC48dXBZv zy_~o2Au9O<08@cKx_km;pUwLge1$2&f}{Z1FWd9I7a^~Ldo(p9F^=dU^loDGZo}b= z#@h?&vjv%hl3~EwZXytbA$N+at>2)y zl|8p3fn!}_l$~6y5pvkMsD8#quxXK?#xj4jC`;g-iQl;jAB@2gGLDT!4XPa*j**%v ztd{b02>-<35iEYK`n}<+&~s=?)PF)_i=-ll<)c`pz&NZ&x_c*dYv4nd({^ z;vTFP@Y9m4LgI{-9ynz1E z3xo+7f5Ka1x^$H-JI5DXb`*#2QZ5kPvNNLAB8iZ0F4yjHk;Pl*&lZpA&3o%nS+?!O z_qg&QT&%+wg6bs`D~N4UWB;r4X0Cdj^&0yzT=>acX5`M)PHsK5i&7gZpNYf;nds>p zrRu(%1rHBtR!9I;=TkU!6uk?o7I}2sRP6SiM+}+htp@K3Ggf0R!X>`J@^jTy$rF+9<}QAz@xrc};sWX~Oet0GRxB5fY}(Zqzbeirm0i zb9`1~8#&#pfV4eKdd{flf{RIY#v{cqtGqwKE`x*h2xWy(nJI$bM&sm0IX2jIdH_01 zVz#pBVvpgN`j^jtWA@+8%+{CH9AU{3IOy?i&A2{l)|Fj~MpIPDU#%FUf)F}rWZBh( zd6^o=YuHl3n{n-FOnxZ7M_F$kT`Ez03lDUltr+Q=a?`1vxZ`X*62UGsMy#&O_k=r| z8-Jc}mQ=gI3q!R+;H~x`)XC}AY|g)PmhjxbUU~^3ovGw2oghVWo;EgErKz5gaQltF z)My|j^-zMn%AW83*;XR*sL*e)MH@lZ(QZW6%+kL!3@6MyzGQ~In8|wtU8(p@jiW_E zR`<tkX@=QHX`Z)+UeTRr5;ZX`5ij70Y3G1p6`#mL9OA3Sm8=MYi{sKz;6(ib6-O^kD085Bs-n|(5 zEER2Nd(GahO^Uecj;l# zd!yV~r;J-K;Ex2pDsv>noa}&UvFMXMaUcIyh3B!XmjCt6)XCQ~EyG`&1Z%Xi=fk=y zNK_tcYF8=&_?A>-bt8Gfn8QUo<{?Cn3UH+dN+M-6qNGHV6c0!W+^oX0rw?c z5K}jQvExaAI}fyDXmr2hSK)Ugr2mGL8 zgcS*gBozl7WQ1ap@;!jy6cAv6tOna)PasDdnb8=mOFVWGCY1o{spn8E5IIM;*(KK6 zf6UcWu7WO#CSFYnIz>b;qL}LjU?7VJN~Po_MlRB8noHo1fHm?zHKFiD&K%|eBV1br zl!YiuN69JqERwSrybmF6UH}VXx=H=7c!>J>Af^%fPu;QnfE^6*a8n`!V56mm7{uC3 zkGiqobAnGhG|WI-bNtYtAZse;edz#z`3s_LxaSA!0hs_Bojf!1mp`snhiN!=YYUF( z_VQY&GoZ80INd#vBhRxjz}9-sGoZt~?~NyI*NO!HIA}s~?=Y#Da^BQ+ae(lu#RA;u;j?TaaI;J%jP^X__o|7%QsX16TGV=E z0J4DEz$ztAce=d{SC5`UzAx5Mh|P);a4b~YPb3)S%(g~Qu1!--#N7=HxdUsW@V{&W zkkUE8E^^);9=MBN+JALyKS6@q6G~6ACadsDV-cwWnG(bU6n!3RypaF&rsyZ4h57t(8 zv01!1B#?NKH-9zn_@3anOAnJHYL8@?fh{fPh4U(P80=oy;p%}<-yj*`e7K=zjM4ZR z8aQZLw$*bdpOGP`nUFMH<=`c*QK~JQt1Oyps zCdrRcTSG|V0UeWuiwbXTJ{VH0^!xj+-7qQ#EvmL5d70=r3C+c|WROKrNK5d-T!`b= ziRRvgIn9UedP|g@8Q~iDAyJot^v69)YO`2EZFs|JGl>x2{^G_z-OsY_^HJ8i{dSXRJZm z`FG$U296wIBum!bw9=}UaFYpsKzSlYY51Y|O+bM=I)kA%k+*-|6CV9)&SBzX4S|)| zSH+X!vWvWQBpK1_j#AAj%yK7soKR7yNrw<2 zvyE9H<3H``)l;(2@D2+eay}=hd}Nx(ce&>C@^wciwm6@@?FMGB9ubOV&HPRATm;DX zn9ja0z+~g%AdZ9$>^d6570cx>-?yj>tin0e{dOgpMfG)Yz&;h5< zAe_{F4GjT3nyA5sPs=jEEC{nDlrp!ISySohwtR7yo=>XaJHXnT?ryE~O)r*XSIxauga6wq)v zEh!S}n}x8uidT^@7v!-}eB7)p+>u0?+`S4Ylq7$8iyv!Ln)j+Hk}S;+`bOpb1WiWK zz3ehKOimR3+TX{MYfBn8If|fHj3>wu^Q}tdihR_t&w~v{HkB!^VGoo z#|vGz-LjAOeH8>mi09|OSuZZ%IUTlS9k*?hySh|6Gy_TYKJ+$dis;$0M4&2ks58~v zdr^c)G?Q))68 zDLqo}kPakHh=s1D6@IieqAUhy zoq?UA1`S&3qW_V5Trc>6>q7E|A%5f#qadq0qOS`Z76WjHa`kXuDuY!RSos-F@@Nz( z52IAs(8-y5B_;u0{+8`lKUd{V=E40CosaF=n#?Kufe3VOR}UBKgHz`_ls^RD;oK1S zQ>eN7s3dCtL1rBKe$oF9+z|@N!kI%Nn@B^Vtd>~$VJiEuw2V?56#+Mng3!*q5k!l^VZ(8!K9kKx8f5>J zMODY&YyknSCGACn7Gu*@#!N5LN{*Ac2PL`g?iWXev*E9lz6cHA6dl0>+S07Zj;Q{{ zwx(EswsS>r_$#qa>w~N%^RAWczbkO_{=FKjYO#W-r^#z?QVZj!6u2}mRn^i67b4<` zo1yK*SmF9P2&s$;&dtOU8O&oz%5cOG(($73!(Iw~=6~+n;NgNJwbBe)DJIHZTSxK`IIylH=hF z04Ck)s^cS+)2F+Pl)|4870Xz5aJ$?ucHs}98gb2;0lpVnTV)&!m7g9?HypH5cD`Rnh_8pAispFGy$KV2&YAG7U2uEb zE|xB(e9dphzV%NZ?EG~kkPzx1b!13`ywua61b{WC#@;tp^v&1Pu%k<@j|h<{%#Nhl z`!XvGv1ATR*Gb*Mi)~U!H+H^vSf7vFeoa8>DNG(IpoH0W&M zldKF$hW7|0H76Mv_!7>_N5*Q;&24)}v63l~toHOXANZ51$y&Al85b(3)zm#wf{P8h zo4Zf%t5D60*9GK&_dhBPcf*WM`oowI8IIMkm4jm&Wagk4P}2&DsJ5 z<#e2HlF^mXrQoHvjW~b?i~-tV?&{5Aw(6)h`|JryboQJXXrhv%DJx?tdHTU)sfMT} z@+o4^%XC7_Igr018MoC77Gf3fq{QPn!9T(Nox_jGf-rZXn(dQL4`rl~ zFE_{|RIELH*x?|eOjs}*U-eTd;jb@jrqq!z1TPd7j9%0EM=Fr>Vq(rZl;`MhKn4%rRS~~B;d$H0za!zagx5{~7DwpsXmY7{j48rY>8cW?C33&B@|=vA zM(2HDk)Pxb(zB1~9mg5t_^<8vcEb!J5s;kw;*@n5^ry9s0cR>nzPE7&!A04t7w^ha z9L}bpbxeL+!J4g7kLsoNy(z>@`pOD%$Bz3u>4tJH4Ev%Znd!EE<-PZtLRwA(vzTkSJxoCJrgexdUT57TF~FzBn; zQF2T)89wk4vYs3Itd(0}Z}xdn!7VO)ex?VHskbRCD!RYdjopi%Td6J>T6cJk?kkqJ zA)o|DsHwBoQpQ8vIcXMehlUO)k0Gi~Mxl>!$DFr%R=Nh&?aVI_d?*$7_^mA{xNW`z zct<6(m{0T$!8s-<)W?3cl6mXF+N)|WiwLSWr=6W13-11r3)|mbQl|g7E~U6}#!j@s zWoE$1WvJmk3U)taal&4sTqCnyKoGvS9{>h-ZE|Laqw7|n+L;IcNw7&2VbUu7z`7C- z1U>pWS~?T8TXk&*q8mp8In#vXd9aHT5ojJKbWh0WmF{NliU3|)t$r$hLEZPU`?p$) z_;{1GrucAo)(*cC{b!EQ9}CKWpD?#`mY=-- z`yHv_XXMNsk}6j_1gA4(g71({9X-O{I2$4%$Q+XNc~>pgB%6_Qq{pkS=d_a^c6M~1 zW0votE0ctZ+7_6cs_7;c>)w`C=2xJBTr(quQk%7@q4xO46^+P6LQTT^0@s7WO47DM zh~5~5?=?e@6bzs!%$pMA5Rmn)ZDfEdV>OYNb$)tu%7sN-j3uGo8}Bo%(M!|$M&6Wb z^LIfBXl>_Sp8A4J5w5Qm{6&hVS{{P>r?_$@pJQ+ zluG&CJWG>o)m3ml~p262uY9lJqQ=TRg(a-LBKbZZL z^t)4vD1ZtQ@~wF?W-KNxpai>9^)O6uTTn?;ov&GHinkIT=mOJK5WjGb5`!mnKf#=Z zixlA7nV!`XlrN%^!<7yDU|(8kWG?boUZi^CS_~*OcI1}GLx&M;^1I#HYk#V@hu;|h zDeTrFQf&Y*c_RJ#yTTG|2GV!TL%6$dQ^huZXo550sh2moyp>+~)`uHKV$zy(e1pIV z)FbC~6#TX(1P}h5r145_)tb_ z_VBU{5U0dp)&dNoM`~4GQzl&g4fy+zmm@5mYOY{@!k7~qiJR4>6qGRSCVC?`Y8r|U zMm^`epCr134h4X%yUBwA;2P#DO_KL6{|=0^sq{3lk}BoyYX7_Oi_6s%7&U(JS@si{ zRS#vga0%UoSGOyiTtrtjnYFCm~kO;$NWO-!h+u;(whS&SQ2+KK>BIUkJ> z6CChZB--Uvv@IA4z~5%z=R-f==Z@=p}ugD92WKg324?TS8Ok99cKNLD~~k}T{0PBiC) ze9V(X{MLOC=xI`k`C*cDMxCpE2JNs2NjTxvni|vB8U#yQd|qNB*hcI03$I*tp+G*1V!u-@B zjA7Ssu7>0_V4Bpv4Nbn<);9Q`p@Sy5g)QPJ%};F){xq0r3h^T`)PbUl#G(&k^GL*e zcWaa)nj$Z=scAL+H(xHWqumFe*?iN^65Fvaq5Bj%s@<=oS5`fl^2O+<0D~tvVsy5?39x?%5DHsv)GcF& zOXio`M4L=2x?F zREvi7wSSeg9@}o`SBH!q&bT^1=GypxjVof(gvO<%6Fka;s-w1a$IeyT&ODAkM9>qB zjh z`fu+MlV=YXnKB|4PVlCBOg>Rs^5p*by^>o)nET#34u&81bk)D=PS@h11TqV~pzvec zeGj)0{aN{<;i>#FqiFHRe_0m{=#~&9K^@5IL$-W=!tS^H;J|PEOn5V0d(}&8S>^J3 z)8l`L`SEZlzUk>x0hFy2`u^#uahnv4W?Tt~VaO40IXz=+P z*bfMV0)52)iwFTAKO(PBPyk5M{~@`7Y^_db7I{W*k+6!t%D8ma!%C5F%B-cXnFGzj4o z{zJg)MN)mTPIKNec^necq~|}Oa~X+&X`(LQH~!YkLpyObkm;jd;`1}V{&ZdVLC&dX!+Y$6&04Q zlA`ChRy7l{xkFSQVGJqdX>a81h%K8&Xi(TCe=eB}M%YTLI0L6szE0%_27H(MlDa*c zvohC0cJhUB3#;wzcVaT+i|bnL#IT`LYo6plqGnY>(4bJp{%@KEkFZR7%JASu-ggT; z{*yH4L8R)JuNR}a^zGEk0zq@rhc>3>nV5HpbD)FfY-BH;?T5Ema zrFO-0?-lWTP>h3@r##-Oi{^O&Ot)dzQtdW$qUeH}i#*oCWqGJ2VXHaAaWWF3*jXa|Q6b}& z9el~kfB}yE#NIA$UEhi}D*iTB(qpruYy@7$8$G>$k+4m-`-sf=7oiwg^LNN*z;Lvh zE2k?A?V7zvSc}P4i!Y}%YvRT$ODiq_H)@EH0H>|o**q{N~7V=04I>wO$H^f;}2p) zrANf*3Go|>H7E=RoPqtSd^*r+#dpt;y*=)G&wJLESb5TrGHR*KZhQr{48;{Ij(-<41wuh>kkUlp8KTZmUT6^*Bz+B6 z_)P2%dl*UBo*FFqjyOhkq{G_{@0RPIxhJzeCSol&vpw}xaxXUyUIz!SXE_=)!mYyi z*sUuwa#oGc*@PA}l9WfooWH~a1=8*4M@_xw;qDX$=bWqt&mU%lq*(d9(01<@G-SOZ zp5^Mib@m`gNy^l~&{lcH?nkzftvoyqYUmekZvVDO)mK+$gsR9mZBG)ay|N)I-wgZ8 zj=yQtB+0~2dN$aEmviOh&?xpjZH`GLF9mlbLxOK26qvt%{no{*$D&%5b55ixs^#>T zhRI8L)U`XYn-0?(i%DE4cOkxtzcRkdQ@}CRp$W9>++2pF zxe|YIlmvZbA}`}+|HVrMD5*EH83(2ym2~@)$XxkDyc|4kjKsN?_>oSs+giWo&}L5A zdbJPyK$lXuA|CJ``Ajl-1%07}Q+i{%H6>TRa1>R(0!lpFGAc}2wd$*B$G+t z!e-yg90z{m!WZ;;9v5T;yq``lv?*#gPk=_He|C2BI|F^K4Cmh^+ z@i5Mx-a2S{&q#>WL2*Eud0Eo%%Z3jsmcy(|bBPy72Fci`qaj`gWyNq^c_l>R7_!8YWe^6a1No~H-wW^1}6ZH+}lf$X~9|3?Cf9Xyg7GDX_#qj53F z)N`Su>l=6$ktAFv+-T)mU`OE=_qYq8sHe_!pS_ud*xXW8E(WO`K&mPgm2pw4gbv;e zwGgY6khY@Quw(J^VUwc*T+mWU+~DfC_rg{oAtC0Vv;lTJHi$>PS!u_BWdJG@ zHE!>s87HXgO<5OH?`@8~Li9cctrmsv_VT)bl|8g<9{_Cp%?G(CWlbSgAt6yjB^|I6 z&~fvC`Qvi5%e$Kuu+asn)Ph^oB%Q@KH>M%0sV!h?Iu|u+SP1+lu7z+**stL0{ljae zWaz{SBqW4WDm14^xRp1SkY}!{ps1Z*Y!C1DcmPcwwN%KW5FOmM1xR1bDG`qvrr7X0 zubGQU%Y$2+Hr+qGmP)%7NJvaps?!$2@um{;l>X28e}26mIYlM+)KO7GHhQdyV<0Fk zhK!H}{P}j@dW);!%*B;F^h;!)fUmO0;MLb8;f>)Nr=&K}vZH}shMP{_n47WdhGwe8 z=4wCE=_MHU5zrVPg0;bq*}!+eh#Feo%~)N$G{Q)IRGtkQFQszpm5}oX@ii_|_rQ(^ zjI?kw1^MU$_C)4N9f&Kur^V#3vHjqd9bl@uaROlbfvvX+Jv2l8(olV|&8S@*JBAio ztE3#oDkV(qu6e)nSEmR{N>j8aNvH>LBL@NV95SPn48E@~Ru1PpmD&eyRWL_%^Z^`t zzq8Rf&ta3rW6!G0q)E5X5(LrTLV8>Beyq29< zpM;yb!Njx7d-#%nmL+(4!f(3cm{98Ol%R03x9S}gBdVu^cg{HP^V}(^{ZN1DFMty4 zv4AH5HykDtq_%!!X8}_olZiHaD5dpgDug({gVMn9_fz?dTb+cW9HLUedmogtt|`SK zUrQKzWBOuqzZK}TBiRBw8i*=@C~pAw3fCnD8HRmW$-~$er@tT=<{GoCdwQ?yc`)AM z+rUh~&Pb}z1uIoTM>CzZt4+X3MPEn~D!(=f#q6bwrYVYIa#|_v2fR#tZ@^IZyDUNI zxwuygdwHsb=2nM#Yb#awH9CW$>0Q83E10AqKV@sHL-eL^=0g00!?S)4HCc3UeFebI z4HOfeFS1f$ncw<@xA_#77BjrQ2M>O06O{C)g!f6pur3J&cId{Q0mJEH&|8VOtMPrI zHMQxM;L<^@Tp;p=DDM=bm6S)G=S85>i@D9Jtufwd-|X=UhTUV>#pzBd#Bl*=!GZyr z4XMe@2P`vKt);ZljnxDNy8!scDqyPexrSxYvH4IiF2uhLzNok-^8MwP<(#9e&Mwli z;{h+9QE^og3h+vs_U9Q8sAAgf1T)tun}y_%y_mdB!voSpT)dq$ce@r20pmiyg(D-w zDXLK1ASx7{UOen6m$zFN^rF(yfQ=~maT01N(LgQb%cOCwt&QGw6N-`weivfbPCbn- zShZ+Zi;r5yT}ZcuMOoC4zb<=Vrut=k4E`^ljaAATb_!9Ug?>E}@=^?TiSPDheN2jJ z-%U_HZJv1&^*p$c_bU@HXghC}RJOa zyq=rfI3C86D!!vd3H7j|m5>{mn&jUA%w!Ff4c?i)H!huFS*-7|MGyfPoK;G@`wa{$ zk4t`V+aok=Vbsdqrp@)^BUb=}iF!c~cQt(esf0eCJ^u;20RWZ5&hS6IUS4t+48TjL zxK&Fqu-S!8K1GyDhZv)ex%81H zH1KXTU}}e5tSj(uf0vV<`0T7+l#aN^K1f?Qr8{v0371eEuEYU`Svn8$FAnBuL~Y~D z)&aB*Wf1(mgV4Sy_WShr@h)N;-L{#UrrM^0Y4mP8!HEt|QE7<_$66#5gI2yh*pbwB z#`$Ml-{2Mb6EL|H8K(k2zef$rfA`U*!{E&)f4^QUUtS#%7F-EGJEPO)bVq8os5c*Z zC<^O}maPOZT7_AZzu@)TMDXrBhFqSJu}ZsVcoh#$%?oWKX7ycNu0ukOX?pG0XM7eq zKsq{R-B4iG>K+m0=^2G~O!o(2dzc{!T(|fUV0y-HV?)GZ{as^#cR=UI^-AunKd-s~K;>%i5^Xo5YZ|$L=$#p>s(uD_LLpD^D)j?g=vexp<63S}D)dKm{w~*_!d+M;kChNB;_bFi z+c!+q0Dt$iebL~3cU=}@f<3>+BBageKH6`WPvW9d-I0ruuR}sEATHPobtZuAPP{3s zfNO2h$LP&CL&3%7I1zXK0HzV=KAVFL=b}uAJwwrJtK=~k1H4rJ{C9`L%vQ-0;)AHegoo=$xd#XJq2aS1b2n7DYCpE`2j%&3(f&bk!hJ>fG6 z<#Kv51z6{>)~$3j6}(pRJ??&11@u^i7)r5ew654?Xra@}!$-ZSTx|aM+qEU!Om^|@ z`75xjG8jUK5VY26$Fk%xIL!^N9!ZrvaEHuvhR zy=$Tv`e8n(p&0b(5+;D{0z?^HzWS+5Sh1A>V@O8^#-Kc0Ou}Be4|~Rin2rDYl_eB| zRi0f0C<@j#RW*)X>a+1N1}n3OU4g&vFMBZlO#W0or2DqE@)`a8xGS~xmIbZ`dRNtr znV|92*l1og6h=m1N3pe1d0z6f^{;BFanC49@$<6q#LMp?y01xyK*0v%)6w?b5O}B7 zCm{puTw1hVLc=aZTbTVfPYjxQ5CHO+Q+h()KP)wl&q zlmes0x^7Lh8duBe8E2KOz9}JI*&0l0v`YuNO;t_Lw9_;-Ri6vnad^>Cn4?pMsprY_ zv#f<2x50T}h4n+t#V>3&FFnftH1fnr9Pj(Qn{gK)dgHYUEn6X7)DlmYT~I>LKR7bg z2dT7&Yi>tVc~CiaVcG;sK$5X@D21}vfIH0vGEYrf0dX;?Ufdn6GT$!1&to!Bhv>%k z?IaYy!nO};N$CJYoRF=UqLRwjXJ`=OVzx?4`7$`(^-Y^D%RJB1(DVlBnmN8740pPR zjCC&PWkKU3uoVKVa%rg4@(!n+CpI4L+9aP$}8<5Xe>m{#FNY1C` zez@18a_*a%nN2;oT_}|P;e9~kaylSOXtyWz;HNx7`EAUCnXBNvPj?KJFH5l2O7%h- zE3?0W`}9N&hUp&II=OHsc^mA!d7Fj67)Yt$I&3(4x}Jnw)Lz}LUJEdFC}JMmyrhko z*)n)@&oVN8LqbuQsCO&Np}#9OFez5hW^<;C571QXVKFjIK%J&xFg|4=+}J?DT6SFt#T=G!+d@&><_6pxGVU{_ zvbq*uQjiZ`V<2dn^ba4ksJS#0|CGG}G~UWQ!!LN}UEez-Ca_@$>*Jql$OWY8Wczx1 z!Yo#17fu6m=6fJ}T)L>Wl=>NKgYTzy_b$1vgsC*q0J}AZ^_YTez7z`PPIBKfIH5u% zO<5NDv`7iISo%=QJ`^sJshj=N`h>DuXb)Z$l#w_em2uuXgAvfrr`KFnLSB}=*1xgU z1936p^kEfUOoJXOfKzg2R$>3J4PPjPI~QN@E|ZI*3JV}^`bQORyt;&je{7Z|IOhdPe%=Xr#jmz%;H za`3Sv6pfV**qsnCX?c`|qHIvX`1QH%P}wC+R(3^uf!+kG7VG=Dd~;SpY&Jz7$-xJc zP)t@ExTCtNJj%jclhD3n@V%dA{Nma9DPU{7&8>Pf7nuUjb%bEpLqQUj%{@7|o004e zHE8lu+U?WXWR{`M*A?!UA&L1u}pTE#=N;&7gsLz}A!@T!MD1S69pB^8S9cy1u^tz1f^A09LE}`@-Ss>hf~2Ufrc)(ntxi)=MTk)41T!iA=EV*5FU(1_)A3CP2tV$da=0N zPT_70SEcJlb8b~ymK`h{ii(Anup7cj2;b}x&N_sAt=F3w5b7S4LS3X{Xo#*sfT|E! zf^ch42zf8leX9rIY>)6wbqSAz@GS^?4~0eHO;N}eE~T)vlEk)h?!E{tElUhxF?dr9 z{`E+BezHgSRtS$OOL!O&z8*lx6y9v7kS)Yvn>i-}@faPrMnU*GB0Q`j9R5b3DdZqU zAq)-CwFnS`7~~k$5DtH#7=bW;D2#7r^iaqYCWUS0Tr$WI>X9(Mmx-SVM-=j=nr%=y@fuSHansXumK|K#*kRj|{qx_n% zj*y4Kfhp`1GKOL(hwbLvTm&_P7}PPEhmc3YI>LiKLSD^i3VR9*LmW1oa|jf{WRTY~ zeS`;fgxsTP3U!c5p%`in<*;dq&i*7Y5ZoIa7(%YmI>P=G@>D2=Y@xa@9HR{3EL@`?tUeUxDMXNL4*58kUuqb2;8ACBF4h0d3t>&BvYGB{!gL0AG|P{>6phQT2cq1a^3o#HPF6v1RLzLu#X99F0Y zLm0}TAVRU#oICIQNgxF420>WAM>$BNLKw;+5V6=^&Y@2L5eUI(kYluRje;;f6()r+ z3=Xl_Y|fn!0wI_U)`u`7%nD(MLnJ!q{;v=S!6Acngms0-$9;xCbj|^=PcR#-3}Hf; z6pA5hsNRt=I^zQ%1ew8Pa0J3(g^VE%1rdtQIY7KXV3@&?21y8$LdLK-gdq~0bNDMk zuwZ#zF$lu?L7Ei8P!0tVi_Tde05yUT%mx|4I>MwdGQ^=I%A#{l7UU0skst;c!m$X4 z6*7lN#A4GqhX&C=;GjVePEsg_I7DKhh{k4fZtGx|aLgb$(O^~xLmUE86rFSE10Vt+ zINo4Yp%~&2h@$A66Tbiuf>RBmaF8L*h#CaxTw)-A5LA&M2B#^6ArPVHoP%Ekh`@;k zQ5YHGFiUjKWq%Tw2+H6Dg_)rxI#=^n?oTIjeR4d(Q$GLz002ovPDHLkV1iBtNtOTr diff --git a/docs/reference/api/docker-io_api.md b/docs/reference/api/docker-io_api.md deleted file mode 100644 index 9f72f0e2b1..0000000000 --- a/docs/reference/api/docker-io_api.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -published: false -title: "Docker Hub API" -description: "API Documentation for the Docker Hub API" -keywords: "API, Docker, index, REST, documentation, Docker Hub, registry" ---- - - - -# Docker Hub API - -This API is deprecated as of 1.7. To view the old version, see the [Docker Hub -API](https://docs.docker.com/v1.7/docker/reference/api/docker-io_api/) in the 1.7 documentation. diff --git a/docs/reference/api/docker_io_accounts_api.md b/docs/reference/api/docker_io_accounts_api.md deleted file mode 100644 index cf73d62890..0000000000 --- a/docs/reference/api/docker_io_accounts_api.md +++ /dev/null @@ -1,281 +0,0 @@ ---- -title: "docker.io accounts API" -description: "API Documentation for docker.io accounts." -keywords: "API, Docker, accounts, REST, documentation" ---- - - - -# docker.io accounts API - -## Get a single user - -`GET /api/v1.1/users/:username/` - -Get profile info for the specified user. - -Parameters: - -- **username** – username of the user whose profile info is being - requested. - -Request Headers: - -- **Authorization** – required authentication credentials of - either type HTTP Basic or OAuth Bearer Token. - -Status Codes: - -- **200** – success, user data returned. -- **401** – authentication error. -- **403** – permission error, authenticated user must be the user - whose data is being requested, OAuth access tokens must have - `profile_read` scope. -- **404** – the specified username does not exist. - -**Example request**: - - GET /api/v1.1/users/janedoe/ HTTP/1.1 - Host: www.docker.io - Accept: application/json - Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "id": 2, - "username": "janedoe", - "url": "https://www.docker.io/api/v1.1/users/janedoe/", - "date_joined": "2014-02-12T17:58:01.431312Z", - "type": "User", - "full_name": "Jane Doe", - "location": "San Francisco, CA", - "company": "Success, Inc.", - "profile_url": "https://docker.io/", - "gravatar_url": "https://secure.gravatar.com/avatar/0212b397124be4acd4e7dea9aa357.jpg?s=80&r=g&d=mm" - "email": "jane.doe@example.com", - "is_active": true - } - -## Update a single user - -`PATCH /api/v1.1/users/:username/` - -Update profile info for the specified user. - -Parameters: - -- **username** – username of the user whose profile info is being - updated. - -Json Parameters: - -- **full_name** (*string*) – (optional) the new name of the user. -- **location** (*string*) – (optional) the new location. -- **company** (*string*) – (optional) the new company of the user. -- **profile_url** (*string*) – (optional) the new profile url. -- **gravatar_email** (*string*) – (optional) the new Gravatar - email address. - -Request Headers: - -- **Authorization** – required authentication credentials of - either type HTTP Basic or OAuth Bearer Token. -- **Content-Type** – MIME Type of post data. JSON, url-encoded - form data, etc. - -Status Codes: - -- **200** – success, user data updated. -- **400** – post data validation error. -- **401** – authentication error. -- **403** – permission error, authenticated user must be the user - whose data is being updated, OAuth access tokens must have - `profile_write` scope. -- **404** – the specified username does not exist. - -**Example request**: - - PATCH /api/v1.1/users/janedoe/ HTTP/1.1 - Host: www.docker.io - Accept: application/json - Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= - - { - "location": "Private Island", - "profile_url": "http://janedoe.com/", - "company": "Retired", - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "id": 2, - "username": "janedoe", - "url": "https://www.docker.io/api/v1.1/users/janedoe/", - "date_joined": "2014-02-12T17:58:01.431312Z", - "type": "User", - "full_name": "Jane Doe", - "location": "Private Island", - "company": "Retired", - "profile_url": "http://janedoe.com/", - "gravatar_url": "https://secure.gravatar.com/avatar/0212b397124be4acd4e7dea9aa357.jpg?s=80&r=g&d=mm" - "email": "jane.doe@example.com", - "is_active": true - } - -## List email addresses for a user - -`GET /api/v1.1/users/:username/emails/` - -List email info for the specified user. - -Parameters: - -- **username** – username of the user whose profile info is being - updated. - -Request Headers: - -- **Authorization** – required authentication credentials of - either type HTTP Basic or OAuth Bearer Token - -Status Codes: - -- **200** – success, user data updated. -- **401** – authentication error. -- **403** – permission error, authenticated user must be the user - whose data is being requested, OAuth access tokens must have - `email_read` scope. -- **404** – the specified username does not exist. - -**Example request**: - - GET /api/v1.1/users/janedoe/emails/ HTTP/1.1 - Host: www.docker.io - Accept: application/json - Authorization: Bearer zAy0BxC1wDv2EuF3tGs4HrI6qJp6KoL7nM - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "email": "jane.doe@example.com", - "verified": true, - "primary": true - } - ] - -## Add email address for a user - -`POST /api/v1.1/users/:username/emails/` - -Add a new email address to the specified user's account. The email -address must be verified separately, a confirmation email is not -automatically sent. - -Json Parameters: - -- **email** (*string*) – email address to be added. - -Request Headers: - -- **Authorization** – required authentication credentials of - either type HTTP Basic or OAuth Bearer Token. -- **Content-Type** – MIME Type of post data. JSON, url-encoded - form data, etc. - -Status Codes: - -- **201** – success, new email added. -- **400** – data validation error. -- **401** – authentication error. -- **403** – permission error, authenticated user must be the user - whose data is being requested, OAuth access tokens must have - `email_write` scope. -- **404** – the specified username does not exist. - -**Example request**: - - POST /api/v1.1/users/janedoe/emails/ HTTP/1.1 - Host: www.docker.io - Accept: application/json - Content-Type: application/json - Authorization: Bearer zAy0BxC1wDv2EuF3tGs4HrI6qJp6KoL7nM - - { - "email": "jane.doe+other@example.com" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "email": "jane.doe+other@example.com", - "verified": false, - "primary": false - } - -## Delete email address for a user - -`DELETE /api/v1.1/users/:username/emails/` - -Delete an email address from the specified user's account. You -cannot delete a user's primary email address. - -Json Parameters: - -- **email** (*string*) – email address to be deleted. - -Request Headers: - -- **Authorization** – required authentication credentials of - either type HTTP Basic or OAuth Bearer Token. -- **Content-Type** – MIME Type of post data. JSON, url-encoded - form data, etc. - -Status Codes: - -- **204** – success, email address removed. -- **400** – validation error. -- **401** – authentication error. -- **403** – permission error, authenticated user must be the user - whose data is being requested, OAuth access tokens must have - `email_write` scope. -- **404** – the specified username or email address does not - exist. - -**Example request**: - - DELETE /api/v1.1/users/janedoe/emails/ HTTP/1.1 - Host: www.docker.io - Accept: application/json - Content-Type: application/json - Authorization: Bearer zAy0BxC1wDv2EuF3tGs4HrI6qJp6KoL7nM - - { - "email": "jane.doe+other@example.com" - } - -**Example response**: - - HTTP/1.1 204 NO CONTENT - Content-Length: 0 diff --git a/docs/reference/api/docker_remote_api_v1.25.md b/docs/reference/api/docker_remote_api_v1.25.md deleted file mode 100644 index 04b85a2749..0000000000 --- a/docs/reference/api/docker_remote_api_v1.25.md +++ /dev/null @@ -1,6163 +0,0 @@ ---- -title: "Remote API v1.25" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" ---- - - - -# Docker Remote API v1.25 - -# 1. Brief introduction - - - The Remote API has replaced `rcli`. - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - -# 2. Errors - -The Remote API uses standard HTTP status codes to indicate the success or failure of the API call. The body of the response will be JSON in the following format: - - { - "message": "page not found" - } - -The status codes that are returned for each endpoint are specified in the endpoint documentation below. - -# 3. Endpoints - -## 3.1 Containers - -### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.25/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 1", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:02" - } - } - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 222222", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.8", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:08" - } - } - }, - "Mounts": [] - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "State": "Exited", - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.6", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:06" - } - } - }, - "Mounts": [] - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.5", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:05" - } - } - }, - "Mounts": [] - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`removing`|`paused`|`exited`|`dead`) - - `label=key` or `label="key=value"` of a container label - - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only) - `id=` a container's ID - `name=` a container's name - `is-task=`(`true`|`false`) - - `ancestor`=(`[:]`, `` or ``) - - `before`=(`` or ``) - - `since`=(`` or ``) - - `volume`=(`` or ``) - - `network`=(`` or ``) - - `health`=(`starting`|`healthy`|`unhealthy`|`none`) - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.25/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": "", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "StopSignal": "SIGTERM", - "StopTimeout": 10, - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Tmpfs": { "/run": "rw,noexec,nosuid,size=65536k" }, - "Links": ["redis3:redis"], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "NanoCPUs": 500000, - "CpuCount": 4, - "CpuPercent": 80, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuRealtimePeriod": 1000000, - "CpuRealtimeRuntime": 10000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "IOMaximumBandwidth": 0, - "IOMaximumIOps": 0, - "BlkioWeight": 300, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceWriteIOps": [{}], - "MemorySwappiness": 60, - "OomKillDisable": false, - "OomScoreAdj": 500, - "PidMode": "", - "PidsLimit": -1, - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsOptions": [""], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "AutoRemove": true, - "NetworkMode": "bridge", - "Devices": [], - "Sysctls": { "net.ipv4.ip_forward": "1" }, - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "StorageOpt": {}, - "CgroupParent": "", - "VolumeDriver": "", - "ShmSize": 67108864, - "Mounts": [] - }, - "NetworkingConfig": { - "EndpointsConfig": { - "isolated_nw" : { - "IPAMConfig": { - "IPv4Address":"172.20.30.33", - "IPv6Address":"2001:db8:abcd::3033", - "LinkLocalIPs":["169.254.34.68", "fe80::3468"] - }, - "Links":["container_1", "container_2"], - "Aliases":["server_x", "server_y"] - } - } - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. This must be a valid RFC 1123 hostname. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. If the array consists of exactly one empty string (`[""]`) then the entry point - is reset to system default (i.e., the entry point used by docker when there is no `ENTRYPOINT` - instruction in the Dockerfile). -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **StopSignal** - Signal to stop a container as a string or unsigned integer. `SIGTERM` by default. -- **StopTimeout** - Timeout (in seconds) to stop a container. 10 by default. -- **HostConfig** - - **Binds** – A list of volume bindings for this container. Each volume binding is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - + `volume-name:container-dest` to bind-mount a volume managed by a - volume driver into the container. `container-dest` must be an - _absolute_ path. - + `volume-name:container-dest:ro` to mount the volume read-only - inside the container. `container-dest` must be an _absolute_ path. - - **Tmpfs** – A map of container directories which should be replaced by tmpfs mounts, and their corresponding - mount options. A JSON object in the form `{ "/run": "rw,noexec,nosuid,size=65536k" }`. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **MemoryReservation** - Memory soft limit in bytes. - - **KernelMemory** - Kernel memory limit in bytes. - - **NanoCPUs** - CPU quota in units of 10-9 CPUs. The default value is 0, which means there is no limit. - - **CpuCount** - An integer value containing the number of usable CPUs. - Windows daemon only. On Windows Server containers, - the processor resource controls are mutually exclusive, the order of precedence - is CPUCount first, then CPUShares, and CPUPercent last. - - **CpuPercent** - An integer value containing the usable percentage of - the available CPUs. Windows daemon only. On Windows Server containers, - the processor resource controls are mutually exclusive, the order of precedence - is CPUCount first, then CPUShares, and CPUPercent last. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuRealtimePeriod** - The length of a CPU real-time period in microseconds (0=no time allocated for rt tasks) - - **CpuRealtimeRuntime** - The length of a CPU real-time runtime in microseconds (0=no time allocated for rt tasks) - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **IOMaximumBandwidth** - Maximum IO absolute rate in terms of IOps. - - **IOMaximumIOps** - Maximum IO absolute rate in terms of bytes per second. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **BlkioWeightDevice** - Block IO weight (relative device weight) in the form of: `"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]` - - **BlkioDeviceReadBps** - Limit read rate (bytes per second) from a device in the form of: `"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceWriteBps** - Limit write rate (bytes per second) to a device in the form of: `"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceReadIOps** - Limit read rate (IO per second) from a device in the form of: `"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **BlkioDeviceWiiteIOps** - Limit write rate (IO per second) to a device in the form of: `"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **OomScoreAdj** - An integer value containing the score given to the container in order to tune OOM killer preferences. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PidsLimit** - Tune a container's pids limit. Set -1 for unlimited. - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsOptions** - A list of DNS options - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart, `"unless-stopped"` to restart always except when - user has manually stopped the container or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **AutoRemove** - Boolean value, set to `true` to automatically remove the container on daemon side - when the container's process exits. Note that `RestartPolicy` other than `none` is exclusive to `AutoRemove`. - - **UsernsMode** - Sets the usernamespace mode for the container when usernamespace remapping option is enabled. - supported values are: `host`. - - **NetworkMode** - Sets the networking mode for the container. Supported - standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken - as a custom network's name to which this container should connect to. - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **Sysctls** - A list of kernel parameters (sysctls) to set in the container, specified as - `{ : }`, for example: - `{ "net.ipv4.ip_forward": "1" }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **StorageOpt**: Storage driver options per container. Options can be passed in the form - `{"size":"120G"}` - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - - **VolumeDriver** - Driver that this container users to mount volumes. - - **ShmSize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. - - **Mounts** – Specification for mounts to be added to the container. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, `volume`, or `tmpfs`). - Available types (for the `Type` field): - - **bind** - Mounts a file or directory from the host into the container. Must exist prior to creating the container. - - **volume** - Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed. - - **tmpfs** - Create a tmpfs with the given options. The mount source cannot be specified for tmpfs. - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type. - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume as key/value pairs: `{"name": "value"}` - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume. - - **Options** - key/value map of driver specific options. - - **TmpfsOptions** – Optional configuration for the `tmpfs` type. - - **SizeBytes** – The size for the tmpfs mount in bytes. - - **Mode** – The permission mode for the tmpfs mount in an integer. - - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.25/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "StopSignal": "SIGTERM", - "StopTimeout": 10 - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "IOMaximumBandwidth": 0, - "IOMaximumIOps": 0, - "BlkioWeight": 0, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteIOps": [{}], - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuCount": 4, - "CpuPercent": 80, - "CpuShares": 0, - "CpuPeriod": 100000, - "CpuRealtimePeriod": 1000000, - "CpuRealtimeRuntime": 10000, - "Devices": [], - "Dns": null, - "DnsOptions": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "OomKillDisable": false, - "OomScoreAdj": 500, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "AutoRemove": true, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "Sysctls": { - "net.ipv4.ip_forward": "1" - }, - "StorageOpt": null, - "VolumesFrom": null, - "Ulimits": [{}], - "VolumeDriver": "", - "ShmSize": 67108864, - "Mounts": [] - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Dead": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z", - "Status": "running" - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - } - -**Example request, with size information**: - - GET /v1.25/containers/4fa6e0f0c678/json?size=1 HTTP/1.1 - -**Example response, with size information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - -**Query parameters**: - -- **size** – 1/True/true or 0/False/false, return container size information. Default is `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.25/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.25/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.25/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **details** - 1/True/true or 0/False/flase, Show extra details provided to logs. Default `false`. -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.25/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.25/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.25/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "pids_stats": { - "current": 3 - }, - "networks": { - "eth0": { - "rx_bytes": 5338, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 36, - "tx_bytes": 648, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 8 - }, - "eth5": { - "rx_bytes": 4641, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 26, - "tx_bytes": 690, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 9 - } - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Resize a container TTY - -`POST /containers/(id or name)/resize` - -Resize the TTY for container with `id`. The unit is number of characters. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.25/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Update a container - -`POST /containers/(id or name)/update` - -Update configuration of one or more containers. - -**Example request**: - - POST /v1.25/containers/e90e34656806/update HTTP/1.1 - Content-Type: application/json - - { - "BlkioWeight": 300, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuRealtimePeriod": 1000000, - "CpuRealtimeRuntime": 10000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0", - "Memory": 314572800, - "MemorySwap": 514288000, - "MemoryReservation": 209715200, - "KernelMemory": 52428800, - "RestartPolicy": { - "MaximumRetryCount": 4, - "Name": "on-failure" - }, - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": [] - } - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.25/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.25/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **409** - container is paused -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.25/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.25/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.25/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.25/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /v1.25/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - - -### Prune stopped containers - -`POST /containers/prune` - -Delete stopped containers - -**Example request**: - - POST /v1.25/containers/prune HTTP/1.1 - Content-Type: application/json - - { - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ContainersDeleted": [ - "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148" - ], - "SpaceReclaimed": 109 - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -## 3.2 Images - -### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.25/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.25/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label - - `before`=(`[:]`, `` or ``) - - `since`=(`[:]`, `` or ``) - - `reference`=(`[:]`) - -### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.25/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. - You can provide one or more `t` parameters. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **cachefrom** - JSON array of images used for build cache resolution. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. -- **buildargs** – JSON map of string pairs for build-time variables. Users pass - these values at build-time. Docker uses the `buildargs` as the environment - context for command(s) run via the Dockerfile's `RUN` instruction or for - variable expansion in other Dockerfile instructions. This is not meant for - passing secret values. [Read more about the buildargs instruction](../../reference/builder.md#arg) -- **shmsize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. -- **squash** - squash the resulting images layers into a single layer (boolean) **Experimental Only** -- **labels** – JSON map of string pairs for labels to set on the image. -- **networkmode** - Sets the networking mode for the run commands during - build. Supported standard values are: `bridge`, `host`, `none`, and - `container:`. Any other value is taken as a custom network's - name to which this container should connect to. - - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.25/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status":"Pulling from library/busybox","id":"latest"} - {"status":"Pulling fs layer","progressDetail":{},"id":"8ddc19f16526"} - {"status":"Downloading","progressDetail":{"current":15881,"total":667590},"progress":"[=\u003e ] 15.88 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Downloading","progressDetail":{"current":556269,"total":667590},"progress":"[=========================================\u003e ] 556.3 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Download complete","progressDetail":{},"id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":32768,"total":667590},"progress":"[==\u003e ] 32.77 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":491520,"total":667590},"progress":"[====================================\u003e ] 491.5 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":667590,"total":667590},"progress":"[==================================================\u003e] 667.6 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":667590,"total":667590},"progress":"[==================================================\u003e] 667.6 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Pull complete","progressDetail":{},"id":"8ddc19f16526"} - {"status":"Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6"} - {"status":"Status: Downloaded newer image for busybox:latest"} - ... - -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 parameters**: - -- **fromImage** – Name of the image to pull. The name may include a tag or - digest. This parameter may only be used when pulling an image. - The pull is cancelled if the HTTP connection is closed. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. - This parameter may only be used when importing an image. -- **repo** – Repository name given to an image when it is imported. - The repo may include a tag. This parameter may only be used when importing - an image. -- **tag** – Tag or digest. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com" - } - ``` - - - Token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **500** – server error - - - -### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.25/images/example/json HTTP/1.1 - -**Example response (Linux daemon)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", - "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", - "Comment" : "", - "Os" : "linux", - "Architecture" : "amd64", - "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "ContainerConfig" : { - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Domainname" : "", - "AttachStdout" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "NetworkDisabled" : false, - "OnBuild" : [], - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "User" : "", - "WorkingDir" : "", - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "Labels" : { - "com.example.license" : "GPL", - "com.example.version" : "1.0", - "com.example.vendor" : "Acme" - }, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts" : null, - "Cmd" : [ - "/bin/sh", - "-c", - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - ] - }, - "DockerVersion" : "1.9.0-dev", - "VirtualSize" : 188359297, - "Size" : 0, - "Author" : "", - "Created" : "2015-09-10T08:30:53.26995814Z", - "GraphDriver" : { - "Name" : "aufs", - "Data" : null - }, - "RepoDigests" : [ - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags" : [ - "example:1.0", - "example:latest", - "example:stable" - ], - "Config" : { - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "NetworkDisabled" : false, - "OnBuild" : [], - "StdinOnce" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "Domainname" : "", - "AttachStdout" : false, - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Cmd" : [ - "/bin/bash" - ], - "ExposedPorts" : null, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Labels" : { - "com.example.vendor" : "Acme", - "com.example.version" : "1.0", - "com.example.license" : "GPL" - }, - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "WorkingDir" : "", - "User" : "" - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ] - } - } - -**Example response (Windows daemon)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "sha256:105d76d0f40e38427c63023ffe649bf36fa85058d3469551e43e4dcc2431fb31", - "RepoTags": [ - "microsoft/nanoserver:latest" - ], - "RepoDigests": [ - "microsoft/nanoserver@sha256:aee7d4330fe3dc5987c808f647441c16ed2fa1c7d9c6ef49d6498e5c9860b50b" - ], - "Parent": "", - "Comment": "", - "Created": "2016-09-22T02:39:30.9154862-07:00", - "Container": "", - "ContainerConfig": { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": null, - "Image": "", - "Volumes": null, - "WorkingDir": "", - "Entrypoint": null, - "OnBuild": null, - "Labels": null - }, - "DockerVersion": "", - "Author": "", - "Config": { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "c:\\windows\\system32\\cmd.exe" - ], - "Image": "", - "Volumes": null, - "WorkingDir": "", - "Entrypoint": null, - "OnBuild": null, - "Labels": null - }, - "Architecture": "", - "Os": "windows", - "OsVersion": "10.0.14393", - "Size": 651862727, - "VirtualSize": 651862727, - "GraphDriver": { - "Name": "windowsfilter", - "Data": { - "dir": "C:\\control\\windowsfilter\\6fe6a289b98276a6a5ca0345156ca61d7b38f3da6bb49ef95af1d0f1ac37e5bf" - } - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:342d4e407550c52261edd20cd901b5ce438f0b1e940336de3978210612365063" - ] - } - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.25/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.25/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -The push is cancelled if the HTTP connection is closed. - -**Example request**: - - POST /v1.25/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com", - } - ``` - - - Identity token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.25/images/test/tag?repo=myrepo&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.25/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.25/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search -- **limit** – maximum returned search results -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `stars=` - - `is-automated=(true|false)` - - `is-official=(true|false)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Prune unused images - -`POST /images/prune` - -Delete unused images - -**Example request**: - - POST /v1.25/images/prune HTTP/1.1 - Content-Type: application/json - - { - "DanglingOnly": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ImagesDeleted": [ - { - "Untagged": "busybox:latest" - }, - { - "Untagged": "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6" - }, - { - "Deleted": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749" - }, - { - "Deleted": "sha256:8ac8bfaff55af948c796026ee867448c5b5b5d9dd3549f4006d9759b25d4a893" - } - ], - "SpaceReclaimed": 1092588 - } - -**JSON parameters**: - -- **DanglingOnly**: if `true` only delete unused *and* untagged images. Default to `false` if omitted - -**Status codes**: - -- **200** – no error -- **500** – server error - - -## 3.3 Misc - -### Check auth configuration - -`POST /auth` - -Validate credentials for a registry and get identity token, -if available, for accessing the registry without password. - -**Example request**: - - POST /v1.25/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - - { - "Status": "Login Succeeded", - "IdentityToken": "9cbaf023786cd7..." - } - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.25/info HTTP/1.1 - -**Example response (Linux)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Architecture": "x86_64", - "ClusterStore": "etcd://localhost:2379", - "CgroupDriver": "cgroupfs", - "Containers": 11, - "ContainersRunning": 7, - "ContainersStopped": 3, - "ContainersPaused": 1, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelMemory": true, - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OSType": "linux", - "OperatingSystem": "Boot2Docker", - "Plugins": { - "Volume": [ - "local" - ], - "Network": [ - "null", - "host", - "bridge" - ] - }, - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "SecurityOptions": [ - { - "Key": "Name", - "Value": "seccomp" - }, - { - "Key": "Profile", - "Value": "default" - }, - { - "Key": "Name", - "Value": "apparmor" - }, - { - "Key": "Name", - "Value": "selinux" - }, - { - "Key": "Name", - "Value": "userns" - } - ], - "ServerVersion": "1.9.0", - "SwapLimit": false, - "SystemStatus": [["State", "Healthy"]], - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - - -**Example response (Windows)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ID": "NYMS:B5VK:UMSL:FVDZ:EWB5:FKVK:LPFL:FJMQ:H6FT:BZJ6:L2TD:XH62", - "Containers": 1, - "ContainersRunning": 0, - "ContainersPaused": 0, - "ContainersStopped": 1, - "Images": 17, - "Driver": "windowsfilter", - "DriverStatus": [ - ["Windows", ""] - ], - "SystemStatus": null, - "Plugins": { - "Volume": ["local"], - "Network": ["nat", "null", "overlay"], - "Authorization": null - }, - "MemoryLimit": false, - "SwapLimit": false, - "KernelMemory": false, - "CpuCfsPeriod": false, - "CpuCfsQuota": false, - "CPUShares": false, - "CPUSet": false, - "IPv4Forwarding": true, - "BridgeNfIptables": true, - "BridgeNfIp6tables": true, - "Debug": false, - "NFd": -1, - "OomKillDisable": false, - "NGoroutines": 11, - "SystemTime": "2016-09-23T11:59:58.9843533-07:00", - "LoggingDriver": "json-file", - "CgroupDriver": "", - "NEventsListener": 0, - "KernelVersion": "10.0 14393 (14393.206.amd64fre.rs1_release.160912-1937)", - "OperatingSystem": "Windows Server 2016 Datacenter", - "OSType": "windows", - "Architecture": "x86_64", - "IndexServerAddress": "https://index.docker.io/v1/", - "RegistryConfig": { - "InsecureRegistryCIDRs": ["127.0.0.0/8"], - "IndexConfigs": { - "docker.io": { - "Name": "docker.io", - "Mirrors": null, - "Secure": true, - "Official": true - } - }, - "Mirrors": null - }, - "NCPU": 8, - "MemTotal": 4293828608, - "DockerRootDir": "C:\\control", - "HttpProxy": "", - "HttpsProxy": "", - "NoProxy": "", - "Name": "WIN-V0V70C0LU5P", - "Labels": null, - "ExperimentalBuild": false, - "ServerVersion": "1.13.0", - "ClusterStore": "", - "ClusterAdvertise": "", - "SecurityOptions": null, - "Runtimes": null, - "DefaultRuntime": "", - "Swarm": { - "NodeID": "", - "NodeAddr": "", - "LocalNodeState": "inactive", - "ControlAvailable": false, - "Error": "", - "RemoteManagers": null, - "Nodes": 0, - "Managers": 0, - "Cluster": { - "ID": "", - "Version": {}, - "CreatedAt": "0001-01-01T00:00:00Z", - "UpdatedAt": "0001-01-01T00:00:00Z", - "Spec": { - "Orchestration": {}, - "Raft": { - "ElectionTick": 0, - "HeartbeatTick": 0 - }, - "Dispatcher": {}, - "CAConfig": {}, - "TaskDefaults": {} - } - } - }, - "LiveRestoreEnabled": false, - "Isolation": "process" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Show docker data usage information - -`GET /system/df` - -Return docker data usage information - -**Example request**: - - GET /v1.25/system/df HTTP/1.1 - -**Example response**: - - { - "LayersSize": 1092588, - "Images": [ - { - "Id": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749", - "ParentId": "", - "RepoTags": [ - "busybox:latest" - ], - "RepoDigests": [ - "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6" - ], - "Created": 1466724217, - "Size": 1092588, - "SharedSize": 0, - "VirtualSize": 1092588, - "Labels": {}, - "Containers": 1 - } - ], - "Containers": [ - { - "Id": "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148", - "Names": [ - "/top" - ], - "Image": "busybox", - "ImageID": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749", - "Command": "top", - "Created": 1472592424, - "Ports": [], - "SizeRootFs": 1092588, - "Labels": {}, - "State": "exited", - "Status": "Exited (0) 56 minutes ago", - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "d687bc59335f0e5c9ee8193e5612e8aee000c8c62ea170cfb99c098f95899d92", - "EndpointID": "8ed5115aeaad9abb174f68dcf135b49f11daf597678315231a32ca28441dec6a", - "Gateway": "172.18.0.1", - "IPAddress": "172.18.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Mounts": [] - } - ], - "Volumes": [ - { - "Name": "my-volume", - "Driver": "local", - "Mountpoint": "", - "Labels": null, - "Scope": "", - "Options": null - "UsageData": { - "Size": 0, - "RefCount": 0 - } - } - ] - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.25/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.13.0", - "Os": "linux", - "KernelVersion": "3.19.0-23-generic", - "GoVersion": "go1.6.3", - "GitCommit": "deadbee", - "Arch": "amd64", - "ApiVersion": "1.25", - "MinAPIVersion": "1.12", - "BuildTime": "2016-06-14T07:09:13.444803460+00:00", - "Experimental": true - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.25/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.25/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, load, pull, push, save, tag, untag - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -Docker daemon report the following event: - - reload - -**Example request**: - - GET /v1.25/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Server: Docker/1.13.0 (linux) - Date: Fri, 29 Apr 2016 15:18:06 GMT - Transfer-Encoding: chunked - - { - "status": "pull", - "id": "alpine:latest", - "Type": "image", - "Action": "pull", - "Actor": { - "ID": "alpine:latest", - "Attributes": { - "name": "alpine" - } - }, - "time": 1461943101, - "timeNano": 1461943101301854122 - } - { - "status": "create", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "create", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101381709551 - } - { - "status": "attach", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "attach", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101383858412 - } - { - "Type": "network", - "Action": "connect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943101, - "timeNano": 1461943101394865557 - } - { - "status": "start", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "start", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101607533796 - } - { - "status": "resize", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "resize", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "height": "46", - "image": "alpine", - "name": "my-container", - "width": "204" - } - }, - "time": 1461943101, - "timeNano": 1461943101610269268 - } - { - "status": "die", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "die", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "exitCode": "0", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105079144137 - } - { - "Type": "network", - "Action": "disconnect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943105, - "timeNano": 1461943105230860245 - } - { - "status": "destroy", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "destroy", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105338056026 - } - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - - `label=`; -- image and container label to filter - - `type=`; -- either `container` or `image` or `volume` or `network` or `daemon` - - `volume=`; -- volume to filter - - `network=`; -- network to filter - - `daemon=`; -- daemon name or id to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.25/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.25/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.25/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"status":"Loading layer","progressDetail":{"current":32768,"total":1292800},"progress":"[= ] 32.77 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":65536,"total":1292800},"progress":"[== ] 65.54 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":98304,"total":1292800},"progress":"[=== ] 98.3 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":131072,"total":1292800},"progress":"[===== ] 131.1 kB/1.293 MB","id":"8ac8bfaff55a"} - ... - {"stream":"Loaded image: busybox:latest\n"} - -**Example response**: - -If the "quiet" query parameter is set to `true` / `1` (`?quiet=1`), progress -details are suppressed, and only a confirmation message is returned once the -action completes. - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"stream":"Loaded image: busybox:latest\n"} - -**Query parameters**: - -- **quiet** – Boolean value, suppress progress details during load. Defaults - to `0` / `false` if omitted. - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.25/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "DetachKeys": "ctrl-p,ctrl-q", - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Privileged": true, - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **DetachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Privileged** - Boolean value, runs the exec process with extended privileges. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **409** - container is paused -- **500** - server error - -### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.25/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **409** - container is paused - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.25/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.25/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CanRemove": false, - "ContainerID": "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126", - "DetachKeys": "", - "ExitCode": 2, - "ID": "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b", - "OpenStderr": true, - "OpenStdin": true, - "OpenStdout": true, - "ProcessConfig": { - "arguments": [ - "-c", - "exit 2" - ], - "entrypoint": "sh", - "privileged": false, - "tty": true, - "user": "1000" - }, - "Running": false, - "Pid": "42000" - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -## 3.4 Volumes - -### List volumes - -`GET /volumes` - -**Example request**: - - GET /v1.25/volumes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Volumes": [ - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Labels":{ - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local", - "Options": { - "device": "tmpfs", - "o": "size=100m,uid=1000", - "type": "tmpfs" - } - } - ], - "Warnings": [] - } - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the volumes list. Available filters: - - `name=` Matches all or part of a volume name. - - `dangling=` When set to `true` (or `1`), returns all volumes that are "dangling" (not in use by a container). When set to `false` (or `0`), only volumes that are in use by one or more containers are returned. - - `driver=` Matches all or part of a volume driver name. - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Create a volume - -`POST /volumes/create` - -Create a volume - -**Example request**: - - POST /v1.25/volumes/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "tardis", - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Driver": "custom" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "custom", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Status": { - "hello": "world" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local", - "Options": null - } - -**Status codes**: - -- **201** - no error -- **500** - server error - -**JSON parameters**: - -- **Name** - The new volume's name. If not specified, Docker generates a name. -- **Driver** - Name of the volume driver to use. Defaults to `local` for the name. -- **DriverOpts** - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. -- **Labels** - Labels to set on the volume, specified as a map: `{"key":"value","key2":"value2"}` - -**JSON fields in response**: - -Refer to the [inspect a volume](#inspect-a-volume) section or details about the -JSON fields returned in the response. - -### Inspect a volume - -`GET /volumes/(name)` - -Return low-level information on the volume `name` - -**Example request**: - - GET /v1.25/volumes/tardis - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "custom", - "Mountpoint": "/var/lib/docker/volumes/tardis/_data", - "Status": { - "hello": "world" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local", - "Options": { - "some-key": "some-value", - "some-other-key": "some-other-value" - }, - } - -**Status codes**: - -- **200** - no error -- **404** - no such volume -- **500** - server error - -**JSON fields in response**: - -The following fields can be returned in the API response. Empty fields, or -fields that are not supported by the volume's driver may be omitted in the -response. - -- **Name** - Name of the volume. -- **Driver** - Name of the volume driver used by the volume. -- **Mountpoint** - Mount path of the volume on the host. -- **Status** - Low-level details about the volume, provided by the volume driver. - Details are returned as a map with key/value pairs: `{"key":"value","key2":"value2"}`. - The `Status` field is optional, and is omitted if the volume driver does not - support this feature. -- **Labels** - Labels set on the volume, specified as a map: `{"key":"value","key2":"value2"}`. -- **Scope** - Scope describes the level at which the volume exists, can be one of - `global` for cluster-wide or `local` for machine level. The default is `local`. -- **Options** - Options holds the driver specific options to use for when creating the volume. - -### Remove a volume - -`DELETE /volumes/(name)` - -Instruct the driver to remove the volume (`name`). - -**Example request**: - - DELETE /v1.25/volumes/tardis HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query Parameters**: - -- **force** - 1/True/true or 0/False/false, Force the removal of the volume. - Default `false`. - -**Status codes**: - -- **204** - no error -- **404** - no such volume or volume driver -- **409** - volume is in use and cannot be removed -- **500** - server error - -### Prune unused volumes - -`POST /volumes/prune` - -Delete unused volumes - -**Example request**: - - POST /v1.25/volumes/prune HTTP/1.1 - Content-Type: application/json - - { - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "VolumesDeleted": [ - "my-volume" - ], - "SpaceReclaimed": 42 - } - -**Status codes**: - -- **200** – no error -- **500** – server error - - -## 3.5 Networks - -### List networks - -`GET /networks` - -**Example request**: - - GET /v1.25/networks?filters={"type":{"custom":true}} HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Created": "2016-10-19T06:21:00.416543526Z", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - }, - { - "Name": "none", - "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", - "Created": "0001-01-01T00:00:00Z", - "Scope": "local", - "Driver": "null", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - }, - { - "Name": "host", - "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", - "Created": "0001-01-01T00:00:00Z", - "Scope": "local", - "Driver": "host", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - } -] -``` - -**Query parameters**: - -- **filters** - JSON encoded network list filter. The filter value is one of: - - `driver=` Matches a network's driver. - - `id=` Matches all or part of a network id. - - `label=` or `label==` of a network label. - - `name=` Matches all or part of a network name. - - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks. - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Inspect network - -`GET /networks/` - -**Example request**: - - GET /v1.25/networks/7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99 HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Name": "net01", - "Id": "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99", - "Created": "2016-10-19T04:33:30.360899459Z", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.19.0.0/16", - "Gateway": "172.19.0.1" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal": false, - "Containers": { - "19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c": { - "Name": "test", - "EndpointID": "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a", - "MacAddress": "02:42:ac:13:00:02", - "IPv4Address": "172.19.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - network not found - -### Create a network - -`POST /networks/create` - -Create a network - -**Example request**: - -``` -POST /v1.25/networks/create HTTP/1.1 -Content-Type: application/json - -{ - "Name":"isolated_nw", - "CheckDuplicate":true, - "Driver":"bridge", - "EnableIPv6": true, - "IPAM":{ - "Driver": "default", - "Config":[ - { - "Subnet":"172.20.0.0/16", - "IPRange":"172.20.10.0/24", - "Gateway":"172.20.10.11" - }, - { - "Subnet":"2001:db8:abcd::/64", - "Gateway":"2001:db8:abcd::1011" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal":true, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Example response**: - -``` -HTTP/1.1 201 Created -Content-Type: application/json - -{ - "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30", - "Warning": "" -} -``` - -**Status codes**: - -- **201** - no error -- **404** - plugin not found -- **500** - server error - -**JSON parameters**: - -- **Name** - The new network's name. this is a mandatory field -- **CheckDuplicate** - Requests daemon to check for networks with same name. Defaults to `false` -- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver -- **Internal** - Restrict external access to the network -- **IPAM** - Optional custom IP scheme for the network - - **Driver** - Name of the IPAM driver to use. Defaults to `default` driver - - **Config** - List of IPAM configuration options, specified as a map: - `{"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }` - - **Options** - Driver-specific options, specified as a map: `{"option":"value" [,"option2":"value2"]}` -- **EnableIPv6** - Enable IPv6 on the network -- **Options** - Network specific options to be used by the drivers -- **Labels** - Labels to set on the network, specified as a map: `{"key":"value" [,"key2":"value2"]}` - -### Connect a container to a network - -`POST /networks/(id)/connect` - -Connect a container to a network - -**Example request**: - -``` -POST /v1.25/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "EndpointConfig": { - "IPAMConfig": { - "IPv4Address":"172.24.56.89", - "IPv6Address":"2001:db8::5689" - } - } -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **403** - operation not supported for swarm scoped networks -- **404** - network or container is not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **container** - container-id/name to be connected to the network - -### Disconnect a container from a network - -`POST /networks/(id)/disconnect` - -Disconnect a container from a network - -**Example request**: - -``` -POST /v1.25/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "Force":false -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **403** - operation not supported for swarm scoped networks -- **404** - network or container not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **Container** - container-id/name to be disconnected from a network -- **Force** - Force the container to disconnect from a network - -### Remove a network - -`DELETE /networks/(id)` - -Instruct the driver to remove the network (`id`). - -**Example request**: - - DELETE /v1.25/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such network -- **500** - server error - -### Prune unused networks - -`POST /networks/prune` - -Delete unused networks - -**Example request**: - - POST /v1.25/networks/prune HTTP/1.1 - Content-Type: application/json - - { - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "NetworksDeleted": [ - "n1" - ], - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -## 3.6 Plugins - -### List plugins - -`GET /plugins` - -Returns information about installed plugins. - -**Example request**: - - GET /v1.25/plugins HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078", - "Name": "tiborvass/no-remove", - "Tag": "latest", - "Active": true, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-no-remove", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } - } -] -``` - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Install a plugin - -`POST /plugins/pull?name=` - -Pulls and installs a plugin. After the plugin is installed, it can be enabled -using the [`POST /plugins/(plugin name)/enable` endpoint](#enable-a-plugin). - -**Example request**: - -``` -POST /v1.25/plugins/pull?name=tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. When using -this endpoint to pull a plugin from the registry, the `X-Registry-Auth` header -can be used to include a base64-encoded AuthConfig object. Refer to the [create -an image](#create-an-image) section for more details. - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json -Content-Length: 175 - -[ - { - "Name": "network", - "Description": "", - "Value": [ - "host" - ] - }, - { - "Name": "mount", - "Description": "", - "Value": [ - "/data" - ] - }, - { - "Name": "device", - "Description": "", - "Value": [ - "/dev/cpu_dma_latency" - ] - } -] -``` - -**Query parameters**: - -- **name** - Name of the plugin to pull. The name may include a tag or digest. - This parameter is required. - -**Status codes**: - -- **200** - no error -- **500** - error parsing reference / not a valid repository/tag: repository - name must have at least one component -- **500** - plugin already exists - -### Inspect a plugin - -`GET /plugins/(plugin name)` - -Returns detailed information about an installed plugin. - -**Example request**: - -``` -GET /v1.25/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078", - "Name": "tiborvass/no-remove", - "Tag": "latest", - "Active": false, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-no-remove", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed - -### Configure a plugin - -`POST /plugins/(plugin name)/set` - -**Example request**: - - - POST /v1.25/plugins/tiborvass/no-remove/set - Content-Type: application/json - - ["DEBUG=1"] - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - plugin not installed - -### Enable a plugin - -`POST /plugins/(plugin name)/enable` - -Enables a plugin - -**Example request**: - -``` -POST /v1.25/plugins/tiborvass/no-remove:latest/enable HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **500** - plugin is already enabled - -### Disable a plugin - -`POST /plugins/(plugin name)/disable` - -Disables a plugin - -**Example request**: - -``` -POST /v1.25/plugins/tiborvass/no-remove:latest/disable HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **500** - plugin is already disabled - -### Remove a plugin - -`DELETE /plugins/(plugin name)` - -Removes a plugin - -**Example request**: - -``` -DELETE /v1.25/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Query parameters**: - -- **force** - Boolean value, set to `1` / `True` / `true` to force removing the - plugin. Forcing removal disables the plugin before removing, but may result - in issues if the plugin is in use by a container. - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed -- **500** - plugin is active - -### Create a plugin - -`POST /v1.25/plugins/create?name=(plugin name)` - -Create a plugin - -**Example request**: - -To create a plugin named `plugin` - -``` -POST /v1.25/plugins/create?name=plugin:latest HTTP/1.1 -Content-Type: application/x-tar - -{% raw %} -{{ TAR STREAM }} -{% endraw %} -``` - -The `:latest` tag is optional, and is used as default if omitted. - -**Example response**: - -``` -HTTP/1.1 204 No Content -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Query parameters**: - -- **name** - A name and optional tag to apply for the plugin in the `name:tag format`. If you omit the `tag` the default `:latest` value is assumed. - -**Status codes**: - -- **204** - no error -- **500** - server error - -### Push a plugin - -`POST /v1.25/plugins/(plugin name)/push` - -Pushes a plugin to the registry. - -**Example request**: - -``` -POST /v1.25/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. When using -this endpoint to push a plugin to the registry, the `X-Registry-Auth` header -can be used to include a base64-encoded AuthConfig object. Refer to the [create -an image](#create-an-image) section for more details. - -**Example response**: - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed - - -## 3.7 Nodes - -**Note**: Node operations require the engine to be part of a swarm. - -### List nodes - - -`GET /nodes` - -List nodes - -**Example request**: - - GET /v1.25/nodes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "ID": "24ifsmvkjbyhk", - "Version": { - "Index": 8 - }, - "CreatedAt": "2016-06-07T20:31:11.853781916Z", - "UpdatedAt": "2016-06-07T20:31:11.999868824Z", - "Spec": { - "Name": "my-node", - "Role": "manager", - "Availability": "active" - "Labels": { - "foo": "bar" - } - }, - "Description": { - "Hostname": "bf3067039e47", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 4000000000, - "MemoryBytes": 8272408576 - }, - "Engine": { - "EngineVersion": "1.13.0", - "Labels": { - "foo": "bar", - } - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "bridge" - } - { - "Type": "Network", - "Name": "null" - } - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready", - "Addr": "172.17.0.2" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "172.17.0.2:2377"" - } - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - nodes list. Available filters: - - `id=` - - `label=` - - `membership=`(`accepted`|`pending`)` - - `name=` - - `role=`(`manager`|`worker`)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Inspect a node - - -`GET /nodes/(id or name)` - -Return low-level information on the node `id` - -**Example request**: - - GET /v1.25/nodes/24ifsmvkjbyhk HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ID": "24ifsmvkjbyhk", - "Version": { - "Index": 8 - }, - "CreatedAt": "2016-06-07T20:31:11.853781916Z", - "UpdatedAt": "2016-06-07T20:31:11.999868824Z", - "Spec": { - "Name": "my-node", - "Role": "manager", - "Availability": "active" - "Labels": { - "foo": "bar" - } - }, - "Description": { - "Hostname": "bf3067039e47", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 4000000000, - "MemoryBytes": 8272408576 - }, - "Engine": { - "EngineVersion": "1.13.0", - "Labels": { - "foo": "bar", - } - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "bridge" - } - { - "Type": "Network", - "Name": "null" - } - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready", - "Addr": "172.17.0.2" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "172.17.0.2:2377"" - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **500** – server error - -### Remove a node - - -`DELETE /nodes/(id or name)` - -Remove a node from the swarm. - -**Example request**: - - DELETE /v1.25/nodes/24ifsmvkjbyhk HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **force** - 1/True/true or 0/False/false, Force remove a node from the swarm. - Default `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **500** – server error - -### Update a node - - -`POST /nodes/(id or name)/update` - -Update a node. - -The payload of the `POST` request is the new `NodeSpec` and -overrides the current `NodeSpec` for the specified node. - -If `Availability` or `Role` are omitted, this returns an -error. Any other field omitted resets the current value to either -an empty value or the default cluster-wide value. - -**Example Request** - - POST /v1.25/nodes/24ifsmvkjbyhk/update?version=8 HTTP/1.1 - Content-Type: application/json - - { - "Availability": "active", - "Name": "node-name", - "Role": "manager", - "Labels": { - "foo": "bar" - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **version** – The version number of the node object being updated. This is - required to avoid conflicting writes. - -JSON Parameters: - -- **Annotations** – Optional medata to associate with the node. - - **Name** – User-defined name for the node. - - **Labels** – A map of labels to associate with the node (e.g., - `{"key":"value", "key2":"value2"}`). -- **Role** - Role of the node (worker/manager). -- **Availability** - Availability of the node (active/pause/drain). - - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **500** – server error - -## 3.8 Swarm - -### Inspect swarm - - -`GET /swarm` - -Inspect swarm - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CreatedAt" : "2016-08-15T16:00:20.349727406Z", - "Spec" : { - "Dispatcher" : { - "HeartbeatPeriod" : 5000000000 - }, - "Orchestration" : { - "TaskHistoryRetentionLimit" : 10 - }, - "CAConfig" : { - "NodeCertExpiry" : 7776000000000000 - }, - "Raft" : { - "LogEntriesForSlowFollowers" : 500, - "HeartbeatTick" : 1, - "SnapshotInterval" : 10000, - "ElectionTick" : 3 - }, - "TaskDefaults" : {}, - "EncryptionConfig" : { - "AutoLockManagers": false - }, - "Name" : "default" - }, - "JoinTokens" : { - "Worker" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a", - "Manager" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l" - }, - "ID" : "70ilmkj2f6sp2137c753w2nmt", - "UpdatedAt" : "2016-08-15T16:32:09.623207604Z", - "Version" : { - "Index" : 51 - } - } - -**Status codes**: - -- **200** - no error - -### Initialize a new swarm - - -`POST /swarm/init` - -Initialize a new swarm. The body of the HTTP response includes the node ID. - -**Example request**: - - POST /v1.25/swarm/init HTTP/1.1 - Content-Type: application/json - - { - "ListenAddr": "0.0.0.0:2377", - "AdvertiseAddr": "192.168.1.1:2377", - "ForceNewCluster": false, - "Spec": { - "Orchestration": {}, - "Raft": {}, - "Dispatcher": {}, - "CAConfig": {}, - "EncryptionConfig" : { - "AutoLockManagers": false - } - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 28 - Content-Type: application/json - Date: Thu, 01 Sep 2016 21:49:13 GMT - Server: Docker/1.13.0 (linux) - - "7v2t30z9blmxuhnyo6s4cpenp" - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **503** – node is already part of a swarm - -JSON Parameters: - -- **ListenAddr** – Listen address used for inter-manager communication, as well as determining - the networking interface used for the VXLAN Tunnel Endpoint (VTEP). This can either be an - address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the default swarm listening port is - used. -- **AdvertiseAddr** – Externally reachable address advertised to other nodes. This can either be - an address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the port number from the listen - address is used. If `AdvertiseAddr` is not specified, it will be automatically detected when - possible. -- **ForceNewCluster** – Force creation of a new swarm. -- **Spec** – Configuration settings for the new swarm. - - **Orchestration** – Configuration settings for the orchestration aspects of the swarm. - - **TaskHistoryRetentionLimit** – Maximum number of tasks history stored. - - **Raft** – Raft related configuration. - - **SnapshotInterval** – Number of logs entries between snapshot. - - **KeepOldSnapshots** – Number of snapshots to keep beyond the current snapshot. - - **LogEntriesForSlowFollowers** – Number of log entries to keep around to sync up slow - followers after a snapshot is created. - - **HeartbeatTick** – Amount of ticks (in seconds) between each heartbeat. - - **ElectionTick** – Amount of ticks (in seconds) needed without a leader to trigger a new - election. - - **Dispatcher** – Configuration settings for the task dispatcher. - - **HeartbeatPeriod** – The delay for an agent to send a heartbeat to the dispatcher. - - **CAConfig** – Certificate authority configuration. - - **NodeCertExpiry** – Automatic expiry for nodes certificates. - - **ExternalCA** - Configuration for forwarding signing requests to an external - certificate authority. - - **Protocol** - Protocol for communication with the external CA - (currently only "cfssl" is supported). - - **URL** - URL where certificate signing requests should be sent. - - **Options** - An object with key/value pairs that are interpreted - as protocol-specific options for the external CA driver. - - **EncryptionConfig** – Parameters related to encryption-at-rest. - - **AutoLockManagers**: If set, generate a key and use it to lock data stored on the - managers. - -### Join an existing swarm - -`POST /swarm/join` - -Join an existing swarm - -**Example request**: - - POST /v1.25/swarm/join HTTP/1.1 - Content-Type: application/json - - { - "ListenAddr": "0.0.0.0:2377", - "AdvertiseAddr": "192.168.1.1:2377", - "RemoteAddrs": ["node1:2377"], - "JoinToken": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **503** – node is already part of a swarm - -JSON Parameters: - -- **ListenAddr** – Listen address used for inter-manager communication if the node gets promoted to - manager, as well as determining the networking interface used for the VXLAN Tunnel Endpoint (VTEP). -- **AdvertiseAddr** – Externally reachable address advertised to other nodes. This can either be - an address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the port number from the listen - address is used. If `AdvertiseAddr` is not specified, it will be automatically detected when - possible. -- **RemoteAddr** – Address of any manager node already participating in the swarm. -- **JoinToken** – Secret token for joining this swarm. - -### Leave a swarm - - -`POST /swarm/leave` - -Leave a swarm - -**Example request**: - - POST /v1.25/swarm/leave HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **force** - Boolean (0/1, false/true). Force leave swarm, even if this is the last manager or that it will break the cluster. - -**Status codes**: - -- **200** – no error -- **503** – node is not part of a swarm - -### Retrieve the swarm's unlock key - -`GET /swarm/unlockkey` - -Get unlock key - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "UnlockKey": "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8" - } - -**Status codes**: - -- **200** - no error - -### Unlock a locked manager - -`POST /swarm/unlock` - -Unlock a manager - -**Example request**: - - POST /v1.25/swarm/unlock HTTP/1.1 - Content-Type: application/json - - { - "UnlockKey": "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8" - } - -**Status codes**: - -- **200** - no error - -### Update a swarm - - -`POST /swarm/update` - -Update a swarm - -**Example request**: - - POST /v1.25/swarm/update HTTP/1.1 - - { - "Name": "default", - "Orchestration": { - "TaskHistoryRetentionLimit": 10 - }, - "Raft": { - "SnapshotInterval": 10000, - "LogEntriesForSlowFollowers": 500, - "HeartbeatTick": 1, - "ElectionTick": 3 - }, - "Dispatcher": { - "HeartbeatPeriod": 5000000000 - }, - "CAConfig": { - "NodeCertExpiry": 7776000000000000 - }, - "JoinTokens": { - "Worker": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx", - "Manager": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - }, - "EncryptionConfig": { - "AutoLockManagers": false - } - } - - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **version** – The version number of the swarm object being updated. This is - required to avoid conflicting writes. -- **rotateWorkerToken** - Set to `true` (or `1`) to rotate the worker join token. -- **rotateManagerToken** - Set to `true` (or `1`) to rotate the manager join token. -- **rotateManagerUnlockKey** - Set to `true` (or `1`) to rotate the manager unlock key. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **503** – node is not part of a swarm - -JSON Parameters: - -- **Orchestration** – Configuration settings for the orchestration aspects of the swarm. - - **TaskHistoryRetentionLimit** – Maximum number of tasks history stored. -- **Raft** – Raft related configuration. - - **SnapshotInterval** – Number of logs entries between snapshot. - - **KeepOldSnapshots** – Number of snapshots to keep beyond the current snapshot. - - **LogEntriesForSlowFollowers** – Number of log entries to keep around to sync up slow - followers after a snapshot is created. - - **HeartbeatTick** – Amount of ticks (in seconds) between each heartbeat. - - **ElectionTick** – Amount of ticks (in seconds) needed without a leader to trigger a new - election. -- **Dispatcher** – Configuration settings for the task dispatcher. - - **HeartbeatPeriod** – The delay for an agent to send a heartbeat to the dispatcher. -- **CAConfig** – CA configuration. - - **NodeCertExpiry** – Automatic expiry for nodes certificates. - - **ExternalCA** - Configuration for forwarding signing requests to an external - certificate authority. - - **Protocol** - Protocol for communication with the external CA - (currently only "cfssl" is supported). - - **URL** - URL where certificate signing requests should be sent. - - **Options** - An object with key/value pairs that are interpreted - as protocol-specific options for the external CA driver. -- **JoinTokens** - Tokens that can be used by other nodes to join the swarm. - - **Worker** - Token to use for joining as a worker. - - **Manager** - Token to use for joining as a manager. -- **EncryptionConfig** – Parameters related to encryption-at-rest. - - **AutoLockManagers**: If set, generate a key and use it to lock data stored on the - managers. - -## 3.9 Services - -**Note**: Service operations require to first be part of a swarm. - -### List services - - -`GET /services` - -List services - -**Example request**: - - GET /v1.25/services HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "ID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Version": { - "Index": 19 - }, - "CreatedAt": "2016-06-07T21:05:51.880065305Z", - "UpdatedAt": "2016-06-07T21:07:29.962229872Z", - "Spec": { - "Name": "hopeful_cori", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {}, - "ForceUpdate": 0 - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "FailureAction": "pause", - "Monitor": 15000000000, - "MaxFailureRatio": 0.15 - }, - "EndpointSpec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - } - }, - "Endpoint": { - "Spec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - }, - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ], - "VirtualIPs": [ - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.2/16" - }, - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.3/16" - } - ] - } - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - services list. Available filters: - - `id=` - - `label=` - - `name=` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Create a service - -`POST /services/create` - -Create a service. When using this endpoint to create a service using a private -repository from the registry, the `X-Registry-Auth` header must be used to -include a base64-encoded AuthConfig object. Refer to the [create an -image](#create-an-image) section for more details. - -**Example request**: - - POST /v1.25/services/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "web", - "TaskTemplate": { - "ContainerSpec": { - "Image": "nginx:alpine", - "Mounts": [ - { - "ReadOnly": true, - "Source": "web-data", - "Target": "/usr/share/nginx/html", - "Type": "volume", - "VolumeOptions": { - "DriverConfig": { - }, - "Labels": { - "com.example.something": "something-value" - } - } - } - ], - "User": "33", - "TTY": false, - "DNSConfig": { - "Nameservers": ["8.8.8.8"], - "Search": ["example.org"], - "Options": ["timeout:3"] - } - }, - "LogDriver": { - "Name": "json-file", - "Options": { - "max-file": "3", - "max-size": "10M" - } - }, - "Placement": {}, - "Resources": { - "Limits": { - "MemoryBytes": 104857600.0 - }, - "Reservations": { - } - }, - "RestartPolicy": { - "Condition": "on-failure", - "Delay": 10000000000.0, - "MaxAttempts": 10 - }, - "ForceUpdate": 0 - }, - "Mode": { - "Replicated": { - "Replicas": 4 - } - }, - "UpdateConfig": { - "Delay": 30000000000.0, - "Parallelism": 2, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Ports": [ - { - "Protocol": "tcp", - "PublishedPort": 8080, - "TargetPort": 80 - } - ] - }, - "Labels": { - "foo": "bar" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "ID": "ak7w3gjqoa3kuz8xcpnyy0pvl", - "Warnings": ["unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found"] - } - -**Status codes**: - -- **201** – no error -- **409** – name conflicts with an existing object -- **503** – server error or node is not part of a swarm - -**JSON Parameters**: - -- **Name** – User-defined name for the service. -- **Labels** – A map of labels to associate with the service (e.g., `{"key":"value", "key2":"value2"}`). -- **TaskTemplate** – Specification of the tasks to start as part of the new service. - - **ContainerSpec** - Container settings for containers started as part of this task. - - **Image** – A string specifying the image name to use for the container. - - **Command** – The command to be run in the image. - - **Args** – Arguments to the command. - - **Env** – A list of environment variables in the form of `["VAR=value"[,"VAR2=value2"]]`. - - **Dir** – A string specifying the working directory for commands to run in. - - **User** – A string value specifying the user inside the container. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). - - **TTY** – A boolean indicating whether a pseudo-TTY should be allocated. - - **Mounts** – Specification for mounts to be added to containers - created as part of the service. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, or `volume`). - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type. - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume. - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume. - - **Options** - key/value map of driver specific options. - - **StopGracePeriod** – Amount of time to wait for the container to terminate before - forcefully killing it. - - **DNSConfig** – Specification for DNS related configurations in - resolver configuration file (resolv.conf). - - **Nameservers** – A list of the IP addresses of the name servers. - - **Search** – A search list for host-name lookup. - - **Options** – A list of internal resolver variables to be modified (e.g., `debug`, `ndots:3`, etc.). - - **LogDriver** - Log configuration for containers created as part of the - service. - - **Name** - Name of the logging driver to use (`json-file`, `syslog`, - `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`). - - **Options** - Driver-specific options. - - **Resources** – Resource requirements which apply to each individual container created as part - of the service. - - **Limits** – Define resources limits. - - **NanoCPUs** – CPU limit in units of 10-9 CPU shares. - - **MemoryBytes** – Memory limit in Bytes. - - **Reservation** – Define resources reservation. - - **NanoCPUs** – CPU reservation in units of 10-9 CPU shares. - - **MemoryBytes** – Memory reservation in Bytes. - - **RestartPolicy** – Specification for the restart policy which applies to containers created - as part of this service. - - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - - **Delay** – Delay between restart attempts, in nanoseconds. - - **MaxAttempts** – Maximum attempts to restart a given container before giving up (default value - is 0, which is ignored). - - **Window** – Windows is the time window used to evaluate the restart policy (default value is - 0, which is unbounded). - - **Placement** – An array of constraints. - - **ForceUpdate**: A counter that triggers an update even if no relevant parameters have been changed. -- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). -- **UpdateConfig** – Specification for the update strategy of the service. - - **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited - parallelism). - - **Delay** – Amount of time between updates, in nanoseconds. - - **FailureAction** - Action to take if an updated task fails to run, or stops running during the - update. Values are `continue` and `pause`. - - **Monitor** - Amount of time to monitor each updated task for failures, in nanoseconds. - - **MaxFailureRatio** - The fraction of tasks that may fail during an update before the - failure action is invoked, specified as a floating point number between 0 and 1. The default is 0. -- **Networks** – Array of network names or IDs to attach the service to. -- **EndpointSpec** – Properties that can be configured to access and load balance a service. - - **Mode** – The mode of resolution to use for internal load balancing - between tasks (`vip` or `dnsrr`). Defaults to `vip` if not provided. - - **Ports** – List of exposed ports that this service is accessible on from - the outside, in the form of: - `{"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }`. - Ports can only be provided if `vip` resolution mode is used. - -**Request Headers**: - -- **Content-type** – Set to `"application/json"`. -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either - login information, or a token. Refer to the [create an image](#create-an-image) - section for more details. - - -### Remove a service - - -`DELETE /services/(id or name)` - -Stop and remove the service `id` - -**Example request**: - - DELETE /v1.25/services/16253994b7c4 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **500** – server error - -### Inspect one or more services - - -`GET /services/(id or name)` - -Return information on the service `id`. - -**Example request**: - - GET /v1.25/services/1cb4dnqcyx6m66g2t538x3rxha HTTP/1.1 - -**Example response**: - - { - "ID": "ak7w3gjqoa3kuz8xcpnyy0pvl", - "Version": { - "Index": 95 - }, - "CreatedAt": "2016-06-07T21:10:20.269723157Z", - "UpdatedAt": "2016-06-07T21:10:20.276301259Z", - "Spec": { - "Name": "redis", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - } - }, - "Endpoint": { - "Spec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - }, - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ], - "VirtualIPs": [ - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.4/16" - } - ] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **500** – server error - -### Update a service - -`POST /services/(id or name)/update` - -Update a service. When using this endpoint to create a service using a -private repository from the registry, the `X-Registry-Auth` header can be used -to update the authentication information for that is stored for the service. -The header contains a base64-encoded AuthConfig object. Refer to the [create an -image](#create-an-image) section for more details. - -**Example request**: - - POST /v1.25/services/1cb4dnqcyx6m66g2t538x3rxha/update?version=23 HTTP/1.1 - Content-Type: application/json - - { - "Name": "top", - "TaskTemplate": { - "ContainerSpec": { - "Image": "busybox", - "Args": [ - "top" - ], - "TTY": true, - "DNSConfig": { - "Nameservers": ["8.8.8.8"], - "Search": ["example.org"], - "Options": ["timeout:3"] - } - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {}, - "ForceUpdate": 0 - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "Monitor": 15000000000, - "MaxFailureRatio": 0.15 - }, - "EndpointSpec": { - "Mode": "vip" - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**JSON Parameters**: - -- **Name** – User-defined name for the service. Note that renaming services is not supported. -- **Labels** – A map of labels to associate with the service (e.g., `{"key":"value", "key2":"value2"}`). -- **TaskTemplate** – Specification of the tasks to start as part of the new service. - - **ContainerSpec** - Container settings for containers started as part of this task. - - **Image** – A string specifying the image name to use for the container. - - **Command** – The command to be run in the image. - - **Args** – Arguments to the command. - - **Env** – A list of environment variables in the form of `["VAR=value"[,"VAR2=value2"]]`. - - **Dir** – A string specifying the working directory for commands to run in. - - **User** – A string value specifying the user inside the container. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). - - **TTY** – A boolean indicating whether a pseudo-TTY should be allocated. - - **Mounts** – Specification for mounts to be added to containers created as part of the new - service. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, or `volume`). - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume. - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume - - **Options** - key/value map of driver specific options - - **StopGracePeriod** – Amount of time to wait for the container to terminate before - forcefully killing it. - - **DNSConfig** – Specification for DNS related configurations in - resolver configuration file (resolv.conf). - - **Nameservers** – A list of the IP addresses of the name servers. - - **Search** – A search list for host-name lookup. - - **Options** – A list of internal resolver variables to be modified (e.g., `debug`, `ndots:3`, etc.). - - **Resources** – Resource requirements which apply to each individual container created as part - of the service. - - **Limits** – Define resources limits. - - **CPU** – CPU limit - - **Memory** – Memory limit - - **Reservation** – Define resources reservation. - - **CPU** – CPU reservation - - **Memory** – Memory reservation - - **RestartPolicy** – Specification for the restart policy which applies to containers created - as part of this service. - - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - - **Delay** – Delay between restart attempts, in nanoseconds. - - **MaxAttempts** – Maximum attempts to restart a given container before giving up (default value - is 0, which is ignored). - - **Window** – Windows is the time window used to evaluate the restart policy (default value is - 0, which is unbounded). - - **Placement** – An array of constraints. - - **ForceUpdate**: A counter that triggers an update even if no relevant parameters have been changed. -- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). -- **UpdateConfig** – Specification for the update strategy of the service. - - **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited - parallelism). - - **Delay** – Amount of time between updates, in nanoseconds. - - **FailureAction** - Action to take if an updated task fails to run, or stops running during the - update. Values are `continue` and `pause`. - - **Monitor** - Amount of time to monitor each updated task for failures, in nanoseconds. - - **MaxFailureRatio** - The fraction of tasks that may fail during an update before the - failure action is invoked, specified as a floating point number between 0 and 1. The default is 0. -- **Networks** – Array of network names or IDs to attach the service to. -- **EndpointSpec** – Properties that can be configured to access and load balance a service. - - **Mode** – The mode of resolution to use for internal load balancing - between tasks (`vip` or `dnsrr`). Defaults to `vip` if not provided. - - **Ports** – List of exposed ports that this service is accessible on from - the outside, in the form of: - `{"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }`. - Ports can only be provided if `vip` resolution mode is used. - -**Query parameters**: - -- **version** – The version number of the service object being updated. This is - required to avoid conflicting writes. -- **registryAuthFrom** - If the X-Registry-Auth header is not specified, this - parameter indicates where to find registry authorization credentials. The - valid values are `spec` and `previous-spec`. If unspecified, the default is - `spec`. - -**Request Headers**: - -- **Content-type** – Set to `"application/json"`. -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either - login information, or a token. Refer to the [create an image](#create-an-image) - section for more details. - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **500** – server error - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": ["unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found"] - } - - -### Get service logs - -`GET /services/(id or name)/logs` - -Get `stdout` and `stderr` logs from the service ``id`` - -> **Note**: -> This endpoint works only for services with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.25/services/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **details** - 1/True/true or 0/False/flase, Show extra details provided to logs. Default `false`. -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such service -- **500** – server error - -## 3.10 Tasks - -**Note**: Task operations require the engine to be part of a swarm. - -### List tasks - - -`GET /tasks` - -List tasks - -**Example request**: - - GET /v1.25/tasks HTTP/1.1 - -**Example response**: - - [ - { - "ID": "0kzzo1i0y4jz6027t0k7aezc7", - "Version": { - "Index": 71 - }, - "CreatedAt": "2016-06-07T21:07:31.171892745Z", - "UpdatedAt": "2016-06-07T21:07:31.376370513Z", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:31.290032978Z", - "State": "running", - "Message": "started", - "ContainerStatus": { - "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035", - "PID": 677 - } - }, - "DesiredState": "running", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.10/16" - ] - } - ], - }, - { - "ID": "1yljwbmlr8er2waf8orvqpwms", - "Version": { - "Index": 30 - }, - "CreatedAt": "2016-06-07T21:07:30.019104782Z", - "UpdatedAt": "2016-06-07T21:07:30.231958098Z", - "Name": "hopeful_cori", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:30.202183143Z", - "State": "shutdown", - "Message": "shutdown", - "ContainerStatus": { - "ContainerID": "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213" - } - }, - "DesiredState": "shutdown", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.5/16" - ] - } - ] - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - services list. Available filters: - - `id=` - - `name=` - - `service=` - - `node=` - - `label=key` or `label="key=value"` - - `desired-state=(running | shutdown | accepted)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Inspect a task - - -`GET /tasks/(task id)` - -Get details on a task - -**Example request**: - - GET /v1.25/tasks/0kzzo1i0y4jz6027t0k7aezc7 HTTP/1.1 - -**Example response**: - - { - "ID": "0kzzo1i0y4jz6027t0k7aezc7", - "Version": { - "Index": 71 - }, - "CreatedAt": "2016-06-07T21:07:31.171892745Z", - "UpdatedAt": "2016-06-07T21:07:31.376370513Z", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:31.290032978Z", - "State": "running", - "Message": "started", - "ContainerStatus": { - "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035", - "PID": 677 - } - }, - "DesiredState": "running", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.10/16" - ] - } - ] - } - -**Status codes**: - -- **200** – no error -- **404** – unknown task -- **500** – server error - -## 3.11 Secrets - -**Note**: Secret operations require the engine to be part of a swarm. - -### List secrets - -`GET /secrets` - -List secrets - -**Example request**: - - GET /v1.25/secrets HTTP/1.1 - -**Example response**: - - [ - { - "ID": "ktnbjxoalbkvbvedmg1urrz8h", - "Version": { - "Index": 11 - }, - "CreatedAt": "2016-11-05T01:20:17.327670065Z", - "UpdatedAt": "2016-11-05T01:20:17.327670065Z", - "Spec": { - "Name": "app-dev.crt" - }, - "Digest": "sha256:11d7c6f38253b73e608153c9f662a191ae605e1a3d9b756b0b3426388f91d3fa", - "SecretSize": 31 - } - ] - - -**Query parameters**: - -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the secrets list. Available filters: - - `names=` - -**Status codes**: - -- **200** – no error - -### Create a secret - -`POST /secrets/create` - -Create a secret - -**Example request**: - - POST /v1.25/secrets/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "app-key.crt", - "Labels": { - "foo": "bar" - }, - "Data": "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg==" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "ID": "ktnbjxoalbkvbvedmg1urrz8h" - } - -**Status codes**: - -- **201** – no error -- **409** – name conflicts with an existing object -- **503** – server error or node is not part of a swarm - -**JSON Parameters**: - -- **Name** – User-defined name for the secret. -- **Labels** – A map of labels to associate with the secret (e.g., `{"key":"value", "key2":"value2"}`). -- **Data** – Base64-url-safe-encoded secret data - -### Inspect a secret - -`GET /secrets/(id)` - -Get details on the secret `id` - -**Example request**: - - GET /v1.25/secrets/ktnbjxoalbkvbvedmg1urrz8h HTTP/1.1 - -**Example response**: - - { - "ID": "ktnbjxoalbkvbvedmg1urrz8h", - "Version": { - "Index": 11 - }, - "CreatedAt": "2016-11-05T01:20:17.327670065Z", - "UpdatedAt": "2016-11-05T01:20:17.327670065Z", - "Spec": { - "Name": "app-dev.crt" - }, - "Digest": "sha256:11d7c6f38253b73e608153c9f662a191ae605e1a3d9b756b0b3426388f91d3fa", - "SecretSize": 31 - } - -**Status codes**: - -- **200** – no error -- **404** – unknown secret -- **406** – node is not part of a swarm -- **500** – server error - -### Remove a secret - -`DELETE /secrets/(id)` - -Remove the secret `id` from the secret store - -**Example request**: - - DELETE /v1.25/secrets/ktnbjxoalbkvbvedmg1urrz8h HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -# 4. Going further - -## 4.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - 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. - -## 4.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -## 4.3 CORS Requests - -To set cross origin requests to the remote api please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/docs/reference/api/docker_remote_api_v1.26.md b/docs/reference/api/docker_remote_api_v1.26.md deleted file mode 100644 index 6d41c401b8..0000000000 --- a/docs/reference/api/docker_remote_api_v1.26.md +++ /dev/null @@ -1,6162 +0,0 @@ ---- -title: "Remote API v1.26" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" ---- - - - -# Docker Remote API v1.26 - -# 1. Brief introduction - - - The Remote API has replaced `rcli`. - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - -# 2. Errors - -The Remote API uses standard HTTP status codes to indicate the success or failure of the API call. The body of the response will be JSON in the following format: - - { - "message": "page not found" - } - -The status codes that are returned for each endpoint are specified in the endpoint documentation below. - -# 3. Endpoints - -## 3.1 Containers - -### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.26/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 1", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:02" - } - } - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 222222", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.8", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:08" - } - } - }, - "Mounts": [] - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "State": "Exited", - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.6", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:06" - } - } - }, - "Mounts": [] - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.5", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:05" - } - } - }, - "Mounts": [] - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`removing`|`paused`|`exited`|`dead`) - - `label=key` or `label="key=value"` of a container label - - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only) - `id=` a container's ID - `name=` a container's name - `is-task=`(`true`|`false`) - - `ancestor`=(`[:]`, `` or ``) - - `before`=(`` or ``) - - `since`=(`` or ``) - - `volume`=(`` or ``) - - `network`=(`` or ``) - - `health`=(`starting`|`healthy`|`unhealthy`|`none`) - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.26/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": "", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "StopSignal": "SIGTERM", - "StopTimeout": 10, - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Tmpfs": { "/run": "rw,noexec,nosuid,size=65536k" }, - "Links": ["redis3:redis"], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "NanoCPUs": 500000, - "CpuCount": 4, - "CpuPercent": 80, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuRealtimePeriod": 1000000, - "CpuRealtimeRuntime": 10000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "IOMaximumBandwidth": 0, - "IOMaximumIOps": 0, - "BlkioWeight": 300, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceWriteIOps": [{}], - "MemorySwappiness": 60, - "OomKillDisable": false, - "OomScoreAdj": 500, - "PidMode": "", - "PidsLimit": -1, - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsOptions": [""], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "AutoRemove": true, - "NetworkMode": "bridge", - "Devices": [], - "Sysctls": { "net.ipv4.ip_forward": "1" }, - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "StorageOpt": {}, - "CgroupParent": "", - "VolumeDriver": "", - "ShmSize": 67108864, - "Mounts": [] - }, - "NetworkingConfig": { - "EndpointsConfig": { - "isolated_nw" : { - "IPAMConfig": { - "IPv4Address":"172.20.30.33", - "IPv6Address":"2001:db8:abcd::3033", - "LinkLocalIPs":["169.254.34.68", "fe80::3468"] - }, - "Links":["container_1", "container_2"], - "Aliases":["server_x", "server_y"] - } - } - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. This must be a valid RFC 1123 hostname. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. If the array consists of exactly one empty string (`[""]`) then the entry point - is reset to system default (i.e., the entry point used by docker when there is no `ENTRYPOINT` - instruction in the Dockerfile). -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **StopSignal** - Signal to stop a container as a string or unsigned integer. `SIGTERM` by default. -- **StopTimeout** - Timeout (in seconds) to stop a container. 10 by default. -- **HostConfig** - - **Binds** – A list of volume bindings for this container. Each volume binding is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - + `volume-name:container-dest` to bind-mount a volume managed by a - volume driver into the container. `container-dest` must be an - _absolute_ path. - + `volume-name:container-dest:ro` to mount the volume read-only - inside the container. `container-dest` must be an _absolute_ path. - - **Tmpfs** – A map of container directories which should be replaced by tmpfs mounts, and their corresponding - mount options. A JSON object in the form `{ "/run": "rw,noexec,nosuid,size=65536k" }`. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **MemoryReservation** - Memory soft limit in bytes. - - **KernelMemory** - Kernel memory limit in bytes. - - **NanoCPUs** - CPU quota in units of 10-9 CPUs. The default value is 0, which means there is no limit. - - **CpuCount** - An integer value containing the number of usable CPUs. - Windows daemon only. On Windows Server containers, - the processor resource controls are mutually exclusive, the order of precedence - is CPUCount first, then CPUShares, and CPUPercent last. - - **CpuPercent** - An integer value containing the usable percentage of - the available CPUs. Windows daemon only. On Windows Server containers, - the processor resource controls are mutually exclusive, the order of precedence - is CPUCount first, then CPUShares, and CPUPercent last. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuRealtimePeriod** - The length of a CPU real-time period in microseconds (0=no time allocated for rt tasks) - - **CpuRealtimeRuntime** - The length of a CPU real-time runtime in microseconds (0=no time allocated for rt tasks) - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **IOMaximumBandwidth** - Maximum IO absolute rate in terms of IOps. - - **IOMaximumIOps** - Maximum IO absolute rate in terms of bytes per second. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **BlkioWeightDevice** - Block IO weight (relative device weight) in the form of: `"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]` - - **BlkioDeviceReadBps** - Limit read rate (bytes per second) from a device in the form of: `"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceWriteBps** - Limit write rate (bytes per second) to a device in the form of: `"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceReadIOps** - Limit read rate (IO per second) from a device in the form of: `"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **BlkioDeviceWiiteIOps** - Limit write rate (IO per second) to a device in the form of: `"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **OomScoreAdj** - An integer value containing the score given to the container in order to tune OOM killer preferences. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PidsLimit** - Tune a container's pids limit. Set -1 for unlimited. - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsOptions** - A list of DNS options - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart, `"unless-stopped"` to restart always except when - user has manually stopped the container or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **AutoRemove** - Boolean value, set to `true` to automatically remove the container on daemon side - when the container's process exits. Note that `RestartPolicy` other than `none` is exclusive to `AutoRemove`. - - **UsernsMode** - Sets the usernamespace mode for the container when usernamespace remapping option is enabled. - supported values are: `host`. - - **NetworkMode** - Sets the networking mode for the container. Supported - standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken - as a custom network's name to which this container should connect to. - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **Sysctls** - A list of kernel parameters (sysctls) to set in the container, specified as - `{ : }`, for example: - `{ "net.ipv4.ip_forward": "1" }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **StorageOpt**: Storage driver options per container. Options can be passed in the form - `{"size":"120G"}` - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - - **VolumeDriver** - Driver that this container users to mount volumes. - - **ShmSize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. - - **Mounts** – Specification for mounts to be added to the container. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, `volume`, or `tmpfs`). - Available types (for the `Type` field): - - **bind** - Mounts a file or directory from the host into the container. Must exist prior to creating the container. - - **volume** - Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed. - - **tmpfs** - Create a tmpfs with the given options. The mount source cannot be specified for tmpfs. - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type. - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume as key/value pairs: `{"name": "value"}` - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume. - - **Options** - key/value map of driver specific options. - - **TmpfsOptions** – Optional configuration for the `tmpfs` type. - - **SizeBytes** – The size for the tmpfs mount in bytes. - - **Mode** – The permission mode for the tmpfs mount in an integer. - - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.26/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "StopSignal": "SIGTERM", - "StopTimeout": 10 - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "IOMaximumBandwidth": 0, - "IOMaximumIOps": 0, - "BlkioWeight": 0, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteIOps": [{}], - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuCount": 4, - "CpuPercent": 80, - "CpuShares": 0, - "CpuPeriod": 100000, - "CpuRealtimePeriod": 1000000, - "CpuRealtimeRuntime": 10000, - "Devices": [], - "Dns": null, - "DnsOptions": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "OomKillDisable": false, - "OomScoreAdj": 500, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "AutoRemove": true, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "Sysctls": { - "net.ipv4.ip_forward": "1" - }, - "StorageOpt": null, - "VolumesFrom": null, - "Ulimits": [{}], - "VolumeDriver": "", - "ShmSize": 67108864, - "Mounts": [] - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Dead": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z", - "Status": "running" - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - } - -**Example request, with size information**: - - GET /v1.26/containers/4fa6e0f0c678/json?size=1 HTTP/1.1 - -**Example response, with size information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - -**Query parameters**: - -- **size** – 1/True/true or 0/False/false, return container size information. Default is `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.26/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.26/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.26/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **details** - 1/True/true or 0/False/flase, Show extra details provided to logs. Default `false`. -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.26/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.26/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.26/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "pids_stats": { - "current": 3 - }, - "networks": { - "eth0": { - "rx_bytes": 5338, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 36, - "tx_bytes": 648, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 8 - }, - "eth5": { - "rx_bytes": 4641, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 26, - "tx_bytes": 690, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 9 - } - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Resize a container TTY - -`POST /containers/(id or name)/resize` - -Resize the TTY for container with `id`. The unit is number of characters. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.26/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Update a container - -`POST /containers/(id or name)/update` - -Update configuration of one or more containers. - -**Example request**: - - POST /v1.26/containers/e90e34656806/update HTTP/1.1 - Content-Type: application/json - - { - "BlkioWeight": 300, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuRealtimePeriod": 1000000, - "CpuRealtimeRuntime": 10000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0", - "Memory": 314572800, - "MemorySwap": 514288000, - "MemoryReservation": 209715200, - "KernelMemory": 52428800, - "RestartPolicy": { - "MaximumRetryCount": 4, - "Name": "on-failure" - }, - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": [] - } - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.26/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.26/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **409** - container is paused -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.26/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.26/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.26/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - - -### Prune stopped containers - -`POST /containers/prune` - -Delete stopped containers - -**Example request**: - - POST /v1.26/containers/prune HTTP/1.1 - Content-Type: application/json - - { - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ContainersDeleted": [ - "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148" - ], - "SpaceReclaimed": 109 - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -## 3.2 Images - -### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.26/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.26/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label - - `before`=(`[:]`, `` or ``) - - `since`=(`[:]`, `` or ``) - - `reference`=(`[:]`) - -### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.26/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. - You can provide one or more `t` parameters. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **cachefrom** - JSON array of images used for build cache resolution. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. -- **buildargs** – JSON map of string pairs for build-time variables. Users pass - these values at build-time. Docker uses the `buildargs` as the environment - context for command(s) run via the Dockerfile's `RUN` instruction or for - variable expansion in other Dockerfile instructions. This is not meant for - passing secret values. [Read more about the buildargs instruction](../../reference/builder.md#arg) -- **shmsize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. -- **squash** - squash the resulting images layers into a single layer (boolean) **Experimental Only** -- **labels** – JSON map of string pairs for labels to set on the image. -- **networkmode** - Sets the networking mode for the run commands during - build. Supported standard values are: `bridge`, `host`, `none`, and - `container:`. Any other value is taken as a custom network's - name to which this container should connect to. - - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.26/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status":"Pulling from library/busybox","id":"latest"} - {"status":"Pulling fs layer","progressDetail":{},"id":"8ddc19f16526"} - {"status":"Downloading","progressDetail":{"current":15881,"total":667590},"progress":"[=\u003e ] 15.88 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Downloading","progressDetail":{"current":556269,"total":667590},"progress":"[=========================================\u003e ] 556.3 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Download complete","progressDetail":{},"id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":32768,"total":667590},"progress":"[==\u003e ] 32.77 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":491520,"total":667590},"progress":"[====================================\u003e ] 491.5 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":667590,"total":667590},"progress":"[==================================================\u003e] 667.6 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Extracting","progressDetail":{"current":667590,"total":667590},"progress":"[==================================================\u003e] 667.6 kB/667.6 kB","id":"8ddc19f16526"} - {"status":"Pull complete","progressDetail":{},"id":"8ddc19f16526"} - {"status":"Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6"} - {"status":"Status: Downloaded newer image for busybox:latest"} - ... - -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 parameters**: - -- **fromImage** – Name of the image to pull. The name may include a tag or - digest. This parameter may only be used when pulling an image. - The pull is cancelled if the HTTP connection is closed. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. - This parameter may only be used when importing an image. -- **repo** – Repository name given to an image when it is imported. - The repo may include a tag. This parameter may only be used when importing - an image. -- **tag** – Tag or digest. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com" - } - ``` - - - Token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **500** – server error - - - -### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.26/images/example/json HTTP/1.1 - -**Example response (Linux daemon)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", - "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", - "Comment" : "", - "Os" : "linux", - "Architecture" : "amd64", - "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "ContainerConfig" : { - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Domainname" : "", - "AttachStdout" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "NetworkDisabled" : false, - "OnBuild" : [], - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "User" : "", - "WorkingDir" : "", - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "Labels" : { - "com.example.license" : "GPL", - "com.example.version" : "1.0", - "com.example.vendor" : "Acme" - }, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts" : null, - "Cmd" : [ - "/bin/sh", - "-c", - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - ] - }, - "DockerVersion" : "1.9.0-dev", - "VirtualSize" : 188359297, - "Size" : 0, - "Author" : "", - "Created" : "2015-09-10T08:30:53.26995814Z", - "GraphDriver" : { - "Name" : "aufs", - "Data" : null - }, - "RepoDigests" : [ - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags" : [ - "example:1.0", - "example:latest", - "example:stable" - ], - "Config" : { - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "NetworkDisabled" : false, - "OnBuild" : [], - "StdinOnce" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "Domainname" : "", - "AttachStdout" : false, - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Cmd" : [ - "/bin/bash" - ], - "ExposedPorts" : null, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Labels" : { - "com.example.vendor" : "Acme", - "com.example.version" : "1.0", - "com.example.license" : "GPL" - }, - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "WorkingDir" : "", - "User" : "" - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ] - } - } - -**Example response (Windows daemon)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "sha256:105d76d0f40e38427c63023ffe649bf36fa85058d3469551e43e4dcc2431fb31", - "RepoTags": [ - "microsoft/nanoserver:latest" - ], - "RepoDigests": [ - "microsoft/nanoserver@sha256:aee7d4330fe3dc5987c808f647441c16ed2fa1c7d9c6ef49d6498e5c9860b50b" - ], - "Parent": "", - "Comment": "", - "Created": "2016-09-22T02:39:30.9154862-07:00", - "Container": "", - "ContainerConfig": { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": null, - "Image": "", - "Volumes": null, - "WorkingDir": "", - "Entrypoint": null, - "OnBuild": null, - "Labels": null - }, - "DockerVersion": "", - "Author": "", - "Config": { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "c:\\windows\\system32\\cmd.exe" - ], - "Image": "", - "Volumes": null, - "WorkingDir": "", - "Entrypoint": null, - "OnBuild": null, - "Labels": null - }, - "Architecture": "", - "Os": "windows", - "OsVersion": "10.0.14393", - "Size": 651862727, - "VirtualSize": 651862727, - "GraphDriver": { - "Name": "windowsfilter", - "Data": { - "dir": "C:\\control\\windowsfilter\\6fe6a289b98276a6a5ca0345156ca61d7b38f3da6bb49ef95af1d0f1ac37e5bf" - } - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:342d4e407550c52261edd20cd901b5ce438f0b1e940336de3978210612365063" - ] - } - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.26/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.26/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -The push is cancelled if the HTTP connection is closed. - -**Example request**: - - POST /v1.26/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com", - } - ``` - - - Identity token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.26/images/test/tag?repo=myrepo&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.26/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search -- **limit** – maximum returned search results -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `stars=` - - `is-automated=(true|false)` - - `is-official=(true|false)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Prune unused images - -`POST /images/prune` - -Delete unused images - -**Example request**: - - POST /v1.26/images/prune HTTP/1.1 - Content-Type: application/json - - { - "DanglingOnly": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ImagesDeleted": [ - { - "Untagged": "busybox:latest" - }, - { - "Untagged": "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6" - }, - { - "Deleted": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749" - }, - { - "Deleted": "sha256:8ac8bfaff55af948c796026ee867448c5b5b5d9dd3549f4006d9759b25d4a893" - } - ], - "SpaceReclaimed": 1092588 - } - -**JSON parameters**: - -- **DanglingOnly**: if `true` only delete unused *and* untagged images. Default to `false` if omitted - -**Status codes**: - -- **200** – no error -- **500** – server error - - -## 3.3 Misc - -### Check auth configuration - -`POST /auth` - -Validate credentials for a registry and get identity token, -if available, for accessing the registry without password. - -**Example request**: - - POST /v1.26/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - - { - "Status": "Login Succeeded", - "IdentityToken": "9cbaf023786cd7..." - } - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.26/info HTTP/1.1 - -**Example response (Linux)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Architecture": "x86_64", - "ClusterStore": "etcd://localhost:2379", - "CgroupDriver": "cgroupfs", - "Containers": 11, - "ContainersRunning": 7, - "ContainersStopped": 3, - "ContainersPaused": 1, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelMemory": true, - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OSType": "linux", - "OperatingSystem": "Boot2Docker", - "Plugins": { - "Volume": [ - "local" - ], - "Network": [ - "null", - "host", - "bridge" - ] - }, - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "SecurityOptions": [ - { - "Key": "Name", - "Value": "seccomp" - }, - { - "Key": "Profile", - "Value": "default" - }, - { - "Key": "Name", - "Value": "apparmor" - }, - { - "Key": "Name", - "Value": "selinux" - }, - { - "Key": "Name", - "Value": "userns" - } - ], - "ServerVersion": "1.9.0", - "SwapLimit": false, - "SystemStatus": [["State", "Healthy"]], - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - - -**Example response (Windows)**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ID": "NYMS:B5VK:UMSL:FVDZ:EWB5:FKVK:LPFL:FJMQ:H6FT:BZJ6:L2TD:XH62", - "Containers": 1, - "ContainersRunning": 0, - "ContainersPaused": 0, - "ContainersStopped": 1, - "Images": 17, - "Driver": "windowsfilter", - "DriverStatus": [ - ["Windows", ""] - ], - "SystemStatus": null, - "Plugins": { - "Volume": ["local"], - "Network": ["nat", "null", "overlay"], - "Authorization": null - }, - "MemoryLimit": false, - "SwapLimit": false, - "KernelMemory": false, - "CpuCfsPeriod": false, - "CpuCfsQuota": false, - "CPUShares": false, - "CPUSet": false, - "IPv4Forwarding": true, - "BridgeNfIptables": true, - "BridgeNfIp6tables": true, - "Debug": false, - "NFd": -1, - "OomKillDisable": false, - "NGoroutines": 11, - "SystemTime": "2016-09-23T11:59:58.9843533-07:00", - "LoggingDriver": "json-file", - "CgroupDriver": "", - "NEventsListener": 0, - "KernelVersion": "10.0 14393 (14393.206.amd64fre.rs1_release.160912-1937)", - "OperatingSystem": "Windows Server 2016 Datacenter", - "OSType": "windows", - "Architecture": "x86_64", - "IndexServerAddress": "https://index.docker.io/v1/", - "RegistryConfig": { - "InsecureRegistryCIDRs": ["127.0.0.0/8"], - "IndexConfigs": { - "docker.io": { - "Name": "docker.io", - "Mirrors": null, - "Secure": true, - "Official": true - } - }, - "Mirrors": null - }, - "NCPU": 8, - "MemTotal": 4293828608, - "DockerRootDir": "C:\\control", - "HttpProxy": "", - "HttpsProxy": "", - "NoProxy": "", - "Name": "WIN-V0V70C0LU5P", - "Labels": null, - "ExperimentalBuild": false, - "ServerVersion": "1.14.0-dev", - "ClusterStore": "", - "ClusterAdvertise": "", - "SecurityOptions": null, - "Runtimes": null, - "DefaultRuntime": "", - "Swarm": { - "NodeID": "", - "NodeAddr": "", - "LocalNodeState": "inactive", - "ControlAvailable": false, - "Error": "", - "RemoteManagers": null, - "Nodes": 0, - "Managers": 0, - "Cluster": { - "ID": "", - "Version": {}, - "CreatedAt": "0001-01-01T00:00:00Z", - "UpdatedAt": "0001-01-01T00:00:00Z", - "Spec": { - "Orchestration": {}, - "Raft": { - "ElectionTick": 0, - "HeartbeatTick": 0 - }, - "Dispatcher": {}, - "CAConfig": {}, - "TaskDefaults": {} - } - } - }, - "LiveRestoreEnabled": false, - "Isolation": "process" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Show docker data usage information - -`GET /system/df` - -Return docker data usage information - -**Example request**: - - GET /v1.26/system/df HTTP/1.1 - -**Example response**: - - { - "LayersSize": 1092588, - "Images": [ - { - "Id": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749", - "ParentId": "", - "RepoTags": [ - "busybox:latest" - ], - "RepoDigests": [ - "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6" - ], - "Created": 1466724217, - "Size": 1092588, - "SharedSize": 0, - "VirtualSize": 1092588, - "Labels": {}, - "Containers": 1 - } - ], - "Containers": [ - { - "Id": "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148", - "Names": [ - "/top" - ], - "Image": "busybox", - "ImageID": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749", - "Command": "top", - "Created": 1472592424, - "Ports": [], - "SizeRootFs": 1092588, - "Labels": {}, - "State": "exited", - "Status": "Exited (0) 56 minutes ago", - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "d687bc59335f0e5c9ee8193e5612e8aee000c8c62ea170cfb99c098f95899d92", - "EndpointID": "8ed5115aeaad9abb174f68dcf135b49f11daf597678315231a32ca28441dec6a", - "Gateway": "172.18.0.1", - "IPAddress": "172.18.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Mounts": [] - } - ], - "Volumes": [ - { - "Name": "my-volume", - "Driver": "local", - "Mountpoint": "", - "Labels": null, - "Scope": "", - "Options": null - "UsageData": { - "Size": 0, - "RefCount": 0 - } - } - ] - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.26/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.14.0", - "Os": "linux", - "KernelVersion": "3.19.0-23-generic", - "GoVersion": "go1.6.3", - "GitCommit": "deadbee", - "Arch": "amd64", - "ApiVersion": "1.26", - "MinAPIVersion": "1.12", - "BuildTime": "2016-06-14T07:09:13.444803460+00:00", - "Experimental": true - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.26/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.26/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, load, pull, push, save, tag, untag - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -Docker daemon report the following event: - - reload - -**Example request**: - - GET /events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Server: Docker/1.11.0 (linux) - Date: Fri, 29 Apr 2016 15:18:06 GMT - Transfer-Encoding: chunked - - { - "status": "pull", - "id": "alpine:latest", - "Type": "image", - "Action": "pull", - "Actor": { - "ID": "alpine:latest", - "Attributes": { - "name": "alpine" - } - }, - "time": 1461943101, - "timeNano": 1461943101301854122 - } - { - "status": "create", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "create", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101381709551 - } - { - "status": "attach", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "attach", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101383858412 - } - { - "Type": "network", - "Action": "connect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943101, - "timeNano": 1461943101394865557 - } - { - "status": "start", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "start", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101607533796 - } - { - "status": "resize", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "resize", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "height": "46", - "image": "alpine", - "name": "my-container", - "width": "204" - } - }, - "time": 1461943101, - "timeNano": 1461943101610269268 - } - { - "status": "die", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "die", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "exitCode": "0", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105079144137 - } - { - "Type": "network", - "Action": "disconnect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943105, - "timeNano": 1461943105230860245 - } - { - "status": "destroy", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "destroy", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105338056026 - } - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - - `label=`; -- image and container label to filter - - `type=`; -- either `container` or `image` or `volume` or `network` or `daemon` - - `volume=`; -- volume to filter - - `network=`; -- network to filter - - `daemon=`; -- daemon name or id to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"status":"Loading layer","progressDetail":{"current":32768,"total":1292800},"progress":"[= ] 32.77 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":65536,"total":1292800},"progress":"[== ] 65.54 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":98304,"total":1292800},"progress":"[=== ] 98.3 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":131072,"total":1292800},"progress":"[===== ] 131.1 kB/1.293 MB","id":"8ac8bfaff55a"} - ... - {"stream":"Loaded image: busybox:latest\n"} - -**Example response**: - -If the "quiet" query parameter is set to `true` / `1` (`?quiet=1`), progress -details are suppressed, and only a confirmation message is returned once the -action completes. - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"stream":"Loaded image: busybox:latest\n"} - -**Query parameters**: - -- **quiet** – Boolean value, suppress progress details during load. Defaults - to `0` / `false` if omitted. - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.26/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "DetachKeys": "ctrl-p,ctrl-q", - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Privileged": true, - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **DetachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Privileged** - Boolean value, runs the exec process with extended privileges. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **409** - container is paused -- **500** - server error - -### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.26/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **409** - container is paused - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.26/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.26/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CanRemove": false, - "ContainerID": "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126", - "DetachKeys": "", - "ExitCode": 2, - "ID": "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b", - "OpenStderr": true, - "OpenStdin": true, - "OpenStdout": true, - "ProcessConfig": { - "arguments": [ - "-c", - "exit 2" - ], - "entrypoint": "sh", - "privileged": false, - "tty": true, - "user": "1000" - }, - "Running": false, - "Pid": "42000" - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -## 3.4 Volumes - -### List volumes - -`GET /volumes` - -**Example request**: - - GET /v1.26/volumes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Volumes": [ - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Labels":{ - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local", - "Options": { - "device": "tmpfs", - "o": "size=100m,uid=1000", - "type": "tmpfs" - } - } - ], - "Warnings": [] - } - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the volumes list. Available filters: - - `name=` Matches all or part of a volume name. - - `dangling=` When set to `true` (or `1`), returns all volumes that are "dangling" (not in use by a container). When set to `false` (or `0`), only volumes that are in use by one or more containers are returned. - - `driver=` Matches all or part of a volume driver name. - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Create a volume - -`POST /volumes/create` - -Create a volume - -**Example request**: - - POST /v1.26/volumes/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "tardis", - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Driver": "custom" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "custom", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Status": { - "hello": "world" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local", - "Options": null - } - -**Status codes**: - -- **201** - no error -- **500** - server error - -**JSON parameters**: - -- **Name** - The new volume's name. If not specified, Docker generates a name. -- **Driver** - Name of the volume driver to use. Defaults to `local` for the name. -- **DriverOpts** - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. -- **Labels** - Labels to set on the volume, specified as a map: `{"key":"value","key2":"value2"}` - -**JSON fields in response**: - -Refer to the [inspect a volume](#inspect-a-volume) section or details about the -JSON fields returned in the response. - -### Inspect a volume - -`GET /volumes/(name)` - -Return low-level information on the volume `name` - -**Example request**: - - GET /volumes/tardis - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "custom", - "Mountpoint": "/var/lib/docker/volumes/tardis/_data", - "Status": { - "hello": "world" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local", - "Options": { - "some-key": "some-value", - "some-other-key": "some-other-value" - }, - } - -**Status codes**: - -- **200** - no error -- **404** - no such volume -- **500** - server error - -**JSON fields in response**: - -The following fields can be returned in the API response. Empty fields, or -fields that are not supported by the volume's driver may be omitted in the -response. - -- **Name** - Name of the volume. -- **Driver** - Name of the volume driver used by the volume. -- **Mountpoint** - Mount path of the volume on the host. -- **Status** - Low-level details about the volume, provided by the volume driver. - Details are returned as a map with key/value pairs: `{"key":"value","key2":"value2"}`. - The `Status` field is optional, and is omitted if the volume driver does not - support this feature. -- **Labels** - Labels set on the volume, specified as a map: `{"key":"value","key2":"value2"}`. -- **Scope** - Scope describes the level at which the volume exists, can be one of - `global` for cluster-wide or `local` for machine level. The default is `local`. -- **Options** - Options holds the driver specific options to use for when creating the volume. - -### Remove a volume - -`DELETE /volumes/(name)` - -Instruct the driver to remove the volume (`name`). - -**Example request**: - - DELETE /volumes/tardis HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query Parameters**: - -- **force** - 1/True/true or 0/False/false, Force the removal of the volume. - Default `false`. - -**Status codes**: - -- **204** - no error -- **404** - no such volume or volume driver -- **409** - volume is in use and cannot be removed -- **500** - server error - -### Prune unused volumes - -`POST /volumes/prune` - -Delete unused volumes - -**Example request**: - - POST /v1.26/volumes/prune HTTP/1.1 - Content-Type: application/json - - { - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "VolumesDeleted": [ - "my-volume" - ], - "SpaceReclaimed": 42 - } - -**Status codes**: - -- **200** – no error -- **500** – server error - - -## 3.5 Networks - -### List networks - -`GET /networks` - -**Example request**: - - GET /v1.26/networks?filters={"type":{"custom":true}} HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Created": "2016-10-19T06:21:00.416543526Z", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - }, - { - "Name": "none", - "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", - "Created": "0001-01-01T00:00:00Z", - "Scope": "local", - "Driver": "null", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - }, - { - "Name": "host", - "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", - "Created": "0001-01-01T00:00:00Z", - "Scope": "local", - "Driver": "host", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - } -] -``` - -**Query parameters**: - -- **filters** - JSON encoded network list filter. The filter value is one of: - - `driver=` Matches a network's driver. - - `id=` Matches all or part of a network id. - - `label=` or `label==` of a network label. - - `name=` Matches all or part of a network name. - - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks. - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Inspect network - -`GET /networks/` - -**Example request**: - - GET /v1.26/networks/7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99 HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Name": "net01", - "Id": "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99", - "Created": "2016-10-19T04:33:30.360899459Z", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.19.0.0/16", - "Gateway": "172.19.0.1" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal": false, - "Containers": { - "19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c": { - "Name": "test", - "EndpointID": "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a", - "MacAddress": "02:42:ac:13:00:02", - "IPv4Address": "172.19.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - network not found - -### Create a network - -`POST /networks/create` - -Create a network - -**Example request**: - -``` -POST /v1.26/networks/create HTTP/1.1 -Content-Type: application/json - -{ - "Name":"isolated_nw", - "CheckDuplicate":true, - "Driver":"bridge", - "EnableIPv6": true, - "IPAM":{ - "Driver": "default", - "Config":[ - { - "Subnet":"172.20.0.0/16", - "IPRange":"172.20.10.0/24", - "Gateway":"172.20.10.11" - }, - { - "Subnet":"2001:db8:abcd::/64", - "Gateway":"2001:db8:abcd::1011" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal":true, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Example response**: - -``` -HTTP/1.1 201 Created -Content-Type: application/json - -{ - "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30", - "Warning": "" -} -``` - -**Status codes**: - -- **201** - no error -- **404** - plugin not found -- **500** - server error - -**JSON parameters**: - -- **Name** - The new network's name. this is a mandatory field -- **CheckDuplicate** - Requests daemon to check for networks with same name. Defaults to `false` -- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver -- **Internal** - Restrict external access to the network -- **IPAM** - Optional custom IP scheme for the network - - **Driver** - Name of the IPAM driver to use. Defaults to `default` driver - - **Config** - List of IPAM configuration options, specified as a map: - `{"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }` - - **Options** - Driver-specific options, specified as a map: `{"option":"value" [,"option2":"value2"]}` -- **EnableIPv6** - Enable IPv6 on the network -- **Options** - Network specific options to be used by the drivers -- **Labels** - Labels to set on the network, specified as a map: `{"key":"value" [,"key2":"value2"]}` - -### Connect a container to a network - -`POST /networks/(id)/connect` - -Connect a container to a network - -**Example request**: - -``` -POST /v1.26/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "EndpointConfig": { - "IPAMConfig": { - "IPv4Address":"172.24.56.89", - "IPv6Address":"2001:db8::5689" - } - } -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **403** - operation not supported for swarm scoped networks -- **404** - network or container is not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **container** - container-id/name to be connected to the network - -### Disconnect a container from a network - -`POST /networks/(id)/disconnect` - -Disconnect a container from a network - -**Example request**: - -``` -POST /v1.26/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "Force":false -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **403** - operation not supported for swarm scoped networks -- **404** - network or container not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **Container** - container-id/name to be disconnected from a network -- **Force** - Force the container to disconnect from a network - -### Remove a network - -`DELETE /networks/(id)` - -Instruct the driver to remove the network (`id`). - -**Example request**: - - DELETE /networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such network -- **500** - server error - -### Prune unused networks - -`POST /networks/prune` - -Delete unused networks - -**Example request**: - - POST /v1.26/networks/prune HTTP/1.1 - Content-Type: application/json - - { - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "NetworksDeleted": [ - "n1" - ], - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -## 3.6 Plugins - -### List plugins - -`GET /plugins` - -Returns information about installed plugins. - -**Example request**: - - GET /v1.26/plugins HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078", - "Name": "tiborvass/no-remove", - "Tag": "latest", - "Active": true, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-no-remove", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } - } -] -``` - -**Status codes**: - -- **200** - no error -- **500** - server error - -### Install a plugin - -`POST /plugins/pull?name=` - -Pulls and installs a plugin. After the plugin is installed, it can be enabled -using the [`POST /plugins/(plugin name)/enable` endpoint](#enable-a-plugin). - -**Example request**: - -``` -POST /v1.26/plugins/pull?name=tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. When using -this endpoint to pull a plugin from the registry, the `X-Registry-Auth` header -can be used to include a base64-encoded AuthConfig object. Refer to the [create -an image](#create-an-image) section for more details. - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json -Content-Length: 175 - -[ - { - "Name": "network", - "Description": "", - "Value": [ - "host" - ] - }, - { - "Name": "mount", - "Description": "", - "Value": [ - "/data" - ] - }, - { - "Name": "device", - "Description": "", - "Value": [ - "/dev/cpu_dma_latency" - ] - } -] -``` - -**Query parameters**: - -- **name** - Name of the plugin to pull. The name may include a tag or digest. - This parameter is required. - -**Status codes**: - -- **200** - no error -- **500** - error parsing reference / not a valid repository/tag: repository - name must have at least one component -- **500** - plugin already exists - -### Inspect a plugin - -`GET /plugins/(plugin name)` - -Returns detailed information about an installed plugin. - -**Example request**: - -``` -GET /v1.26/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078", - "Name": "tiborvass/no-remove", - "Tag": "latest", - "Active": false, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-no-remove", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed - -### Configure a plugin - -`POST /plugins/(plugin name)/set` - -**Example request**: - - - POST /plugins/tiborvass/no-remove/set - Content-Type: application/json - - ["DEBUG=1"] - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - plugin not installed - -### Enable a plugin - -`POST /plugins/(plugin name)/enable` - -Enables a plugin - -**Example request**: - -``` -POST /v1.26/plugins/tiborvass/no-remove:latest/enable HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **500** - plugin is already enabled - -### Disable a plugin - -`POST /plugins/(plugin name)/disable` - -Disables a plugin - -**Example request**: - -``` -POST /v1.26/plugins/tiborvass/no-remove:latest/disable HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **500** - plugin is already disabled - -### Remove a plugin - -`DELETE /plugins/(plugin name)` - -Removes a plugin - -**Example request**: - -``` -DELETE /plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Query parameters**: - -- **force** - Boolean value, set to `1` / `True` / `true` to force removing the - plugin. Forcing removal disables the plugin before removing, but may result - in issues if the plugin is in use by a container. - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed -- **500** - plugin is active - -### Create a plugin - -`POST /v1.26/plugins/create?name=(plugin name)` - -Create a plugin - -**Example request**: - -To create a plugin named `plugin` - -``` -POST /v1.26/plugins/create?name=plugin:latest HTTP/1.1 -Content-Type: application/x-tar - -{% raw %} -{{ TAR STREAM }} -{% endraw %} -``` - -The `:latest` tag is optional, and is used as default if omitted. - -**Example response**: - -``` -HTTP/1.1 204 No Content -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Query parameters**: - -- **name** - A name and optional tag to apply for the plugin in the `name:tag format`. If you omit the `tag` the default `:latest` value is assumed. - -**Status codes**: - -- **204** - no error -- **500** - server error - -### Push a plugin - -`POST /v1.26/plugins/(plugin name)/push` - -Pushes a plugin to the registry. - -**Example request**: - -``` -POST /v1.26/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. When using -this endpoint to push a plugin to the registry, the `X-Registry-Auth` header -can be used to include a base64-encoded AuthConfig object. Refer to the [create -an image](#create-an-image) section for more details. - -**Example response**: - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed - - -## 3.7 Nodes - -**Note**: Node operations require the engine to be part of a swarm. - -### List nodes - - -`GET /nodes` - -List nodes - -**Example request**: - - GET /v1.26/nodes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "ID": "24ifsmvkjbyhk", - "Version": { - "Index": 8 - }, - "CreatedAt": "2016-06-07T20:31:11.853781916Z", - "UpdatedAt": "2016-06-07T20:31:11.999868824Z", - "Spec": { - "Name": "my-node", - "Role": "manager", - "Availability": "active" - "Labels": { - "foo": "bar" - } - }, - "Description": { - "Hostname": "bf3067039e47", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 4000000000, - "MemoryBytes": 8272408576 - }, - "Engine": { - "EngineVersion": "1.12.0-dev", - "Labels": { - "foo": "bar", - } - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "bridge" - } - { - "Type": "Network", - "Name": "null" - } - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready", - "Addr": "172.17.0.2" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "172.17.0.2:2377"" - } - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - nodes list. Available filters: - - `id=` - - `label=` - - `membership=`(`accepted`|`pending`)` - - `name=` - - `role=`(`manager`|`worker`)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Inspect a node - - -`GET /nodes/` - -Return low-level information on the node `id` - -**Example request**: - - GET /v1.26/nodes/24ifsmvkjbyhk HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ID": "24ifsmvkjbyhk", - "Version": { - "Index": 8 - }, - "CreatedAt": "2016-06-07T20:31:11.853781916Z", - "UpdatedAt": "2016-06-07T20:31:11.999868824Z", - "Spec": { - "Name": "my-node", - "Role": "manager", - "Availability": "active" - "Labels": { - "foo": "bar" - } - }, - "Description": { - "Hostname": "bf3067039e47", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 4000000000, - "MemoryBytes": 8272408576 - }, - "Engine": { - "EngineVersion": "1.12.0-dev", - "Labels": { - "foo": "bar", - } - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "bridge" - } - { - "Type": "Network", - "Name": "null" - } - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready", - "Addr": "172.17.0.2" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "172.17.0.2:2377"" - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **500** – server error - -### Remove a node - - -`DELETE /nodes/(id)` - -Remove a node [`id`] from the swarm. - -**Example request**: - - DELETE /nodes/24ifsmvkjbyhk HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **force** - 1/True/true or 0/False/false, Force remove a node from the swarm. - Default `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **500** – server error - -### Update a node - - -`POST /nodes/(id)/update` - -Update the node `id`. - -The payload of the `POST` request is the new `NodeSpec` and -overrides the current `NodeSpec` for the specified node. - -If `Availability` or `Role` are omitted, this returns an -error. Any other field omitted resets the current value to either -an empty value or the default cluster-wide value. - -**Example Request** - - POST /v1.26/nodes/24ifsmvkjbyhk/update?version=8 HTTP/1.1 - Content-Type: application/json - - { - "Availability": "active", - "Name": "node-name", - "Role": "manager", - "Labels": { - "foo": "bar" - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **version** – The version number of the node object being updated. This is - required to avoid conflicting writes. - -JSON Parameters: - -- **Annotations** – Optional medata to associate with the service. - - **Name** – User-defined name for the service. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). -- **Role** - Role of the node (worker/manager). -- **Availability** - Availability of the node (active/pause/drain). - - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **500** – server error - -## 3.8 Swarm - -### Inspect swarm - - -`GET /swarm` - -Inspect swarm - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CreatedAt" : "2016-08-15T16:00:20.349727406Z", - "Spec" : { - "Dispatcher" : { - "HeartbeatPeriod" : 5000000000 - }, - "Orchestration" : { - "TaskHistoryRetentionLimit" : 10 - }, - "CAConfig" : { - "NodeCertExpiry" : 7776000000000000 - }, - "Raft" : { - "LogEntriesForSlowFollowers" : 500, - "HeartbeatTick" : 1, - "SnapshotInterval" : 10000, - "ElectionTick" : 3 - }, - "TaskDefaults" : {}, - "EncryptionConfig" : { - "AutoLockManagers": false - }, - "Name" : "default" - }, - "JoinTokens" : { - "Worker" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a", - "Manager" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l" - }, - "ID" : "70ilmkj2f6sp2137c753w2nmt", - "UpdatedAt" : "2016-08-15T16:32:09.623207604Z", - "Version" : { - "Index" : 51 - } - } - -**Status codes**: - -- **200** - no error - -### Initialize a new swarm - - -`POST /swarm/init` - -Initialize a new swarm. The body of the HTTP response includes the node ID. - -**Example request**: - - POST /v1.26/swarm/init HTTP/1.1 - Content-Type: application/json - - { - "ListenAddr": "0.0.0.0:2377", - "AdvertiseAddr": "192.168.1.1:2377", - "ForceNewCluster": false, - "Spec": { - "Orchestration": {}, - "Raft": {}, - "Dispatcher": {}, - "CAConfig": {}, - "EncryptionConfig" : { - "AutoLockManagers": false - } - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 28 - Content-Type: application/json - Date: Thu, 01 Sep 2016 21:49:13 GMT - Server: Docker/1.12.0 (linux) - - "7v2t30z9blmxuhnyo6s4cpenp" - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **406** – node is already part of a swarm - -JSON Parameters: - -- **ListenAddr** – Listen address used for inter-manager communication, as well as determining - the networking interface used for the VXLAN Tunnel Endpoint (VTEP). This can either be an - address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the default swarm listening port is - used. -- **AdvertiseAddr** – Externally reachable address advertised to other nodes. This can either be - an address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the port number from the listen - address is used. If `AdvertiseAddr` is not specified, it will be automatically detected when - possible. -- **ForceNewCluster** – Force creation of a new swarm. -- **Spec** – Configuration settings for the new swarm. - - **Orchestration** – Configuration settings for the orchestration aspects of the swarm. - - **TaskHistoryRetentionLimit** – Maximum number of tasks history stored. - - **Raft** – Raft related configuration. - - **SnapshotInterval** – Number of logs entries between snapshot. - - **KeepOldSnapshots** – Number of snapshots to keep beyond the current snapshot. - - **LogEntriesForSlowFollowers** – Number of log entries to keep around to sync up slow - followers after a snapshot is created. - - **HeartbeatTick** – Amount of ticks (in seconds) between each heartbeat. - - **ElectionTick** – Amount of ticks (in seconds) needed without a leader to trigger a new - election. - - **Dispatcher** – Configuration settings for the task dispatcher. - - **HeartbeatPeriod** – The delay for an agent to send a heartbeat to the dispatcher. - - **CAConfig** – Certificate authority configuration. - - **NodeCertExpiry** – Automatic expiry for nodes certificates. - - **ExternalCA** - Configuration for forwarding signing requests to an external - certificate authority. - - **Protocol** - Protocol for communication with the external CA - (currently only "cfssl" is supported). - - **URL** - URL where certificate signing requests should be sent. - - **Options** - An object with key/value pairs that are interpreted - as protocol-specific options for the external CA driver. - - **EncryptionConfig** – Parameters related to encryption-at-rest. - - **AutoLockManagers**: If set, generate a key and use it to lock data stored on the - managers. - -### Join an existing swarm - -`POST /swarm/join` - -Join an existing swarm - -**Example request**: - - POST /v1.26/swarm/join HTTP/1.1 - Content-Type: application/json - - { - "ListenAddr": "0.0.0.0:2377", - "AdvertiseAddr": "192.168.1.1:2377", - "RemoteAddrs": ["node1:2377"], - "JoinToken": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **406** – node is already part of a swarm - -JSON Parameters: - -- **ListenAddr** – Listen address used for inter-manager communication if the node gets promoted to - manager, as well as determining the networking interface used for the VXLAN Tunnel Endpoint (VTEP). -- **AdvertiseAddr** – Externally reachable address advertised to other nodes. This can either be - an address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the port number from the listen - address is used. If `AdvertiseAddr` is not specified, it will be automatically detected when - possible. -- **RemoteAddr** – Address of any manager node already participating in the swarm. -- **JoinToken** – Secret token for joining this swarm. - -### Leave a swarm - - -`POST /swarm/leave` - -Leave a swarm - -**Example request**: - - POST /v1.26/swarm/leave HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **force** - Boolean (0/1, false/true). Force leave swarm, even if this is the last manager or that it will break the cluster. - -**Status codes**: - -- **200** – no error -- **406** – node is not part of a swarm - -### Retrieve the swarm's unlock key - -`GET /swarm/unlockkey` - -Get unlock key - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "UnlockKey": "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8" - } - -**Status codes**: - -- **200** - no error - -### Unlock a locked manager - -`POST /swarm/unlock` - -Unlock a manager - -**Example request**: - - POST /v1.26/swarm/unlock HTTP/1.1 - Content-Type: application/json - - { - "UnlockKey": "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8" - } - -**Status codes**: - -- **200** - no error - -### Update a swarm - - -`POST /swarm/update` - -Update a swarm - -**Example request**: - - POST /v1.26/swarm/update HTTP/1.1 - - { - "Name": "default", - "Orchestration": { - "TaskHistoryRetentionLimit": 10 - }, - "Raft": { - "SnapshotInterval": 10000, - "LogEntriesForSlowFollowers": 500, - "HeartbeatTick": 1, - "ElectionTick": 3 - }, - "Dispatcher": { - "HeartbeatPeriod": 5000000000 - }, - "CAConfig": { - "NodeCertExpiry": 7776000000000000 - }, - "JoinTokens": { - "Worker": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx", - "Manager": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - }, - "EncryptionConfig": { - "AutoLockManagers": false - } - } - - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **version** – The version number of the swarm object being updated. This is - required to avoid conflicting writes. -- **rotateWorkerToken** - Set to `true` (or `1`) to rotate the worker join token. -- **rotateManagerToken** - Set to `true` (or `1`) to rotate the manager join token. -- **rotateManagerUnlockKey** - Set to `true` (or `1`) to rotate the manager unlock key. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **406** – node is not part of a swarm - -JSON Parameters: - -- **Orchestration** – Configuration settings for the orchestration aspects of the swarm. - - **TaskHistoryRetentionLimit** – Maximum number of tasks history stored. -- **Raft** – Raft related configuration. - - **SnapshotInterval** – Number of logs entries between snapshot. - - **KeepOldSnapshots** – Number of snapshots to keep beyond the current snapshot. - - **LogEntriesForSlowFollowers** – Number of log entries to keep around to sync up slow - followers after a snapshot is created. - - **HeartbeatTick** – Amount of ticks (in seconds) between each heartbeat. - - **ElectionTick** – Amount of ticks (in seconds) needed without a leader to trigger a new - election. -- **Dispatcher** – Configuration settings for the task dispatcher. - - **HeartbeatPeriod** – The delay for an agent to send a heartbeat to the dispatcher. -- **CAConfig** – CA configuration. - - **NodeCertExpiry** – Automatic expiry for nodes certificates. - - **ExternalCA** - Configuration for forwarding signing requests to an external - certificate authority. - - **Protocol** - Protocol for communication with the external CA - (currently only "cfssl" is supported). - - **URL** - URL where certificate signing requests should be sent. - - **Options** - An object with key/value pairs that are interpreted - as protocol-specific options for the external CA driver. -- **JoinTokens** - Tokens that can be used by other nodes to join the swarm. - - **Worker** - Token to use for joining as a worker. - - **Manager** - Token to use for joining as a manager. -- **EncryptionConfig** – Parameters related to encryption-at-rest. - - **AutoLockManagers**: If set, generate a key and use it to lock data stored on the - managers. - -## 3.9 Services - -**Note**: Service operations require to first be part of a swarm. - -### List services - - -`GET /services` - -List services - -**Example request**: - - GET /v1.26/services HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "ID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Version": { - "Index": 19 - }, - "CreatedAt": "2016-06-07T21:05:51.880065305Z", - "UpdatedAt": "2016-06-07T21:07:29.962229872Z", - "Spec": { - "Name": "hopeful_cori", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {}, - "ForceUpdate": 0 - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "FailureAction": "pause", - "Monitor": 15000000000, - "MaxFailureRatio": 0.15 - }, - "EndpointSpec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - } - }, - "Endpoint": { - "Spec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - }, - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ], - "VirtualIPs": [ - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.2/16" - }, - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.3/16" - } - ] - } - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - services list. Available filters: - - `id=` - - `label=` - - `name=` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Create a service - -`POST /services/create` - -Create a service. When using this endpoint to create a service using a private -repository from the registry, the `X-Registry-Auth` header must be used to -include a base64-encoded AuthConfig object. Refer to the [create an -image](#create-an-image) section for more details. - -**Example request**: - - POST /v1.26/services/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "web", - "TaskTemplate": { - "ContainerSpec": { - "Image": "nginx:alpine", - "Mounts": [ - { - "ReadOnly": true, - "Source": "web-data", - "Target": "/usr/share/nginx/html", - "Type": "volume", - "VolumeOptions": { - "DriverConfig": { - }, - "Labels": { - "com.example.something": "something-value" - } - } - } - ], - "User": "33", - "TTY": false, - "DNSConfig": { - "Nameservers": ["8.8.8.8"], - "Search": ["example.org"], - "Options": ["timeout:3"] - } - }, - "LogDriver": { - "Name": "json-file", - "Options": { - "max-file": "3", - "max-size": "10M" - } - }, - "Placement": {}, - "Resources": { - "Limits": { - "MemoryBytes": 104857600.0 - }, - "Reservations": { - } - }, - "RestartPolicy": { - "Condition": "on-failure", - "Delay": 10000000000.0, - "MaxAttempts": 10 - }, - "ForceUpdate": 0 - }, - "Mode": { - "Replicated": { - "Replicas": 4 - } - }, - "UpdateConfig": { - "Delay": 30000000000.0, - "Parallelism": 2, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Ports": [ - { - "Protocol": "tcp", - "PublishedPort": 8080, - "TargetPort": 80 - } - ] - }, - "Labels": { - "foo": "bar" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "ID": "ak7w3gjqoa3kuz8xcpnyy0pvl", - "Warnings": ["unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found"] - } - -**Status codes**: - -- **201** – no error -- **406** – server error or node is not part of a swarm -- **409** – name conflicts with an existing object - -**JSON Parameters**: - -- **Name** – User-defined name for the service. -- **Labels** – A map of labels to associate with the service (e.g., `{"key":"value", "key2":"value2"}`). -- **TaskTemplate** – Specification of the tasks to start as part of the new service. - - **ContainerSpec** - Container settings for containers started as part of this task. - - **Image** – A string specifying the image name to use for the container. - - **Command** – The command to be run in the image. - - **Args** – Arguments to the command. - - **Env** – A list of environment variables in the form of `["VAR=value"[,"VAR2=value2"]]`. - - **Dir** – A string specifying the working directory for commands to run in. - - **User** – A string value specifying the user inside the container. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). - - **TTY** – A boolean indicating whether a pseudo-TTY should be allocated. - - **Mounts** – Specification for mounts to be added to containers - created as part of the service. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, or `volume`). - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type. - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume. - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume. - - **Options** - key/value map of driver specific options. - - **StopGracePeriod** – Amount of time to wait for the container to terminate before - forcefully killing it. - - **DNSConfig** – Specification for DNS related configurations in - resolver configuration file (resolv.conf). - - **Nameservers** – A list of the IP addresses of the name servers. - - **Search** – A search list for host-name lookup. - - **Options** – A list of internal resolver variables to be modified (e.g., `debug`, `ndots:3`, etc.). - - **LogDriver** - Log configuration for containers created as part of the - service. - - **Name** - Name of the logging driver to use (`json-file`, `syslog`, - `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`). - - **Options** - Driver-specific options. - - **Resources** – Resource requirements which apply to each individual container created as part - of the service. - - **Limits** – Define resources limits. - - **NanoCPUs** – CPU limit in units of 10-9 CPU shares. - - **MemoryBytes** – Memory limit in Bytes. - - **Reservation** – Define resources reservation. - - **NanoCPUs** – CPU reservation in units of 10-9 CPU shares. - - **MemoryBytes** – Memory reservation in Bytes. - - **RestartPolicy** – Specification for the restart policy which applies to containers created - as part of this service. - - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - - **Delay** – Delay between restart attempts, in nanoseconds. - - **MaxAttempts** – Maximum attempts to restart a given container before giving up (default value - is 0, which is ignored). - - **Window** – Windows is the time window used to evaluate the restart policy (default value is - 0, which is unbounded). - - **Placement** – An array of constraints. - - **ForceUpdate**: A counter that triggers an update even if no relevant parameters have been changed. -- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). -- **UpdateConfig** – Specification for the update strategy of the service. - - **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited - parallelism). - - **Delay** – Amount of time between updates, in nanoseconds. - - **FailureAction** - Action to take if an updated task fails to run, or stops running during the - update. Values are `continue` and `pause`. - - **Monitor** - Amount of time to monitor each updated task for failures, in nanoseconds. - - **MaxFailureRatio** - The fraction of tasks that may fail during an update before the - failure action is invoked, specified as a floating point number between 0 and 1. The default is 0. -- **Networks** – Array of network names or IDs to attach the service to. -- **EndpointSpec** – Properties that can be configured to access and load balance a service. - - **Mode** – The mode of resolution to use for internal load balancing - between tasks (`vip` or `dnsrr`). Defaults to `vip` if not provided. - - **Ports** – List of exposed ports that this service is accessible on from - the outside, in the form of: - `{"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }`. - Ports can only be provided if `vip` resolution mode is used. - -**Request Headers**: - -- **Content-type** – Set to `"application/json"`. -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either - login information, or a token. Refer to the [create an image](#create-an-image) - section for more details. - - -### Remove a service - - -`DELETE /services/(id or name)` - -Stop and remove the service `id` - -**Example request**: - - DELETE /services/16253994b7c4 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **500** – server error - -### Inspect one or more services - - -`GET /services/(id or name)` - -Return information on the service `id`. - -**Example request**: - - GET /v1.26/services/1cb4dnqcyx6m66g2t538x3rxha HTTP/1.1 - -**Example response**: - - { - "ID": "ak7w3gjqoa3kuz8xcpnyy0pvl", - "Version": { - "Index": 95 - }, - "CreatedAt": "2016-06-07T21:10:20.269723157Z", - "UpdatedAt": "2016-06-07T21:10:20.276301259Z", - "Spec": { - "Name": "redis", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - } - }, - "Endpoint": { - "Spec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - }, - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ], - "VirtualIPs": [ - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.4/16" - } - ] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **500** – server error - -### Update a service - -`POST /services/(id or name)/update` - -Update a service. When using this endpoint to create a service using a -private repository from the registry, the `X-Registry-Auth` header can be used -to update the authentication information for that is stored for the service. -The header contains a base64-encoded AuthConfig object. Refer to the [create an -image](#create-an-image) section for more details. - -**Example request**: - - POST /v1.26/services/1cb4dnqcyx6m66g2t538x3rxha/update?version=23 HTTP/1.1 - Content-Type: application/json - - { - "Name": "top", - "TaskTemplate": { - "ContainerSpec": { - "Image": "busybox", - "Args": [ - "top" - ], - "TTY": true, - "DNSConfig": { - "Nameservers": ["8.8.8.8"], - "Search": ["example.org"], - "Options": ["timeout:3"] - } - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {}, - "ForceUpdate": 0 - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "Monitor": 15000000000, - "MaxFailureRatio": 0.15 - }, - "EndpointSpec": { - "Mode": "vip" - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**JSON Parameters**: - -- **Name** – User-defined name for the service. Note that renaming services is not supported. -- **Labels** – A map of labels to associate with the service (e.g., `{"key":"value", "key2":"value2"}`). -- **TaskTemplate** – Specification of the tasks to start as part of the new service. - - **ContainerSpec** - Container settings for containers started as part of this task. - - **Image** – A string specifying the image name to use for the container. - - **Command** – The command to be run in the image. - - **Args** – Arguments to the command. - - **Env** – A list of environment variables in the form of `["VAR=value"[,"VAR2=value2"]]`. - - **Dir** – A string specifying the working directory for commands to run in. - - **User** – A string value specifying the user inside the container. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). - - **TTY** – A boolean indicating whether a pseudo-TTY should be allocated. - - **Mounts** – Specification for mounts to be added to containers created as part of the new - service. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, or `volume`). - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume. - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume - - **Options** - key/value map of driver specific options - - **StopGracePeriod** – Amount of time to wait for the container to terminate before - forcefully killing it. - - **DNSConfig** – Specification for DNS related configurations in - resolver configuration file (resolv.conf). - - **Nameservers** – A list of the IP addresses of the name servers. - - **Search** – A search list for host-name lookup. - - **Options** – A list of internal resolver variables to be modified (e.g., `debug`, `ndots:3`, etc.). - - **Resources** – Resource requirements which apply to each individual container created as part - of the service. - - **Limits** – Define resources limits. - - **CPU** – CPU limit - - **Memory** – Memory limit - - **Reservation** – Define resources reservation. - - **CPU** – CPU reservation - - **Memory** – Memory reservation - - **RestartPolicy** – Specification for the restart policy which applies to containers created - as part of this service. - - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - - **Delay** – Delay between restart attempts, in nanoseconds. - - **MaxAttempts** – Maximum attempts to restart a given container before giving up (default value - is 0, which is ignored). - - **Window** – Windows is the time window used to evaluate the restart policy (default value is - 0, which is unbounded). - - **Placement** – An array of constraints. - - **ForceUpdate**: A counter that triggers an update even if no relevant parameters have been changed. -- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). -- **UpdateConfig** – Specification for the update strategy of the service. - - **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited - parallelism). - - **Delay** – Amount of time between updates, in nanoseconds. - - **FailureAction** - Action to take if an updated task fails to run, or stops running during the - update. Values are `continue` and `pause`. - - **Monitor** - Amount of time to monitor each updated task for failures, in nanoseconds. - - **MaxFailureRatio** - The fraction of tasks that may fail during an update before the - failure action is invoked, specified as a floating point number between 0 and 1. The default is 0. -- **Networks** – Array of network names or IDs to attach the service to. -- **EndpointSpec** – Properties that can be configured to access and load balance a service. - - **Mode** – The mode of resolution to use for internal load balancing - between tasks (`vip` or `dnsrr`). Defaults to `vip` if not provided. - - **Ports** – List of exposed ports that this service is accessible on from - the outside, in the form of: - `{"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }`. - Ports can only be provided if `vip` resolution mode is used. - -**Query parameters**: - -- **version** – The version number of the service object being updated. This is - required to avoid conflicting writes. -- **registryAuthFrom** - If the X-Registry-Auth header is not specified, this - parameter indicates where to find registry authorization credentials. The - valid values are `spec` and `previous-spec`. If unspecified, the default is - `spec`. - -**Request Headers**: - -- **Content-type** – Set to `"application/json"`. -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either - login information, or a token. Refer to the [create an image](#create-an-image) - section for more details. - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **500** – server error - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": ["unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found"] - } - - -### Get service logs - -`GET /services/(id or name)/logs` - -Get `stdout` and `stderr` logs from the service ``id`` - -> **Note**: -> This endpoint works only for services with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /services/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **details** - 1/True/true or 0/False/flase, Show extra details provided to logs. Default `false`. -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such service -- **500** – server error - -## 3.10 Tasks - -**Note**: Task operations require the engine to be part of a swarm. - -### List tasks - - -`GET /tasks` - -List tasks - -**Example request**: - - GET /v1.26/tasks HTTP/1.1 - -**Example response**: - - [ - { - "ID": "0kzzo1i0y4jz6027t0k7aezc7", - "Version": { - "Index": 71 - }, - "CreatedAt": "2016-06-07T21:07:31.171892745Z", - "UpdatedAt": "2016-06-07T21:07:31.376370513Z", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:31.290032978Z", - "State": "running", - "Message": "started", - "ContainerStatus": { - "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035", - "PID": 677 - } - }, - "DesiredState": "running", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.10/16" - ] - } - ], - }, - { - "ID": "1yljwbmlr8er2waf8orvqpwms", - "Version": { - "Index": 30 - }, - "CreatedAt": "2016-06-07T21:07:30.019104782Z", - "UpdatedAt": "2016-06-07T21:07:30.231958098Z", - "Name": "hopeful_cori", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:30.202183143Z", - "State": "shutdown", - "Message": "shutdown", - "ContainerStatus": { - "ContainerID": "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213" - } - }, - "DesiredState": "shutdown", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.5/16" - ] - } - ] - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - services list. Available filters: - - `id=` - - `name=` - - `service=` - - `node=` - - `label=key` or `label="key=value"` - - `desired-state=(running | shutdown | accepted)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### Inspect a task - - -`GET /tasks/(task id)` - -Get details on a task - -**Example request**: - - GET /v1.26/tasks/0kzzo1i0y4jz6027t0k7aezc7 HTTP/1.1 - -**Example response**: - - { - "ID": "0kzzo1i0y4jz6027t0k7aezc7", - "Version": { - "Index": 71 - }, - "CreatedAt": "2016-06-07T21:07:31.171892745Z", - "UpdatedAt": "2016-06-07T21:07:31.376370513Z", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:31.290032978Z", - "State": "running", - "Message": "started", - "ContainerStatus": { - "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035", - "PID": 677 - } - }, - "DesiredState": "running", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.10/16" - ] - } - ] - } - -**Status codes**: - -- **200** – no error -- **404** – unknown task -- **500** – server error - -## 3.11 Secrets - -**Note**: Secret operations require the engine to be part of a swarm. - -### List secrets - -`GET /secrets` - -List secrets - -**Example request**: - - GET /secrets HTTP/1.1 - -**Example response**: - - [ - { - "ID": "ktnbjxoalbkvbvedmg1urrz8h", - "Version": { - "Index": 11 - }, - "CreatedAt": "2016-11-05T01:20:17.327670065Z", - "UpdatedAt": "2016-11-05T01:20:17.327670065Z", - "Spec": { - "Name": "app-dev.crt" - }, - "Digest": "sha256:11d7c6f38253b73e608153c9f662a191ae605e1a3d9b756b0b3426388f91d3fa", - "SecretSize": 31 - } - ] - - -**Query parameters**: - -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the secrets list. Available filters: - - `names=` - -**Status codes**: - -- **200** – no error - -### Create a secret - -`POST /secrets/create` - -Create a secret - -**Example request**: - - POST /secrets/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "app-key.crt", - "Labels": { - "foo": "bar" - }, - "Data": "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg==" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "ID": "ktnbjxoalbkvbvedmg1urrz8h" - } - -**Status codes**: - -- **201** – no error -- **406** – server error or node is not part of a swarm -- **409** – name conflicts with an existing object - -**JSON Parameters**: - -- **Name** – User-defined name for the secret. -- **Labels** – A map of labels to associate with the secret (e.g., `{"key":"value", "key2":"value2"}`). -- **Data** – Base64-url-safe-encoded secret data - -### Inspect a secret - -`GET /secrets/(secret id)` - -Get details on a secret - -**Example request**: - - GET /secrets/ktnbjxoalbkvbvedmg1urrz8h HTTP/1.1 - -**Example response**: - - { - "ID": "ktnbjxoalbkvbvedmg1urrz8h", - "Version": { - "Index": 11 - }, - "CreatedAt": "2016-11-05T01:20:17.327670065Z", - "UpdatedAt": "2016-11-05T01:20:17.327670065Z", - "Spec": { - "Name": "app-dev.crt" - }, - "Digest": "sha256:11d7c6f38253b73e608153c9f662a191ae605e1a3d9b756b0b3426388f91d3fa", - "SecretSize": 31 - } - -**Status codes**: - -- **200** – no error -- **404** – unknown secret -- **500** – server error - -### Remove a secret - -`DELETE /secrets/(id)` - -Remove the secret `id` from the secret store - -**Example request**: - - DELETE /secrets/ktnbjxoalbkvbvedmg1urrz8h HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -# 4. Going further - -## 4.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - 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. - -## 4.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -## 4.3 CORS Requests - -To set cross origin requests to the remote api please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/docs/reference/api/hub_registry_spec.md b/docs/reference/api/hub_registry_spec.md deleted file mode 100644 index 7df69c58ec..0000000000 --- a/docs/reference/api/hub_registry_spec.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -published: false -title: "The Docker Hub and the Registry v1" -description: "Documentation for docker Registry and Registry API" -keywords: "docker, registry, api, hub" ---- - - - -# The Docker Hub and the Registry v1 - -This API is deprecated as of 1.7. To view the old version, see the [go -here](https://docs.docker.com/v1.7/docker/reference/api/hub_registry_spec/) in -the 1.7 documentation. If you want an overview of the current features in -Docker Hub or other image management features see the [image management -overview](https://docs.docker.com/engine/userguide/eng-image/image_management/) in the current documentation set. diff --git a/docs/reference/api/images/event_state.gliffy b/docs/reference/api/images/event_state.gliffy deleted file mode 100644 index fcf080da5f..0000000000 --- a/docs/reference/api/images/event_state.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":1193,"height":556,"nodeIndex":370,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":26.46762966848334,"y":100},"max":{"x":1192.861928406027,"y":555.2340187157677}},"printModel":{"pageSize":"Letter","portrait":true,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":373.99998474121094,"y":389.93402099609375,"rotation":0.0,"id":355,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":0,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":191,"py":0.7071067811865475,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":-0.663724900050094,"endArrowRotation":-0.6637248993502937,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[22.0,-17.0],[94.00000762939453,-17.0],[94.00000762939453,-61.64974974863185],[166.00001525878906,-61.64974974863185]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":359,"width":75.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5,"linePerpValue":0.0,"cardinalityType":null,"html":"

docker start

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":275.99998474121094,"y":323.93402099609375,"rotation":0.0,"id":344,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":127,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":335,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":193,"py":0.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":105.08369488824782,"endArrowRotation":91.96866662391399,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[22.531977827253513,30.06597900390625],[22.531977827253513,51.06597900390625],[-52.96697615221987,51.06597900390625],[-52.96697615221987,106.06597900390625]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":347,"width":64.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

docker rm

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":279.99998474121094,"y":249.93402099609375,"rotation":0.0,"id":342,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":126,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":188,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":191,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-74.99998474121094,0.06597900390625],[297.50001525878906,0.06597900390625],[297.50001525878906,50.06597900390625]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":313.99998474121094,"y":290.93402099609375,"rotation":0.0,"id":341,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":123,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":335,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":191,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[19.531977827253513,28.06597900390625],[88.35546419381131,28.06597900390625],[157.17895056036912,28.06597900390625],[226.00243692692698,28.06597900390625]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":353,"width":75.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

docker start

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":214.99998474121094,"y":322.93402099609375,"rotation":0.0,"id":340,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":122,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":228,"py":0.5733505249023437,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":335,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-7.637919363960094,-3.93402099609375],[11.085379699777775,-3.93402099609375],[29.808678763515644,-3.93402099609375],[48.53197782725351,-3.93402099609375]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":83.0,"y":251.0,"rotation":0.0,"id":328,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":116,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":188,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-52.03237033151666,-0.9999999999999716],[47.0,-1.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":332,"width":67.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5233416311379174,"linePerpValue":null,"cardinalityType":null,"html":"

docker run

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":74.0,"y":318.0,"rotation":0.0,"id":327,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":113,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":228,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-42.0,1.0],[58.5,2.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":333,"width":85.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5689443767164591,"linePerpValue":null,"cardinalityType":null,"html":"

docker create

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":191.0,"y":409.0,"rotation":0.0,"id":325,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":112,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":193,"py":0.5,"px":0.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":215,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-21.0,41.0],[-61.0,41.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":331.0,"y":346.0,"rotation":0.0,"id":320,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":109,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":209,"py":0.5,"px":0.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":193,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[2.5319625684644507,49.0],[-41.734018715767775,49.0],[-41.734018715767775,104.0],[-86.0,104.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":324,"width":64.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

docker rm

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":872.0,"y":503.0,"rotation":0.0,"id":310,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":108,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":205,"py":0.0,"px":0.2928932188134524}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-60.03300858899104,-53.0],[-148.0,-151.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":735.0,"y":341.0,"rotation":0.0,"id":307,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":105,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":203,"py":0.2928932188134525,"px":1.1102230246251563E-16}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[0.0,0.0],[137.5,60.7157287525381]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":309,"width":83.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.37922003257116654,"linePerpValue":null,"cardinalityType":null,"html":"

docker pause

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":1023.0,"y":446.0,"rotation":0.0,"id":298,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":102,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":213,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":205,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[39.5,-1.0],[39.5,24.0],[-158.0,24.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":313,"width":100.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.37286693198126664,"linePerpValue":null,"cardinalityType":null,"html":"

 docker unpause

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":904.0,"y":434.0,"rotation":0.0,"id":295,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":101,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":203,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":213,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[43.5,-24.0],[123.5,-24.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":411.0,"y":419.0,"rotation":0.0,"id":291,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":98,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":217,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[7.2659812842321685,51.0],[-14.0,51.0],[-14.0,-3.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":292,"width":21.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5714437496124175,"linePerpValue":0.0,"cardinalityType":null,"html":"

No

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":415.0,"y":419.0,"rotation":0.0,"id":289,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":95,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":217,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":191,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[53.26598128423217,1.0],[53.26598128423217,-32.5],[162.5,-32.5],[162.5,-79.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":290,"width":26.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.46753493572435184,"linePerpValue":null,"cardinalityType":null,"html":"

Yes

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":521.0,"y":209.0,"rotation":0.0,"id":287,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":94,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":195,"py":0.5,"px":0.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":209,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-11.0,-19.0],[-97.23401871576777,-19.0],[-97.23401871576777,186.0],[-117.46803743153555,186.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":988.0,"y":232.0,"rotation":0.0,"id":282,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":93,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":201,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[39.5,18.0],[-150.0,18.0],[-150.0,68.0],[-250.0,68.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":664.0,"y":493.0,"rotation":0.0,"id":276,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":92,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":207,"py":0.5,"px":0.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":236,"py":0.7071067811865475,"px":0.9999999999999998}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[8.5,42.23401871576766],[-20.25,42.23401871576766],[-20.25,-44.7157287525381],[-49.0,-44.7157287525381]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":678.0,"y":344.0,"rotation":0.0,"id":273,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":89,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":236,"py":0.29289321881345237,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":91.17113025781374,"endArrowRotation":176.63803454243802,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[2.0,-4.0],[2.0,87.7157287525381],[-63.0,87.7157287525381]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":275,"width":59.0,"height":42.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5,"linePerpValue":0.0,"cardinalityType":null,"html":"

container 

process

exited

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":566.0,"y":431.0,"rotation":0.0,"id":272,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":88,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":236,"py":0.5,"px":0.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":217,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-26.0,9.0],[-36.867009357883944,9.0],[-36.867009357883944,39.0],[-47.73401871576789,39.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":785.0,"y":119.0,"rotation":0.0,"id":270,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":87,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":199,"py":0.5,"px":0.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":209,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[5.0,1.0],[-416.46803743153555,1.0],[-416.46803743153555,241.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":829.0,"y":172.0,"rotation":0.0,"id":269,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":86,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":248,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":199,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-1.5,-2.0],[-1.5,-32.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":661.0,"y":189.0,"rotation":0.0,"id":267,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":85,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":195,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[7.0,2.284271247461902],[-76.0,1.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":946.0,"y":319.0,"rotation":0.0,"id":263,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":83,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":197,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":233,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.5,1.0],[81.5,1.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":708.0,"y":286.0,"rotation":0.0,"id":256,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":80,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":211,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":254,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-0.5,-2.0],[-0.5,-76.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":258,"width":64.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.3108108108108108,"linePerpValue":null,"cardinalityType":null,"html":"

docker kill

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":710.0,"y":359.0,"rotation":0.0,"id":245,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":68,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":211,"py":1.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":207,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-2.5,-5.0],[0.0,156.23401871576766]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":247,"width":84.0,"height":28.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

 killed by

out-of-memory

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":761.0,"y":318.0,"rotation":0.0,"id":238,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":65,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":211,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":197,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-18.5,1.0],[111.5,2.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":240,"width":87.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4363456059259962,"linePerpValue":null,"cardinalityType":null,"html":"

docker restart

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":608.0,"y":319.0,"rotation":0.0,"id":232,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":58,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":191,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":211,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[7.0,1.0],[64.5,0.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":333.53196256846445,"y":360.0,"rotation":0.0,"id":209,"width":70.0,"height":70.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.connector","order":33,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#e6b8af","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5555555555555554,"y":0.0,"rotation":0.0,"id":210,"width":66.88888888888889,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

stopped

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":540.0,"y":300.0,"rotation":0.0,"id":191,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":6,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":192,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

start

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":510.0,"y":170.0,"rotation":0.0,"id":195,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":196,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

kill

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":872.5,"y":300.0,"rotation":0.0,"id":197,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":198,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

die

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":790.0,"y":100.0,"rotation":0.0,"id":199,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":18,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":200,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

stop

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":790.0,"y":450.0,"rotation":0.0,"id":205,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":206,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

unpause

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":672.5,"y":515.2340187157677,"rotation":0.0,"id":207,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":208,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

OOM

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":672.5,"y":284.0,"rotation":0.0,"id":211,"width":70.0,"height":70.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.connector","order":36,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#b6d7a8","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5555555555555556,"y":0.0,"rotation":0.0,"id":212,"width":66.88888888888889,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

running

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":403.5319625684644,"y":420.0,"rotation":0.0,"id":227,"width":130.46803743153555,"height":116.23401871576777,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":54,"lockAspectRatio":false,"lockShape":false,"children":[{"x":-6.765981284232225,"y":76.0,"rotation":45.0,"id":223,"width":80.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":53,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Restart 

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":57.234018715767775,"y":75.0,"rotation":315.0,"id":219,"width":80.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":51,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Policy

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":14.734018715767775,"y":0.0,"rotation":0.0,"id":217,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.decision","order":46,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.diamond.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":218,"width":96.0,"height":28.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Should restart?

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":1027.5,"y":375.0,"rotation":0.0,"id":213,"width":70.0,"height":70.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.connector","order":39,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#fce5cd","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5555555555555556,"y":0.0,"rotation":0.0,"id":214,"width":66.88888888888889,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

paused

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":872.5,"y":390.0,"rotation":0.0,"id":203,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":204,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

pause

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":540.0,"y":420.0,"rotation":0.0,"id":236,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":62,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":237,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

die

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":790.0,"y":170.0,"rotation":0.0,"id":248,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":71,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":249,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

die

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":670.0,"y":170.0,"rotation":0.0,"id":254,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":77,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":255,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

die

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":740.0,"y":323.0,"rotation":0.0,"id":250,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":74,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":248,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-10.0,-33.0],[87.5,-113.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":253,"width":73.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

docker stop

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":1027.5,"y":300.0,"rotation":0.0,"id":233,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":59,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":234,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

start

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":1027.5,"y":230.0,"rotation":0.0,"id":201,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":21,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":202,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

restart

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":1066.5,"y":298.0,"rotation":0.0,"id":264,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":84,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":233,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":201,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-1.5,2.0],[-1.5,-28.0]],"lockSegments":{},"ortho":false}},"linkMap":[],"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":132.5,"y":300.0,"rotation":0.0,"id":228,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":55,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":229,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

create

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":130.0,"y":230.0,"rotation":0.0,"id":188,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":190,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

create

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":263.53196256846445,"y":284.0,"rotation":0.0,"id":335,"width":70.0,"height":70.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.connector","order":119,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#a4c2f4","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5555555555555554,"y":0.0,"rotation":0.0,"id":336,"width":66.88888888888889,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

created

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":60.0,"y":415.0,"rotation":0.0,"id":215,"width":70.0,"height":70.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.connector","order":42,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#b7b7b7","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5555555555555556,"y":0.0,"rotation":0.0,"id":216,"width":66.88888888888889,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

deleted

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":170.0,"y":430.0,"rotation":0.0,"id":193,"width":75.0,"height":40.0,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.5,"y":0.0,"rotation":0.0,"id":194,"width":72.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

destroy

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":1133.0,"y":570.0,"rotation":0.0,"id":362,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":130,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":213,"py":0.5,"px":1.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":0.9595103354441726,"endArrowRotation":177.33110321368451,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[-55.0,-192.0],[-3.5,-192.0],[-3.5,-160.0],[-35.5,-160.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":363,"width":87.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5835366104291947,"linePerpValue":-20.0,"cardinalityType":null,"html":"

docker update

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":281.0,"y":596.0,"rotation":0.0,"id":364,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":133,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":335,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":-88.08561222234982,"endArrowRotation":85.23919045962671,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[-7.0,-301.0],[-7.0,-334.0],[17.53196256846445,-334.0],[17.53196256846445,-312.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":365,"width":87.0,"height":14.0,"uid":null,"order":135,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.524371533874117,"linePerpValue":0.0,"cardinalityType":null,"html":"

docker update

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":305.0,"y":604.0,"rotation":0.0,"id":366,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":136,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":209,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":92.55340974719384,"endArrowRotation":-91.2277874986563,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[63.53196256846445,-174.0],[63.53196256846445,-144.0],[37.0,-144.0],[37.0,-186.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":367,"width":87.0,"height":14.0,"uid":null,"order":138,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.5749848592663713,"linePerpValue":-20.0,"cardinalityType":null,"html":"

docker update

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"},{"x":516.0,"y":570.0,"rotation":0.0,"id":368,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":139,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":1,"startArrowRotation":183.34296440226473,"endArrowRotation":-0.7310374013608921,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[158.0,-263.0],[134.0,-263.0],[134.0,-284.0],[182.0,-284.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":369,"width":87.0,"height":14.0,"uid":null,"order":141,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4230219192816351,"linePerpValue":-20.0,"cardinalityType":null,"html":"

docker update

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"gmMmie3VnJbh"}],"hidden":false,"layerId":"gmMmie3VnJbh"}],"layers":[{"guid":"gmMmie3VnJbh","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":142}],"shapeStyles":{"com.gliffy.shape.uml.uml_v2.state_machine":{"fill":"#e2e2e2","stroke":"#000000","strokeWidth":2},"com.gliffy.shape.flowchart.flowchart_v1.default":{"fill":"#a4c2f4","stroke":"#333333","strokeWidth":2}},"lineStyles":{"global":{"endArrow":1,"orthoMode":2}},"textStyles":{"global":{"color":"#000000"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.flowchart.flowchart_v1.default"],"autosaveDisabled":false,"lastSerialized":1451304727693,"analyticsProduct":"Online"},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/docs/reference/api/images/event_state.png b/docs/reference/api/images/event_state.png deleted file mode 100644 index 28d09ba192d05bf5b55dbf4c85a879842a7f4c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78354 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 diff --git a/docs/reference/api/index.md b/docs/reference/api/index.md deleted file mode 100644 index b8008d4b65..0000000000 --- a/docs/reference/api/index.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "API Reference" -description: "Reference" -keywords: "Engine" -identifier: "engine_remoteapi" ---- - - - -# API Reference - -* [Docker Remote API](docker_remote_api.md) -* [Docker Remote API client libraries](remote_api_client_libraries.md) diff --git a/docs/reference/api/remote_api_client_libraries.md b/docs/reference/api/remote_api_client_libraries.md deleted file mode 100644 index a5dabc2609..0000000000 --- a/docs/reference/api/remote_api_client_libraries.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: "Remote API client libraries" -description: "Various client libraries available to use with the Docker remote API" -keywords: "API, Docker, index, registry, REST, documentation, clients, C#, Erlang, Go, Groovy, Java, JavaScript, Perl, PHP, Python, Ruby, Rust, Scala" ---- - - - -# Docker Remote API client libraries - -These libraries make it easier to build applications on top of the Docker -Remote API with various programming languages. They have not been tested by the -Docker maintainers for compatibility, so if you run into any issues, file them -with the library maintainers. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Language/FrameworkNameRepository
C#Docker.DotNethttps://github.com/ahmetalpbalkan/Docker.DotNet
C++lasote/docker_clienthttps://github.com/lasote/docker_client
Erlangerldockerhttps://github.com/proger/erldocker
Dartbwu_dockerhttps://github.com/bwu-dart/bwu_docker
GoDocker Go clienthttps://godoc.org/github.com/docker/docker/client
Gradlegradle-docker-pluginhttps://github.com/gesellix/gradle-docker-plugin
Groovydocker-clienthttps://github.com/gesellix/docker-client
Haskelldocker-hshttps://github.com/denibertovic/docker-hs
HTML (Web Components)docker-elementshttps://github.com/kapalhq/docker-elements
Javadocker-javahttps://github.com/docker-java/docker-java
Javadocker-clienthttps://github.com/spotify/docker-client
NodeJSdockerodehttps://github.com/apocas/dockerode
PerlEixo::Dockerhttps://github.com/alambike/eixo-docker
PHPDocker-PHPhttps://github.com/docker-php/docker-php
Pythondocker-pyhttps://github.com/docker/docker-py
Rubydocker-apihttps://github.com/swipely/docker-api
Rustdocker-rusthttps://github.com/abh1nav/docker-rust
Rustshiplifthttps://github.com/softprops/shiplift
Scalatugboathttps://github.com/softprops/tugboat
Scalareactive-dockerhttps://github.com/almoehi/reactive-docker