Swarm + Consul + Compose Multi-Container Apps Eueung Mulyana http://eueung.github.io/docker-stuff/multicont CodeLabs | Attribution-ShareAlike CC BY-SA 1 / 30
Swarm + Consul + Compose
Multi-Container AppsEueung Mulyana
http://eueung.github.io/docker-stuff/multicontCodeLabs | Attribution-ShareAlike CC BY-SA
1 / 30
$ 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
$ ./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
$ 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
RPI Voting AppCredit: @jmMeessen , @dduportal
16 / 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
$ docker logs -f 2de6Connected to redisWatching vote queueProcessing vote for 'a' by '84a51f315b69e04a'
23 / 30
redis log
$ 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
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