experimental/docker-stacks-and-bundles.md
6defef56
 # Docker Stacks and Distributed Application Bundles
ae816baa
 
 ## Overview
 
a92f6551
 Docker Stacks and Distributed Application Bundles are experimental features
 introduced in Docker 1.12 and Docker Compose 1.8, alongside the concept of
 swarm mode, and Nodes and Services in the Engine API.
ae816baa
 
a92f6551
 A Dockerfile can be built into an image, and containers can be created from
 that image. Similarly, a docker-compose.yml can be built into a **distributed
 application bundle**, and **stacks** can be created from that bundle. In that
 sense, the bundle is a multi-services distributable image format.
ae816baa
 
a92f6551
 As of Docker 1.12 and Compose 1.8, the features are experimental. Neither
 Docker Engine nor the Docker Registry support distribution of bundles.
ae816baa
 
 ## Producing a bundle
 
 The easiest way to produce a bundle is to generate it using `docker-compose`
 from an existing `docker-compose.yml`. Of course, that's just *one* possible way
 to proceed, in the same way that `docker build` isn't the only way to produce a
 Docker image.
 
 From `docker-compose`:
 
a92f6551
 ```bash
 $ docker-compose bundle
 WARNING: Unsupported key 'network_mode' in services.nsqd - ignoring
 WARNING: Unsupported key 'links' in services.nsqd - ignoring
 WARNING: Unsupported key 'volumes' in services.nsqd - ignoring
 [...]
8af760c9
 Wrote bundle to vossibility-stack.dab
a92f6551
 ```
ae816baa
 
 ## Creating a stack from a bundle
 
 A stack is created using the `docker deploy` command:
 
a92f6551
 ```bash
 # docker deploy --help
ae816baa
 
a92f6551
 Usage:  docker deploy [OPTIONS] STACK
ae816baa
 
3298bfcb
 Create and update a stack from a Distributed Application Bundle (DAB)
ae816baa
 
a92f6551
 Options:
8426f721
       --file   string        Path to a Distributed Application Bundle file (Default: STACK.dab)
       --help                 Print usage
       --with-registry-auth   Send registry authentication details to Swarm agents
a92f6551
 ```
ae816baa
 
 Let's deploy the stack created before:
 
a92f6551
 ```bash
 # docker deploy vossibility-stack
8af760c9
 Loading bundle from vossibility-stack.dab
a92f6551
 Creating service vossibility-stack_elasticsearch
 Creating service vossibility-stack_kibana
 Creating service vossibility-stack_logstash
 Creating service vossibility-stack_lookupd
 Creating service vossibility-stack_nsqd
 Creating service vossibility-stack_vossibility-collector
 ```
ae816baa
 
 We can verify that services were correctly created:
 
a92f6551
 ```bash
ea03f090
 $ docker service ls
 ID            NAME                                     MODE         REPLICAS    IMAGE
 29bv0vnlm903  vossibility-stack_lookupd                replicated   1/1         nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
 4awt47624qwh  vossibility-stack_nsqd                   replicated   1/1         nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
 4tjx9biia6fs  vossibility-stack_elasticsearch          replicated   1/1         elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa
 7563uuzr9eys  vossibility-stack_kibana                 replicated   1/1         kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03
 9gc5m4met4he  vossibility-stack_logstash               replicated   1/1         logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe
 axqh55ipl40h  vossibility-stack_vossibility-collector  replicated   1/1         icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba
a92f6551
 ```
ae816baa
 
 ## Managing stacks
 
88da491c
 Stacks are managed using the `docker stack` command:
ae816baa
 
a92f6551
 ```bash
 # docker stack --help
 
 Usage:  docker stack COMMAND
 
 Manage Docker stacks
 
 Options:
       --help   Print usage
 
 Commands:
   config      Print the stack configuration
   deploy      Create and update a stack
5ce08ddf
   ls          List stacks
a92f6551
   rm          Remove the stack
4b21b411
   services    List the services in the stack
a92f6551
   tasks       List the tasks in the stack
 
 Run 'docker stack COMMAND --help' for more information on a command.
 ```
cd2237c2
 
 ## Bundle file format
 
a92f6551
 Distributed application bundles are described in a JSON format. When bundles
 are persisted as files, the file extension is `.dab` (Docker 1.12RC2 tools use
 `.dsb` for the file extension—this will be updated in the next release client).
cd2237c2
 
a92f6551
 A bundle has two top-level fields: `version` and `services`. The version used
 by Docker 1.12 tools is `0.1`.
cd2237c2
 
a92f6551
 `services` in the bundle are the services that comprise the app. They
 correspond to the new `Service` object introduced in the 1.12 Docker Engine API.
cd2237c2
 
 A service has the following fields:
 
 <dl>
     <dt>
         Image (required) <code>string</code>
     </dt>
     <dd>
a92f6551
         The image that the service will run. Docker images should be referenced
         with full content hash to fully specify the deployment artifact for the
         service. Example:
         <code>postgres@sha256:f76245b04ddbcebab5bb6c28e76947f49222c99fec4aadb0bb
         1c24821a 9e83ef</code>
cd2237c2
     </dd>
     <dt>
         Command <code>[]string</code>
     </dt>
     <dd>
         Command to run in service containers.
     </dd>
     <dt>
         Args <code>[]string</code>
     </dt>
     <dd>
         Arguments passed to the service containers.
     </dd>
     <dt>
         Env <code>[]string</code>
     </dt>
     <dd>
         Environment variables.
     </dd>
     <dt>
         Labels <code>map[string]string</code>
     </dt>
     <dd>
         Labels used for setting meta data on services.
     </dd>
     <dt>
         Ports <code>[]Port</code>
     </dt>
     <dd>
a92f6551
         Service ports (composed of <code>Port</code> (<code>int</code>) and
         <code>Protocol</code> (<code>string</code>). A service description can
         only specify the container port to be exposed. These ports can be
         mapped on runtime hosts at the operator's discretion.
cd2237c2
     </dd>
 
     <dt>
         WorkingDir <code>string</code>
     </dt>
     <dd>
         Working directory inside the service containers.
     </dd>
 
     <dt>
         User <code>string</code>
     </dt>
     <dd>
a92f6551
         Username or UID (format: <code>&lt;name|uid&gt;[:&lt;group|gid&gt;]</code>).
cd2237c2
     </dd>
 
     <dt>
         Networks <code>[]string</code>
     </dt>
     <dd>
a92f6551
         Networks that the service containers should be connected to. An entity
         deploying a bundle should create networks as needed.
cd2237c2
     </dd>
 </dl>
 
e68a4b18
 The following is an example of bundlefile with two services:
 
 ```json
 {
 	"Version": "0.1",
 	"Services": {
 		"redis": {
 			"Image": "redis@sha256:4b24131101fa0117bcaa18ac37055fffd9176aa1a240392bb8ea85e0be50f2ce",
 			"Networks": ["default"]
 		},
 		"web": {
 			"Image": "dockercloud/hello-world@sha256:fe79a2cfbd17eefc344fb8419420808df95a1e22d93b7f621a7399fd1e9dca1d",
 			"Networks": ["default"],
 			"User": "web"
 		}
 	}
 }
 ```