2015-09-20 22:31:33 +00:00
---
layout: "docs"
page_title: "Drivers: Docker"
2015-09-25 02:35:52 +00:00
sidebar_current: "docs-drivers-docker"
2015-09-20 22:31:33 +00:00
description: |-
The Docker task driver is used to run Docker based tasks.
---
# Docker Driver
2015-09-25 02:35:52 +00:00
Name: `docker`
2015-09-20 22:31:33 +00:00
2015-09-25 02:35:52 +00:00
The `docker` driver provides a first-class Docker workflow on Nomad. The Docker
2015-09-25 02:33:06 +00:00
driver handles downloading containers, mapping ports, and starting, watching,
2015-09-29 21:00:48 +00:00
and cleaning up after containers.
2015-09-20 22:31:33 +00:00
2015-09-25 02:33:06 +00:00
## Task Configuration
2015-11-19 00:30:37 +00:00
The `docker` driver is configured via a `config` block:
```
task "webservice" {
driver = "docker"
config = {
image = "redis"
}
}
```
The following options are available for use in the job specification.
2015-09-25 02:33:06 +00:00
* `image` - (Required) The Docker image to run. The image may include a tag or
custom URL. By default it will be fetched from Docker Hub.
2015-09-26 06:28:23 +00:00
* `command` - (Optional) The command to run when starting the container.
2015-10-16 00:28:25 +00:00
* `args` - (Optional) Arguments to the optional `command` . If no `command` is
present, `args` are ignored.
2015-11-19 00:30:37 +00:00
* `labels` - (Optional) A key/value map of labels to set to the containers on
start.
* `privileged` - (Optional) `true` or `false` (default). Privileged mode gives
the container access to devices on the host. Note that this also requires the
nomad agent and docker daemon to be configured to allow privileged
containers.
2015-11-18 01:20:28 +00:00
* `network_mode` - (Optional) The network mode to be used for the container. In
order to support userspace networking plugins in Docker 1.9 this accepts any
value. The default is `bridge` . Other networking modes may not work without
additional configuration on the host (which is outside the scope of Nomad).
Valid values pre-docker 1.9 are `default` , `bridge` , `host` , `none` , or
2015-11-19 00:30:37 +00:00
`container:name` . See below for more details.
2015-10-01 02:15:24 +00:00
2015-11-19 00:30:37 +00:00
* `hostname` - (Optional) The hostname to assign to the container. When
launching more than one of a task (using `count` ) with this option set, every
container the task starts will have the same hostname.* `dns_servers` - (Optional) A list of DNS servers for the container to use
2015-11-18 06:05:56 +00:00
(e.g. ["8.8.8.8", "8.8.4.4"]). *Docker API v1.10 and above only*
2015-11-05 18:47:41 +00:00
2015-11-18 06:05:56 +00:00
* `search_domains` - (Optional) A list of DNS search domains for the container
to use.
2015-11-17 06:44:44 +00:00
2015-11-19 00:30:37 +00:00
* `port_map` - (Optional) A key/value map of port labels (see below).
2015-11-18 00:02:42 +00:00
2015-11-19 00:30:37 +00:00
* `auth` - (Optional) Provide authentication for a private registry (see below).
### Authentication
2015-11-17 13:14:35 +00:00
2015-11-19 00:30:37 +00:00
If you want to pull from a private repo (for example on dockerhub or quay.io), you will need to specify credentials in your job via the `auth` option.
2015-11-18 07:32:57 +00:00
2015-11-18 09:37:42 +00:00
The `auth` object supports the following keys:
* `username` - (Optional) The account username.
2015-11-19 00:30:37 +00:00
2015-11-18 09:37:42 +00:00
* `password` - (Optional) The account password.
2015-11-19 00:30:37 +00:00
2015-11-18 09:37:42 +00:00
* `email` - (Optional) The account email.
2015-11-19 00:30:37 +00:00
2015-11-18 09:37:42 +00:00
* `server_address` - (Optional) The server domain/ip without the protocol.
2015-11-19 00:30:37 +00:00
Docker Hub is used by default.
Example:
2015-11-05 18:47:41 +00:00
2015-11-19 00:30:37 +00:00
```
task "secretservice" {
driver = "docker"
config {
image = "secret/service"
auth {
username = "dockerhub_user"
username = "dockerhub_password"
}
}
}
```
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
**Please note that these credentials are stored in Nomad in plain text.** Secrets management will be added in a later release.
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
## Networking
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
Docker supports a variety of networking configurations, including using host interfaces, SDNs, etc. Nomad uses `bridged` networking by default, like Docker.
2015-09-25 23:49:26 +00:00
2015-11-19 00:30:37 +00:00
You can specify other networking options, including custom networking plugins
in Docker 1.9. **You may need to perform additional configuration on the host
in order to make these work.** This additional configuration is outside the
scope of Nomad.
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
### Allocating Ports
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
You can allocate ports to your task using the port syntax described on the [networking page ](/docs/jobspec/networking.html ). Here is a recap:
2015-09-25 02:33:06 +00:00
```
2015-11-19 00:30:37 +00:00
task "webservice" {
driver = "docker"
port "http" {}
port "https" {}
}
2015-09-25 02:33:06 +00:00
```
2015-11-19 00:30:37 +00:00
### Forwarding and Exposing Ports
A Docker container typically specifies which port a service will listen on by specifying the `EXPOSE` directive in the `Dockerfile` .
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
Because dynamic ports will not match the ports exposed in your Dockerfile, Nomad will automatically expose all of the ports it allocates to your container.
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
These ports will be identified via environment variables. For example:
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
```
port "http" {}
```
If Nomad allocates port `23332` to your task for `http` , `23332` will be automatically exposed and forwarded to your container, and the driver will set an environment variable `NOMAD_PORT_http` with the value `23332` that you can read inside your container.
This provides an easy way to use the `host` networking option for better performance.
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
### Using the Port Map
If you prefer to use the traditional port-mapping method, you can specify the `port_map` option in your job specification. It looks like this:
2015-09-25 02:33:06 +00:00
```
2015-11-19 00:30:37 +00:00
task "redis" {
driver = "docker"
port "redis" {}
config {
image = "redis"
port_map {
redis = "6379"
}
}
}
2015-09-25 02:33:06 +00:00
```
2015-11-19 00:30:37 +00:00
If Nomad allocates port `23332` to your task, the Docker driver will automatically setup the port mapping from `23332` on the host to `6379` in your container, so it will just work!
Note that by default this only works with `bridged` networking mode. It may also work with custom networking plugins which implement the same API for expose and port forwarding.
### Other Networking Modes
Some networking modes like `container` or `none` will require coordination outside of Nomad. First-class support for these options may be improved later through Nomad plugins or dynamic job configuration.
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
## Host Requirements
2015-09-25 02:33:06 +00:00
2015-11-18 01:20:28 +00:00
Nomad requires Docker to be installed and running on the host alongside the
2015-11-19 00:30:37 +00:00
Nomad agent. Nomad was developed against Docker `1.8.2` and `1.9` .
2015-09-25 18:29:38 +00:00
2015-11-18 01:20:28 +00:00
By default Nomad communicates with the Docker daemon using the daemon's unix
socket. Nomad will need to be able to read/write to this socket. If you do not
run Nomad as root, make sure you add the Nomad user to the Docker group so
2015-09-25 02:33:06 +00:00
Nomad can communicate with the Docker daemon.
2015-11-18 01:20:28 +00:00
For example, on ubuntu you can use the `usermod` command to add the `vagrant`
user to the `docker` group so you can run Nomad without root:
2015-09-25 18:29:38 +00:00
sudo usermod -G docker -a vagrant
2015-11-18 01:20:28 +00:00
For the best performance and security features you should use recent versions
of the Linux Kernel and Docker daemon.
2015-09-25 02:33:06 +00:00
2015-11-19 00:30:37 +00:00
## Agent Configuration
2015-09-25 06:40:30 +00:00
2015-11-19 00:30:37 +00:00
The `docker` driver has the following host-level configuration options:
2015-09-25 06:40:30 +00:00
* `docker.endpoint` - Defaults to `unix:///var/run/docker.sock` . You will need
2015-11-18 01:20:28 +00:00
to customize this if you use a non-standard socket (http or another
location).
2015-09-25 06:40:30 +00:00
2015-10-08 07:08:54 +00:00
* `docker.cleanup.container` Defaults to `true` . Changing this to `false` will
prevent Nomad from removing containers from stopped tasks.
* `docker.cleanup.image` Defaults to `true` . Changing this to `false` will
prevent Nomad from removing images from stopped tasks.
2015-11-06 00:40:20 +00:00
* `docker.privileged.enabled` Defaults to `false` . Changing this to `true` will
2015-11-19 00:30:37 +00:00
allow containers to use `privileged` mode, which gives the containers full
access to the host's devices. Note that you must set a similar setting on the Docker daemon for this to work.
2015-11-06 00:40:20 +00:00
2015-10-08 07:08:54 +00:00
Note: When testing or using the `-dev` flag you can use `DOCKER_HOST` ,
`DOCKER_TLS_VERIFY` , and `DOCKER_CERT_PATH` to customize Nomad's behavior. In
production Nomad will always read `docker.endpoint` .
2015-11-19 00:30:37 +00:00
## Agent Attributes
2015-09-25 02:33:06 +00:00
2015-09-25 06:40:30 +00:00
The `docker` driver will set the following client attributes:
2015-09-25 02:33:06 +00:00
2015-11-18 01:20:28 +00:00
* `driver.docker` - This will be set to "1", indicating the driver is
available.
* `driver.docker.version` - This will be set to version of the docker server
2015-09-25 02:33:06 +00:00
## Resource Isolation
### CPU
2015-11-18 01:20:28 +00:00
Nomad limits containers' CPU based on CPU shares. CPU shares allow containers
to burst past their CPU limits. CPU limits will only be imposed when there is
2015-09-25 02:33:06 +00:00
contention for resources. When the host is under load your process may be
2015-10-17 20:55:55 +00:00
throttled to stabilize QOS depending on how many shares it has. You can see how
2015-11-18 01:20:28 +00:00
many CPU shares are available to your process by reading `NOMAD_CPU_LIMIT` .
1000 shares are approximately equal to 1Ghz.
2015-09-25 02:33:06 +00:00
Please keep the implications of CPU shares in mind when you load test workloads
on Nomad.
### Memory
Nomad limits containers' memory usage based on total virtual memory. This means
that containers scheduled by Nomad cannot use swap. This is to ensure that a
2015-11-18 01:20:28 +00:00
swappy process does not degrade performance for other workloads on the same
host.
2015-09-25 02:33:06 +00:00
Since memory is not an elastic resource, you will need to make sure your
container does not exceed the amount of memory allocated to it, or it will be
terminated or crash when it tries to malloc. A process can inspect its memory
limit by reading `NOMAD_MEMORY_LIMIT` , but will need to track its own memory
usage. Memory limit is expressed in megabytes so 1024 = 1Gb.
### IO
Nomad's Docker integration does not currently provide QOS around network or
filesystem IO. These will be added in a later release.
### Security
Docker provides resource isolation by way of
[cgroups and namespaces ](https://docs.docker.com/introduction/understanding-docker/#the-underlying-technology ).
2015-11-18 01:20:28 +00:00
Containers essentially have a virtual file system all to themselves. If you
need a higher degree of isolation between processes for security or other
reasons, it is recommended to use full virtualization like
[QEMU ](/docs/drivers/qemu.html ).