Files
startusingdocker/swarm
Guillem Hernandez Sola cc5c9fd797 All files
2018-10-25 16:57:44 +02:00
..
2018-10-25 16:57:44 +02:00
2018-06-13 14:46:19 +02:00
2018-10-25 16:57:44 +02:00
2018-10-25 16:57:44 +02:00
2018-10-25 16:57:44 +02:00
2018-10-25 16:57:44 +02:00
2018-06-13 14:46:19 +02:00

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:

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:

flask
redis

Create a file called Dockerfile and paste this in:

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:

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. Its 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 dont already have it, and create two containers.

You see a warning about the Engine being in swarm mode. This is because Compose doesnt take advantage of swarm mode, and deploys everything to a single node. You can safely ignore this.

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

Building web
...(build output)...
Creating stackdemo_redis_1
Creating stackdemo_web_1

Check that the app is running with docker-compose ps:

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:

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:

$ 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 apps image across the swarm, it needs to be pushed to the registry you set up earlier. With Compose, this is very simple:

$ 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.