### Check the file from the project The app used in this guide is based on the hit counter app in the Get started with Docker Compose guide. It consists of a Python app which maintains a counter in a Redis instance and increments the counter whenever you visit it. ### Check the file from the project Check a file called app.py in the project directory and paste this in: ```shell from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! I have been seen {} times.\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", port=8000, debug=True) ``` Create a file called requirements.txt and paste these two lines in: ```shell flask redis ``` Create a file called Dockerfile and paste this in: ```shell FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"] ``` Create a file called docker-compose.yml and paste this in: ```shell version: '3' services: web: image: 127.0.0.1:5000/stackdemo build: . ports: - "8000:8000" redis: image: redis:alpine ``` The image for the web app is built using the Dockerfile defined above. It’s also tagged with 127.0.0.1:5000 - the address of the registry created earlier. This is important when distributing the app to the swarm. ### Test the app with Compose Start the app with docker-compose up. This builds the web app image, pull the Redis image if you don’t already have it, and create two containers. You see a warning about the Engine being in swarm mode. This is because Compose doesn’t take advantage of swarm mode, and deploys everything to a single node. You can safely ignore this. ```shell vagrant@docker$ docker-compose up -d ``` WARNING: The Docker Engine you're using is running in swarm mode. Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers are scheduled on the current node. To deploy your application across the swarm, use `docker stack deploy`. Creating network "stackdemo_default" with the default driver ```shell Building web ...(build output)... Creating stackdemo_redis_1 Creating stackdemo_web_1 ``` Check that the app is running with docker-compose ps: ```shell vagrant@docker$ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------- stackdemo_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp stackdemo_web_1 python app.py Up 0.0.0.0:8000->8000/tcp ``` You can test the app with curl: ```shell vagrant@docker$ curl http://localhost:8000 Hello World! I have been seen 1 times. vagrant@docker$ curl http://localhost:8000 Hello World! I have been seen 2 times. vagrant@docker$ curl http://localhost:8000 Hello World! I have been seen 3 times. ``` Bring the app down: ```shell $ docker-compose down --volumes Stopping stackdemo_web_1 ... done Stopping stackdemo_redis_1 ... done Removing stackdemo_web_1 ... done Removing stackdemo_redis_1 ... done Removing network stackdemo_default Push the generated image to the registry ``` ### Optional To distribute the web app’s image across the swarm, it needs to be pushed to the registry you set up earlier. With Compose, this is very simple: ```shell $ docker-compose push Pushing web (127.0.0.1:5000/stackdemo:latest)... The push refers to a repository [127.0.0.1:5000/stackdemo] 5b5a49501a76: Pushed be44185ce609: Pushed bd7330a79bcf: Pushed c9fc143a069a: Pushed 011b303988d2: Pushed latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372 The stack is now ready to be deployed. ```