Files
startusingdocker/swarm/README.md
Guillem Hernandez Sola cc5c9fd797 All files
2018-10-25 16:57:44 +02:00

3.7 KiB
Executable File
Raw Blame History

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.