2015-06-07 22:59:58 +02:00
<!-- [metadata]>
+++
title = "Using Compose in production"
description = "Guide to using Docker Compose in production"
keywords = ["documentation, docs, docker, compose, orchestration, containers, production"]
[menu.main]
parent="smn_workw_compose"
weight=1
+++
<![end-metadata]-->
2015-04-04 00:26:02 +02:00
## Using Compose in production
2015-04-07 01:47:07 +02:00
While **Compose is not yet considered production-ready** , if you'd like to experiment and learn more about using it in production deployments, this guide
can help.
The project is actively working towards becoming
2015-08-11 18:38:49 +02:00
production-ready; to learn more about the progress being made, check out the < a href = "https://github.com/docker/compose/blob/master/ROADMAP.md" > roadmap< / a > for details
2015-04-07 01:47:07 +02:00
on how it's coming along and what still needs to be done.
2015-04-04 00:26:02 +02:00
When deploying to production, you'll almost certainly want to make changes to
2015-04-07 01:47:07 +02:00
your app configuration that are more appropriate to a live environment. These
changes may include:
2015-04-04 00:26:02 +02:00
- Removing any volume bindings for application code, so that code stays inside
the container and can't be changed from outside
- Binding to different ports on the host
2015-04-07 01:47:07 +02:00
- Setting environment variables differently (e.g., to decrease the verbosity of
2015-04-04 00:26:02 +02:00
logging, or to enable email sending)
2015-04-07 01:47:07 +02:00
- Specifying a restart policy (e.g., `restart: always` ) to avoid downtime
- Adding extra services (e.g., a log aggregator)
2015-04-04 00:26:02 +02:00
For this reason, you'll probably want to define a separate Compose file, say
`production.yml` , which specifies production-appropriate configuration.
> **Note:** The [extends](extends.md) keyword is useful for maintaining multiple
> Compose files which re-use common services without having to manually copy and
> paste.
2015-04-07 01:47:07 +02:00
Once you've got an alternate configuration file, make Compose use it
2015-04-04 00:26:02 +02:00
by setting the `COMPOSE_FILE` environment variable:
2015-08-24 21:10:00 +02:00
$ export COMPOSE_FILE=production.yml
2015-04-04 00:26:02 +02:00
$ docker-compose up -d
> **Note:** You can also use the file for a one-off command without setting
2015-04-07 01:47:07 +02:00
> an environment variable. You do this by passing the `-f` flag, e.g.,
2015-04-04 00:26:02 +02:00
> `docker-compose -f production.yml up -d`.
### Deploying changes
When you make changes to your app code, you'll need to rebuild your image and
2015-04-07 01:47:07 +02:00
recreate your app's containers. To redeploy a service called
`web` , you would use:
2015-04-04 00:26:02 +02:00
$ docker-compose build web
$ docker-compose up --no-deps -d web
2015-04-07 01:47:07 +02:00
This will first rebuild the image for `web` and then stop, destroy, and recreate
2015-04-04 00:26:02 +02:00
*just* the `web` service. The `--no-deps` flag prevents Compose from also
recreating any services which `web` depends on.
2015-04-07 01:47:07 +02:00
### Running Compose on a single server
2015-04-04 00:26:02 +02:00
You can use Compose to deploy an app to a remote Docker host by setting the
2015-04-07 01:47:07 +02:00
`DOCKER_HOST` , `DOCKER_TLS_VERIFY` , and `DOCKER_CERT_PATH` environment variables
appropriately. For tasks like this,
[Docker Machine ](https://docs.docker.com/machine ) makes managing local and
remote Docker hosts very easy, and is recommended even if you're not deploying
remotely.
2015-04-04 00:26:02 +02:00
Once you've set up your environment variables, all the normal `docker-compose`
2015-04-07 01:47:07 +02:00
commands will work with no further configuration.
2015-04-04 00:26:02 +02:00
2015-04-07 01:47:07 +02:00
### Running Compose on a Swarm cluster
2015-04-04 00:26:02 +02:00
[Docker Swarm ](https://docs.docker.com/swarm ), a Docker-native clustering
system, exposes the same API as a single Docker host, which means you can use
Compose against a Swarm instance and run your apps across multiple hosts.
Compose/Swarm integration is still in the experimental stage, and Swarm is still
2015-08-11 18:38:49 +02:00
in beta, but if you'd like to explore and experiment, check out the < a
href="https://github.com/docker/compose/blob/master/SWARM.md">integration
guide< / a > .
2015-05-12 13:44:43 +02:00
## Compose documentation
- [Installing Compose ](install.md )
- [Get started with Django ](django.md )
- [Get started with Rails ](rails.md )
- [Get started with Wordpress ](wordpress.md )
2015-08-11 18:38:49 +02:00
- [Command line reference ](/reference )
2015-05-12 13:44:43 +02:00
- [Yaml file reference ](yml.md )
- [Compose environment variables ](env.md )
- [Compose command line completion ](completion.md )