multi container apps swarm + consul + compose

30
Swarm + Consul + Compose Multi-Container Apps Eueung Mulyana http://eueung.github.io/docker-stuff/multicont CodeLabs | Attribution-ShareAlike CC BY-SA 1 / 30

Upload: eueung-mulyana

Post on 15-Apr-2017

270 views

Category:

Technology


1 download

TRANSCRIPT

Swarm + Consul + Compose

Multi-Container AppsEueung Mulyana

http://eueung.github.io/docker-stuff/multicontCodeLabs | Attribution-ShareAlike CC BY-SA

1 / 30

Outline

Infrastructure & Cluster Con�g - Short Recap

Another Swarm Arch

RPI Voting App

2 / 30

Infrastructure and Cluster Config

Short Recap

3 / 30

4 / 30

Physical Looknode1192.168.1.102

node2192.168.1.101

node3192.168.1.100

5 / 30

Cluster Discovery via aKV (Consul)

6 / 30

Swarm ManagerAccesses Remote

Daemons / Engines viaExposed Port

Infrastructure and Cluster Config

Another Swarm Arch

7 / 30

8 / 30

Using Legacy (nowOptional) Swarm Join

9 / 30

It's now acctually likethis

$ source ~/.dvm/dvm.sh $ dvm use 1.10.2Now using Docker 1.10.2

$ ./start-consul.sh node1.local192.168.1.1028b54ab3104b18f75814e5c03f89f3778acaad263f731695163cf52c95b1a4f4f

# ./start-consul.sh# ---#!/bin/bash

function getip() { (traceroute $1 2>&1 | head -n 1 | cut -d\( -f 2 | cut

IP_ADDRESS=$(getip $1)echo $IP_ADDRESS

docker -H $IP_ADDRESS:2375 run \ -d --net=host --name=consul \ -v /data -p 8500:8500 \ hypriot/rpi-consul:0.6.4 agent -server -data-dir /data -bootstrap-expect -ui-dir=/ui \ -advertise=$IP_ADDRESS -bind=$IP_ADDRESS -client=$IP_ADDRESS

10 / 30

Start Consul@ node1

Consul UI 

11 / 30

$ ./start-swarm.sh Running Swarm Agent at 192.168.1.100b879a04323c817432e95a970bbf71a6e03fd6ae895fa643a7fe75fd12c78d06dRunning Swarm Agent at 192.168.1.101f47f6c6b258f8f03e1ad441049e2c4320b0a138e6d8eac52bdaa5f70ca80e72dRunning Swarm Agent at 192.168.1.10247346d30d35d8174b41995fa34efaa69cc6d2de6c2091e29750d7e264c6d4816de5ee57f8e20ef3ef15cd68f873620319202486510e88c1d22bfdbd8e4ec935a

# ./start-swarm.sh# ---#!/bin/bash

arr=("192.168.1.100" "192.168.1.101" "192.168.1.102")IP_CONSUL="192.168.1.102"IP_SWARMMASTER=$IP_CONSUL

for IP in "${arr[@]}"; do echo "Running Swarm Agent at $IP"

docker -H $IP:2375 run \ -d --name=swarm-agent \ hypriot/rpi-swarm:1.2.1 \ join -advertise $IP:2375 \ consul://$IP_CONSUL:8500done

docker -H $IP_SWARMMASTER:2375 run \ -d -p 10000:6000 --name=swarm-master \ hypriot/rpi-swarm:1.2.1 manage -H 0.0.0.0:6000 \ consul://$IP_CONSUL:8500

12 / 30

Start Swarmagent @ all nodes

manager @ node1

Consul UI 

13 / 30

Consul UI 

14 / 30

$ export DOCKER_HOST=tcp://192.168.1.102:10000$ docker info...$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESde5ee57f8e20 hypriot/rpi-swarm:1.2.1 "/swarm manage -H 0.0" 3 minutes ago Up 47346d30d35d hypriot/rpi-swarm:1.2.1 "/swarm join -adverti" 3 minutes ago Up f47f6c6b258f hypriot/rpi-swarm:1.2.1 "/swarm join -adverti" 3 minutes ago Up b879a04323c8 hypriot/rpi-swarm:1.2.1 "/swarm join -adverti" 3 minutes ago Up 8b54ab3104b1 hypriot/rpi-consul:0.6.4 "/consul agent -serve" 5 minutes ago Up

15 / 30

Check

5 Containers, 2 Networks 

17 / 30

#./tag-images.sh#!/bin/bash

docker tag thecaptainsshack/rpi-worker thecaptainsshack/rpi-worker:v1docker tag thecaptainsshack/rpi-voting-app thecaptainsshack/rpi-voting-app:v1 docker tag thecaptainsshack/rpi-result-app thecaptainsshack/rpi-result-app:v1 docker tag thecaptainsshack/postgres-arm thecaptainsshack/postgres-arm:v1

./save-images.sh#!/bin/bash

docker save -o rpi-worker.tar thecaptainsshack/rpi-workerdocker save -o rpi-voting-app.tar thecaptainsshack/rpi-voting-appdocker save -o rpi-result-app.tar thecaptainsshack/rpi-result-appdocker save -o postgres-arm.tar thecaptainsshack/postgres-arm

# ./load-images.sh#!/bin/bash

docker load -i rpi-worker.tardocker load -i rpi-voting-app.tar docker load -i rpi-result-app.tar docker load -i postgres-arm.tar

sftp> mkdir votingsftp> put -r voting$ rm -f voting/* && rmdir voting

18 / 30

OptionalPreparation

tag, save, load

db: image: thecaptainsshack/postgres-arm:v1 volumes: - db-data:/var/lib/postgresql/data networks: - back-tier

result-app: image: thecaptainsshack/rpi-result-app:v1 ports: - "5001:80" links: - db networks: - front-tier - back-tier

volumes: db-data: {}

networks: front-tier: driver: overlay back-tier: driver: overlay

19 / 30

docker-compose.yml

version: '2'

services: voting-app: image: thecaptainsshack/rpi-voting-app:v1 ports: - "5000:80" links: - redis networks: - front-tier - back-tier

redis: image: hypriot/rpi-redis:3.0.4 expose: ["6379"] networks: - back-tier

worker: image: thecaptainsshack/rpi-worker:v1 depends_on: - db - redis networks: - back-tier

$ docker-compose up -dCreating network "voteapps_front-tier" with driver "overlay"Creating network "voteapps_back-tier" with driver "overlay"Creating volume "voteapps_db-data" with default driverCreating voteapps_redis_1Creating voteapps_db_1Creating voteapps_voting-app_1Creating voteapps_worker_1Creating voteapps_result-app_1

$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES13390ae07634 thecaptainsshack/rpi-result-app:v1 "node server.js" 14 seconds ago Up fb7788e21dcf thecaptainsshack/rpi-worker:v1 "java -jar /worker-ja" 14 seconds ago Up 02da4fd6d395 thecaptainsshack/postgres-arm:v1 "/docker-entrypoint.s" 19 seconds ago Up 9271161cffd0 hypriot/rpi-swarm:1.2.1 "/swarm manage -H 0.0" 2 minutes ago Up 5094d356a141 hypriot/rpi-swarm:1.2.1 "/swarm join -adverti" 2 minutes ago Up 43c6c9914167 hypriot/rpi-swarm:1.2.1 "/swarm join -adverti" 2 minutes ago Up 38dc46794c30 hypriot/rpi-consul:0.6.4 "/consul agent -serve" 2 minutes ago Up 4952e24ce452 thecaptainsshack/rpi-voting-app:v1 "python app.py" 10 hours ago Up ac998b65792c hypriot/rpi-redis:3.0.4 "/entrypoint.sh redis" 10 hours ago Up 94e83aa038b1 hypriot/rpi-swarm:1.2.1 "/swarm join -adverti" 10 hours ago Up

# restart if necessary$ docker-compose stop && docker-compose rm -f

20 / 30

Ready forShow

$ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------voteapps_db_1 /docker-entrypoint.sh postgres Up 5432/tcp voteapps_redis_1 /entrypoint.sh redis-server Up 6379/tcp voteapps_result-app_1 node server.js Up 192.168.1.100:5001->voteapps_voting-app_1 python app.py Up 192.168.1.101:5000->voteapps_worker_1 java -jar /worker-jar-with ... Up

root@node3 in ~$ docker network lsNETWORK ID NAME DRIVER8add79af5bf7 voteapps_front-tier overlay c9c8503da2d8 voteapps_back-tier overlay f0dce7240349 docker_gwbridge bridge 8cbe7e085fad none null ec272b59cfd7 host host 4592696ebf19 bridge bridge

21 / 30

Ready forShow

voting-app 

22 / 30

$ docker logs -f 2de6Connected to redisWatching vote queueProcessing vote for 'a' by '84a51f315b69e04a'

23 / 30

redis log

result-app 

24 / 30

voting-app 

25 / 30

$ docker logs -f 2de6Connected to redisWatching vote queueProcessing vote for 'a' by '84a51f315b69e04a'Processing vote for 'a' by '84a51f315b69e04a'Processing vote for 'b' by '8f3ee350c2aec3f5'

26 / 30

redis log

result-app 

27 / 30

Refs

28 / 30

Refs1. jmMeessen/rpi-voting-app: A dockerized voting application demo, adapted for

Raspberry PI2. @dduportal - Swarm on Raspberry Pis3. docker/example-voting-app: Example Docker Compose app

29 / 30

ENDEueung Mulyana

http://eueung.github.io/docker-stuff/multicontCodeLabs | Attribution-ShareAlike CC BY-SA

30 / 30