2015-10-09 16:49:41 +02:00
<!-- [metadata]>
+++
title = "Getting Started"
description = "Getting started with Docker Compose"
keywords = ["documentation, docs, docker, compose, orchestration, containers"]
[menu.main]
2016-01-24 21:03:44 +01:00
parent="workw_compose"
weight=-85
2015-10-09 16:49:41 +02:00
+++
<![end-metadata]-->
2015-10-23 22:51:03 +02:00
# Getting Started
2015-10-09 16:49:41 +02:00
2016-02-23 03:50:09 +01:00
On this page you build a simple Python web application running on Docker Compose. The
2015-10-23 22:51:03 +02:00
application uses the Flask framework and increments a value in Redis. While the
sample uses Python, the concepts demonstrated here should be understandable even
if you're not familiar with it.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
## Prerequisites
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
Make sure you have already
[installed both Docker Engine and Docker Compose ](install.md ). You
don't need to install Python, it is provided by a Docker image.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
## Step 1: Setup
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
1. Create a directory for the project:
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
$ mkdir composetest
$ cd composetest
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
2. With your favorite text editor create a file called `app.py` in your project
directory.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
from flask import Flask
from redis import Redis
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
@app .route('/')
def hello():
redis.incr('hits')
return 'Hello World! I have been seen %s times.' % redis.get('hits')
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
3. Create another file called `requirements.txt` in your project directory and
add the following:
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
flask
redis
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
These define the applications dependencies.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
## Step 2: Create a Docker image
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
In this step, you build a new Docker image. The image contains all the
dependencies the Python application requires, including Python itself.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
1. In your project directory create a file named `Dockerfile` and add the
following:
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
This tells Docker to:
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
* Build an image starting with the Python 2.7 image.
* Add the current directory `.` into the path `/code` in the image.
* Set the working directory to `/code` .
* Install the Python dependencies.
* Set the default command for the container to `python app.py`
2015-12-21 01:52:54 +01:00
For more information on how to write Dockerfiles, see the [Docker user guide ](https://docs.docker.com/engine/userguide/dockerimages/#building-an-image-from-a-dockerfile ) and the [Dockerfile reference ](http://docs.docker.com/reference/builder/ ).
2015-10-23 22:51:03 +02:00
2. Build the image.
$ docker build -t web .
This command builds an image named `web` from the contents of the current
directory. The command automatically locates the `Dockerfile` , `app.py` , and
`requirements.txt` files.
## Step 3: Define services
2015-10-09 16:49:41 +02:00
2015-10-21 22:28:47 +02:00
Define a set of services using `docker-compose.yml` :
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
1. Create a file called docker-compose.yml in your project directory and add
the following:
2016-02-16 22:38:31 +01:00
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
This Compose file defines two services, `web` and `redis` . The web service:
2015-10-09 16:49:41 +02:00
* Builds from the `Dockerfile` in the current directory.
* Forwards the exposed port 5000 on the container to port 5000 on the host machine.
2015-10-21 22:28:47 +02:00
* Mounts the project directory on the host to `/code` inside the container allowing you to modify the code without having to rebuild the image.
* Links the web service to the Redis service.
2015-10-09 16:49:41 +02:00
The `redis` service uses the latest public [Redis ](https://registry.hub.docker.com/_/redis/ ) image pulled from the Docker Hub registry.
2015-10-23 22:51:03 +02:00
## Step 4: Build and run your app with Compose
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
1. From your project directory, start up your application.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
$ docker-compose up
Pulling image redis...
Building web...
Starting composetest_redis_1...
Starting composetest_web_1...
redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
web_1 | * Running on http://0.0.0.0:5000/
web_1 | * Restarting with stat
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
Compose pulls a Redis image, builds an image for your code, and start the
services you defined.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
2. Enter `http://0.0.0.0:5000/` in a browser to see the application running.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
If you're using Docker on Linux natively, then the web app should now be
listening on port 5000 on your Docker daemon host. If http://0.0.0.0:5000
doesn't resolve, you can also try http://localhost:5000.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
If you're using Docker Machine on a Mac, use `docker-machine ip MACHINE_VM` to get
the IP address of your Docker host. Then, `open http://MACHINE_VM_IP:5000` in a
browser.
2015-10-09 16:49:41 +02:00
2015-10-23 22:51:03 +02:00
You should see a message in your browser saying:
`Hello World! I have been seen 1 times.`
3. Refresh the page.
The number should increment.
## Step 5: Experiment with some other commands
2015-10-09 16:49:41 +02:00
If you want to run your services in the background, you can pass the `-d` flag
(for "detached" mode) to `docker-compose up` and use `docker-compose ps` to
see what is currently running:
2015-10-23 22:51:03 +02:00
$ docker-compose up -d
Starting composetest_redis_1...
Starting composetest_web_1...
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
composetest_redis_1 /usr/local/bin/run Up
composetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp
2015-10-09 16:49:41 +02:00
The `docker-compose run` command allows you to run one-off commands for your
services. For example, to see what environment variables are available to the
`web` service:
2015-10-23 22:51:03 +02:00
$ docker-compose run web env
2015-10-09 16:49:41 +02:00
See `docker-compose --help` to see other available commands. You can also install [command completion ](completion.md ) for the bash and zsh shell, which will also show you available commands.
If you started Compose with `docker-compose up -d` , you'll probably want to stop
your services once you've finished with them:
2015-10-23 22:51:03 +02:00
$ docker-compose stop
2015-10-09 16:49:41 +02:00
At this point, you have seen the basics of how Compose works.
2015-10-23 22:51:03 +02:00
## Where to go next
2015-10-09 16:49:41 +02:00
- Next, try the quick start guide for [Django ](django.md ),
[Rails ](rails.md ), or [WordPress ](wordpress.md ).
2015-10-23 22:51:03 +02:00
- [Explore the full list of Compose commands ](./reference/index.md )
- [Compose configuration file reference ](compose-file.md )