github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/docs/reference/commandline/service_create.md (about)

     1  <!--[metadata]>
     2  +++
     3  title = "service create"
     4  description = "The service create command description and usage"
     5  keywords = ["service, create"]
     6  [menu.main]
     7  parent = "smn_cli"
     8  +++
     9  <![end-metadata]-->
    10  
    11  # service create
    12  
    13  ```Markdown
    14  Usage:  docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
    15  
    16  Create a new service
    17  
    18  Options:
    19        --constraint value               Placement constraints (default [])
    20        --container-label value          Service container labels (default [])
    21        --endpoint-mode string           Endpoint mode (vip or dnsrr)
    22    -e, --env value                      Set environment variables (default [])
    23        --group-add value                Add additional user groups to the container (default [])
    24        --help                           Print usage
    25    -l, --label value                    Service labels (default [])
    26        --limit-cpu value                Limit CPUs (default 0.000)
    27        --limit-memory value             Limit Memory (default 0 B)
    28        --log-driver string              Logging driver for service
    29        --log-opt value                  Logging driver options (default [])
    30        --mode string                    Service mode (replicated or global) (default "replicated")
    31        --mount value                    Attach a mount to the service
    32        --name string                    Service name
    33        --network value                  Network attachments (default [])
    34    -p, --publish value                  Publish a port as a node port (default [])
    35        --replicas value                 Number of tasks (default none)
    36        --reserve-cpu value              Reserve CPUs (default 0.000)
    37        --reserve-memory value           Reserve Memory (default 0 B)
    38        --restart-condition string       Restart when condition is met (none, on-failure, or any)
    39        --restart-delay value            Delay between restart attempts (default none)
    40        --restart-max-attempts value     Maximum number of restarts before giving up (default none)
    41        --restart-window value           Window used to evaluate the restart policy (default none)
    42        --stop-grace-period value        Time to wait before force killing a container (default none)
    43        --update-delay duration          Delay between updates
    44        --update-failure-action string   Action on update failure (pause|continue) (default "pause")
    45        --update-parallelism uint        Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
    46    -u, --user string                    Username or UID (format: <name|uid>[:<group|gid>])
    47        --with-registry-auth             Send registry authentication details to Swarm agents
    48    -w, --workdir string                 Working directory inside the container
    49  ```
    50  
    51  Creates a service as described by the specified parameters. You must run this
    52  command on a manager node.
    53  
    54  ## Examples
    55  
    56  ### Create a service
    57  
    58  ```bash
    59  $ docker service create --name redis redis:3.0.6
    60  dmu1ept4cxcfe8k8lhtux3ro3
    61  
    62  $ docker service ls
    63  ID            NAME   REPLICAS  IMAGE        COMMAND
    64  dmu1ept4cxcf  redis  1/1       redis:3.0.6
    65  ```
    66  
    67  ### Create a service with 5 replica tasks (--replicas)
    68  
    69  Use the `--replicas` flag to set the number of replica tasks for a replicated
    70  service. The following command creates a `redis` service with `5` replica tasks:
    71  
    72  ```bash
    73  $ docker service create --name redis --replicas=5 redis:3.0.6
    74  4cdgfyky7ozwh3htjfw0d12qv
    75  ```
    76  
    77  The above command sets the *desired* number of tasks for the service. Even
    78  though the command returns immediately, actual scaling of the service may take
    79  some time. The `REPLICAS` column shows both the *actual* and *desired* number
    80  of replica tasks for the service.
    81  
    82  In the following example the desired state is  `5` replicas, but the current
    83  number of `RUNNING` tasks is `3`:
    84  
    85  ```bash
    86  $ docker service ls
    87  ID            NAME    REPLICAS  IMAGE        COMMAND
    88  4cdgfyky7ozw  redis   3/5       redis:3.0.7
    89  ```
    90  
    91  Once all the tasks are created and `RUNNING`, the actual number of tasks is
    92  equal to the desired number:
    93  
    94  ```bash
    95  $ docker service ls
    96  ID            NAME    REPLICAS  IMAGE        COMMAND
    97  4cdgfyky7ozw  redis   5/5       redis:3.0.7
    98  ```
    99  
   100  ### Create a service with a rolling update policy
   101  
   102  ```bash
   103  $ docker service create \
   104    --replicas 10 \
   105    --name redis \
   106    --update-delay 10s \
   107    --update-parallelism 2 \
   108    redis:3.0.6
   109  ```
   110  
   111  When you run a [service update](service_update.md), the scheduler updates a
   112  maximum of 2 tasks at a time, with `10s` between updates. For more information,
   113  refer to the [rolling updates
   114  tutorial](../../swarm/swarm-tutorial/rolling-update.md).
   115  
   116  ### Set environment variables (-e, --env)
   117  
   118  This sets environmental variables for all tasks in a service. For example:
   119  
   120  ```bash
   121  $ docker service create --name redis_2 --replicas 5 --env MYVAR=foo redis:3.0.6
   122  ```
   123  
   124  ### Set metadata on a service (-l, --label)
   125  
   126  A label is a `key=value` pair that applies metadata to a service. To label a
   127  service with two labels:
   128  
   129  ```bash
   130  $ docker service create \
   131    --name redis_2 \
   132    --label com.example.foo="bar"
   133    --label bar=baz \
   134    redis:3.0.6
   135  ```
   136  
   137  For more information about labels, refer to [apply custom
   138  metadata](../../userguide/labels-custom-metadata.md).
   139  
   140  ### Add bind-mounts or volumes
   141  
   142  Docker supports two different kinds of mounts, which allow containers to read to
   143  or write from files or directories on other containers or the host operating
   144  system. These types are _data volumes_ (often referred to simply as volumes) and
   145  _bind-mounts_.
   146  
   147  A **bind-mount** makes a file or directory on the host available to the
   148  container it is mounted within. A bind-mount may be either read-only or
   149  read-write. For example, a container might share its host's DNS information by
   150  means of a bind-mount of the host's `/etc/resolv.conf` or a container might
   151  write logs to its host's `/var/log/myContainerLogs` directory. If you use
   152  bind-mounts and your host and containers have different notions of permissions,
   153  access controls, or other such details, you will run into portability issues.
   154  
   155  A **named volume** is a mechanism for decoupling persistent data needed by your
   156  container from the image used to create the container and from the host machine.
   157  Named volumes are created and managed by Docker, and a named volume persists
   158  even when no container is currently using it. Data in named volumes can be
   159  shared between a container and the host machine, as well as between multiple
   160  containers. Docker uses a _volume driver_ to create, manage, and mount volumes.
   161  You can back up or restore volumes using Docker commands.
   162  
   163  Consider a situation where your image starts a lightweight web server. You could
   164  use that image as a base image, copy in your website's HTML files, and package
   165  that into another image. Each time your website changed, you'd need to update
   166  the new image and redeploy all of the containers serving your website. A better
   167  solution is to store the website in a named volume which is attached to each of
   168  your web server containers when they start. To update the website, you just
   169  update the named volume.
   170  
   171  For more information about named volumes, see
   172  [Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/).
   173  
   174  The following table describes options which apply to both bind-mounts and named
   175  volumes in a service:
   176  
   177  | Option                                   | Required                  | Description
   178  |:-----------------------------------------|:--------------------------|:-----------------------------------------------------------------------------------------
   179  | **type**                                 |                           | The type of mount, can be either `volume`, or `bind`. Defaults to `volume` if no type is specified.<ul><li>`volume`: mounts a [managed volume](volume_create.md) into the container.</li><li>`bind`: bind-mounts a directory or file from the host into the container.</li></ul>
   180  | **src** or **source**                    | for `type=bind`&nbsp;only | <ul><li>`type=volume`: `src` is an optional way to specify the name of the volume (for example, `src=my-volume`). If the named volume does not exist, it is automatically created. If no `src` is specified, the volume is assigned a random name which is guaranteed to be unique on the host, but may not be unique cluster-wide. A randomly-named volume has the same lifecycle as its container and is destroyed when the *container* is destroyed (which is upon `service update`, or when scaling or re-balancing the service).</li><li>`type=bind`: `src` is required, and specifies an absolute path to the file or directory to bind-mount (for example, `src=/path/on/host/`).  An error is produced if the file or directory does not exist.</li></ul>
   181  | **dst** or **destination** or **target** | yes                       | Mount path inside the container, for example `/some/path/in/container/`. If the path does not exist in the container's filesystem, the Engine creates a directory at the specified location before mounting the volume or bind-mount.
   182  | **readonly** or **ro**                   |                           | The Engine mounts binds and volumes `read-write` unless `readonly` option is given when mounting the bind or volume.<br /><br /><ul><li>`true` or `1` or no value: Mounts the bind or volume read-only.</li><li>`false` or `0`: Mounts the bind or volume read-write.</li></ul>
   183  
   184  #### Bind Propagation
   185  
   186  Bind propagation refers to whether or not mounts created within a given
   187  bind-mount or named volume can be propagated to replicas of that mount. Consider
   188  a mount point `/mnt`, which is also mounted on `/tmp`. The propation settings
   189  control whether a mount on `/tmp/a` would also be available on `/mnt/a`. Each
   190  propagation setting has a recursive counterpoint. In the case of recursion,
   191  consider that `/tmp/a` is also mounted as `/foo`. The propagation settings
   192  control whether `/mnt/a` and/or `/tmp/a` would exist.
   193  
   194  The `bind-propagation` option defaults to `rprivate` for both bind-mounts and
   195  volume mounts, and is only configurable for bind-mounts. In other words, named
   196  volumes do not support bind propagation.
   197  
   198  - **`shared`**: Sub-mounts of the original mount are exposed to replica mounts,
   199                  and sub-mounts of replica mounts are also propagated to the
   200                  original mount.
   201  - **`slave`**: similar to a shared mount, but only in one direction. If the
   202                 original mount exposes a sub-mount, the replica mount can see it.
   203                 However, if the replica mount exposes a sub-mount, the original
   204                 mount cannot see it.
   205  - **`private`**: The mount is private. Sub-mounts within it are not exposed to
   206                   replica mounts, and sub-mounts of replica mounts are not
   207                   exposed to the original mount.
   208  - **`rshared`**: The same as shared, but the propagation also extends to and from
   209                   mount points nested within any of the original or replica mount
   210                   points.
   211  - **`rslave`**: The same as `slave`, but the propagation also extends to and from
   212                   mount points nested within any of the original or replica mount
   213                   points.
   214  - **`rprivate`**: The default. The same as `private`, meaning that no mount points
   215                    anywhere within the original or replica mount points propagate
   216                    in either direction.
   217  
   218  For more information about bind propagation, see the
   219  [Linux kernel documentation for shared subtree](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt).
   220  
   221  #### Options for Named Volumes
   222  The following options can only be used for named volumes (`type=volume`);
   223  
   224  | Option                | Description
   225  |:----------------------|:--------------------------------------------------------------------------------------------------------------------
   226  | **volume-driver**     | Name of the volume-driver plugin to use for the volume. Defaults to ``"local"``, to use the local volume driver to create the volume if the volume does not exist.
   227  | **volume-label**      | One or more custom metadata ("labels") to apply to the volume upon creation. For example, `volume-label=mylabel=hello-world,my-other-label=hello-mars`. For more information about labels, refer to [apply custom metadata](../../userguide/labels-custom-metadata.md).
   228  | **volume-nocopy**     | By default, if you attach an empty volume to a container, and files or directories already existed at the mount-path in the container (`dst`), the Engine copies those files and directories into the volume, allowing the host to access them. Set `volume-nocopy` to disables copying files from the container's filesystem to the volume and mount the empty volume.<br /><br />A value is optional:<ul><li>`true` or `1`: Default if you do not provide a value. Disables copying.</li><li>`false` or `0`: Enables copying.</li></ul>
   229  | **volume-opt**        | Options specific to a given volume driver, which will be passed to the driver when creating the volume. Options are provided as a comma-separated list of key/value pairs, for example, `volume-opt=some-option=some-value,some-other-option=some-other-value`. For available options for a given driver, refer to that driver's documentation.
   230  
   231  #### Differences between "--mount" and "--volume"
   232  
   233  The `--mount` flag supports most options that are supported by the `-v`
   234  or `--volume` flag for `docker run`, with some important exceptions:
   235  
   236  - The `--mount` flag allows you to specify a volume driver and volume driver
   237      options *per volume*, without creating the volumes in advance. In contrast,
   238      `docker run` allows you to specify a single volume driver which is shared
   239      by all volumes, using the `--volume-driver` flag.
   240  
   241  - The `--mount` flag allows you to specify custom metadata ("labels") for a volume,
   242      before the volume is created.
   243  
   244  - When you use `--mount` with `type=bind`, the host-path must refer to an *existing*
   245      path on the host. The path will not be created for you and the service will fail
   246      with an error if the path does not exist.
   247  
   248  - The `--mount` flag does not allow you to relabel a volume with `Z` or `z` flags,
   249      which are used for `selinux` labeling.
   250  
   251  #### Create a service using a named volume
   252  
   253  The following example creates a service that uses a named volume:
   254  
   255  ```bash
   256  $ docker service create \
   257    --name my-service \
   258    --replicas 3 \
   259    --mount type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round" \
   260    nginx:alpine
   261  ```
   262  
   263  For each replica of the service, the engine requests a volume named "my-volume"
   264  from the default ("local") volume driver where the task is deployed. If the
   265  volume does not exist, the engine creates a new volume and applies the "color"
   266  and "shape" labels.
   267  
   268  When the task is started, the volume is mounted on `/path/in/container/` inside
   269  the container.
   270  
   271  Be aware that the default ("local") volume is a locally scoped volume driver.
   272  This means that depending on where a task is deployed, either that task gets a
   273  *new* volume named "my-volume", or shares the same "my-volume" with other tasks
   274  of the same service. Multiple containers writing to a single shared volume can
   275  cause data corruption if the software running inside the container is not
   276  designed to handle concurrent processes writing to the same location. Also take
   277  into account that containers can be re-scheduled by the Swarm orchestrator and
   278  be deployed on a different node.
   279  
   280  #### Create a service that uses an anonymous volume
   281  
   282  The following command creates a service with three replicas with an anonymous
   283  volume on `/path/in/container`:
   284  
   285  ```bash
   286  $ docker service create \
   287    --name my-service \
   288    --replicas 3 \
   289    --mount type=volume,destination=/path/in/container \
   290    nginx:alpine
   291  ```
   292  
   293  In this example, no name (`source`) is specified for the volume, so a new volume
   294  is created for each task. This guarantees that each task gets its own volume,
   295  and volumes are not shared between tasks. Anonymous volumes are removed after
   296  the task using them is complete.
   297  
   298  #### Create a service that uses a bind-mounted host directory
   299  
   300  The following example bind-mounts a host directory at `/path/in/container` in
   301  the containers backing the service:
   302  
   303  ```bash
   304  $ docker service create \
   305    --name my-service \
   306    --mount type=bind,source=/path/on/host,destination=/path/in/container \
   307    nginx:alpine
   308  ```
   309  
   310  ### Set service mode (--mode)
   311  
   312  The service mode determines whether this is a _replicated_ service or a _global_
   313  service. A replicated service runs as many tasks as specified, while a global
   314  service runs on each active node in the swarm.
   315  
   316  The following command creates a global service:
   317  
   318  ```bash
   319  $ docker service create \
   320   --name redis_2 \
   321   --mode global \
   322   redis:3.0.6
   323  ```
   324  
   325  ### Specify service constraints (--constraint)
   326  
   327  You can limit the set of nodes where a task can be scheduled by defining
   328  constraint expressions. Multiple constraints find nodes that satisfy every
   329  expression (AND match). Constraints can match node or Docker Engine labels as
   330  follows:
   331  
   332  | node attribute  | matches                   | example                                         |
   333  |:----------------|:--------------------------|:------------------------------------------------|
   334  | node.id         | node ID                   | `node.id == 2ivku8v2gvtg4`                      |
   335  | node.hostname   | node hostname             | `node.hostname != node-2`                       |
   336  | node.role       | node role: manager        | `node.role == manager`                          |
   337  | node.labels     | user defined node labels  | `node.labels.security == high`                  |
   338  | engine.labels   | Docker Engine's labels    | `engine.labels.operatingsystem == ubuntu 14.04` |
   339  
   340  `engine.labels` apply to Docker Engine labels like operating system,
   341  drivers, etc. Swarm administrators add `node.labels` for operational purposes by
   342  using the [`docker node update`](node_update.md) command.
   343  
   344  For example, the following limits tasks for the redis service to nodes where the
   345  node type label equals queue:
   346  
   347  ```bash
   348  $ docker service create \
   349    --name redis_2 \
   350    --constraint 'node.labels.type == queue' \
   351    redis:3.0.6
   352  ```
   353  
   354  ### Attach a service to an existing network (--network)
   355  
   356  You can use overlay networks to connect one or more services within the swarm.
   357  
   358  First, create an overlay network on a manager node the docker network create
   359  command:
   360  
   361  ```bash
   362  $ docker network create --driver overlay my-network
   363  
   364  etjpu59cykrptrgw0z0hk5snf
   365  ```
   366  
   367  After you create an overlay network in swarm mode, all manager nodes have
   368  access to the network.
   369  
   370  When you create a service and pass the --network flag to attach the service to
   371  the overlay network:
   372  
   373  ```bash
   374  $ docker service create \
   375    --replicas 3 \
   376    --network my-network \
   377    --name my-web \
   378    nginx
   379  
   380  716thylsndqma81j6kkkb5aus
   381  ```
   382  
   383  The swarm extends my-network to each node running the service.
   384  
   385  Containers on the same network can access each other using
   386  [service discovery](../../swarm/networking.md#use-swarm-mode-service-discovery).
   387  
   388  ### Publish service ports externally to the swarm (-p, --publish)
   389  
   390  You can publish service ports to make them available externally to the swarm
   391  using the `--publish` flag:
   392  
   393  ```bash
   394  $ docker service create --publish <TARGET-PORT>:<SERVICE-PORT> nginx
   395  ```
   396  
   397  For example:
   398  
   399  ```bash
   400  $ docker service create --name my_web --replicas 3 --publish 8080:80 nginx
   401  ```
   402  
   403  When you publish a service port, the swarm routing mesh makes the service
   404  accessible at the target port on every node regardless if there is a task for
   405  the service running on the node. For more information refer to
   406  [Use swarm mode routing mesh](../../swarm/ingress.md).
   407  
   408  ## Related information
   409  
   410  * [service inspect](service_inspect.md)
   411  * [service ls](service_ls.md)
   412  * [service rm](service_rm.md)
   413  * [service scale](service_scale.md)
   414  * [service ps](service_ps.md)
   415  * [service update](service_update.md)
   416  
   417  <style>table tr > td:first-child { white-space: nowrap;}</style>