Docker Compose with Flask Apps

Docker Compose simplifies multi-container Docker environments on a single host. Let’s put together a basic web app with Docker Compose and Flask using Redis (we end up with a Python/Flask container and a Redis container all on one host). We do not need custom networking or to design our own networks to run on; Compose does everything for us!

Set Up Your Host

Install Docker Engine and Docker Compose (unless you have them already); review Introduction to Docker Compose if you need help.You’ll need a directory for your project on your host machine:

$ mkdir compose_flask
$ cd compose_flask

Add the following to requirements.txt in your directory:

flask
redis

Copy and paste the following code into a new file called app.py in your project directory:

# compose_flask/app.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return 'This Compose/Flask demo has been viewed %s time(s).' % redis.get('hits')


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

Your Docker Image

Create your Dockerfile in the compose_flask directory and add the following:

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py

Build it: docker build -t compose-flask .

Define Your Services

Add the following code to a new file, docker-compose.yml, in your project directory:

version: '2'
services:
    web:
        build: .
        ports:
            - "5000:5000"
        volumes:
            - .:/code
        depends_on:
            - redis
    redis:
        image: redis

How to Read the Docker Compose File

We define two services, web and redis.

Note this composition documents your application’s requirements!

Build and Run with Docker Compose

Start the application from your directory:

$ docker-compose up

If you have localhost access to your host (i.e., you do not use a remote solution to deploy Docker), point your browser to http://0.0.0.0:5000, http://127.0.0.1:5000, or http://localhost:5000.

On a Mac, you need to use docker-machine ip MACHINE_VM to get your Docker host’s IP address (then use that address like http://MACHINE_IP:5000 to access your web page). If you do use a remote host, simply use that IP address and append :5000 to the end.

You should see:

This Compose/Flask demo has been viewed 1 time(s).

When you refresh, you should see:

This Compose/Flask demo has been viewed 2 time(s).

Each time you refresh, the number should increment.

Stop the application with CTRL+C (read below under “Common Issues” for more information) and refresh the page. You should receive something to the effect of This site can't be reached.

Restart the application with docker-compose up -d.

Redis resets the count and you should see:

This Compose/Flask demo has been viewed 1 time(s).

Use docker-compose ps and you should get similar results:

Name                      Command               State           Ports
--------------------------------------------------------------------------------------
composeflask_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
composeflask_web_1     /bin/sh -c python app.py         Up      0.0.0.0:5000->5000/tcp
Run docker-compose stop to stop the containers:$ docker-compose stop
Stopping composeflask_web_1 ... done
Stopping composeflask_redis_1 ... done

Common Issues

Starting and Stopping

If you run docker-compose up -d, you need to run docker-compose stop to stop the services when you finish. If you did not, you can stop the service with CTRL+C (hit once to gracefully stop and twice to force kill the containers). If you do not run in the background, you can view the calls made to your container.