From 6b117a36c72671c777aeec81d7176c3be795a52a Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Fri, 27 Jan 2017 19:42:00 +0100 Subject: [PATCH 01/13] add armhf (Raspberry Pi) images, compose, and stack examples --- docker-compose.arm.yml | 47 +++++++++++++++++ docker-stack.arm.yml | 92 +++++++++++++++++++++++++++++++++ postgres/Dockerfile.arm | 16 ++++++ result/Dockerfile.arm | 16 ++++++ vote/Dockerfile.arm | 18 +++++++ worker/.gitignore | 1 + worker/Dockerfile.j.arm | 4 ++ worker/Dockerfile.j.builder.arm | 11 ++++ 8 files changed, 205 insertions(+) create mode 100644 docker-compose.arm.yml create mode 100644 docker-stack.arm.yml create mode 100644 postgres/Dockerfile.arm create mode 100644 result/Dockerfile.arm create mode 100644 vote/Dockerfile.arm create mode 100644 worker/.gitignore create mode 100644 worker/Dockerfile.j.arm create mode 100644 worker/Dockerfile.j.builder.arm diff --git a/docker-compose.arm.yml b/docker-compose.arm.yml new file mode 100644 index 0000000000..ed51b064ec --- /dev/null +++ b/docker-compose.arm.yml @@ -0,0 +1,47 @@ +version: "2" + +services: + vote: + image: vote + ports: + - "5000:80" + networks: + - front-tier + - back-tier + + result: + image: result + ports: + - "5001:80" + - "5858:5858" + networks: + - front-tier + - back-tier + + worker: + image: worker + networks: + - back-tier + + redis: + image: armhf/redis:latest + container_name: redis + ports: + - "6379" + networks: + - back-tier + + db: + image: postgres:9.5 + container_name: db + volumes: + - "db-data:/var/lib/postgresql/data" + networks: + - back-tier + +volumes: + db-data: + +networks: + front-tier: + back-tier: diff --git a/docker-stack.arm.yml b/docker-stack.arm.yml new file mode 100644 index 0000000000..8e2c4eefdb --- /dev/null +++ b/docker-stack.arm.yml @@ -0,0 +1,92 @@ +version: "3" + +services: + redis: + image: armhf/redis:latest + ports: + - "6379" + networks: + - frontend + deploy: + replicas: 2 + update_config: + parallelism: 2 + delay: 10s + restart_policy: + condition: on-failure + + db: + image: postgres:9.5 + volumes: + - db-data:/var/lib/postgresql/data + networks: + - backend + deploy: + placement: + constraints: [node.role == manager] + + vote: + image: vote + ports: + - 5000:80 + networks: + - frontend + depends_on: + - redis + deploy: + replicas: 2 + update_config: + parallelism: 2 + restart_policy: + condition: on-failure + + result: + image: result + ports: + - 5001:80 + networks: + - backend + depends_on: + - db + deploy: + replicas: 2 + update_config: + parallelism: 2 + delay: 10s + restart_policy: + condition: on-failure + + worker: + image: worker + networks: +# - frontend + - backend + deploy: + mode: replicated + replicas: 1 + labels: [APP=VOTING] + restart_policy: + condition: on-failure + delay: 10s + max_attempts: 3 + window: 120s + placement: + constraints: [node.role == manager] + +# visualizer: +# image: dockersamples/visualizer:stable +# ports: +# - "8080:8080" +# stop_grace_period: 1m30s +# volumes: +# - "/var/run/docker.sock:/var/run/docker.sock" +# deploy: +# placement: +# constraints: [node.role == manager] + +networks: + frontend: + backend: + +volumes: + db-data: diff --git a/postgres/Dockerfile.arm b/postgres/Dockerfile.arm new file mode 100644 index 0000000000..0d766a9db2 --- /dev/null +++ b/postgres/Dockerfile.arm @@ -0,0 +1,16 @@ +FROM armhf/alpine:3.4 + +ENV LANG en_US.utf8 +ENV PGDATA /var/lib/postgresql/data + +RUN apk add -U --no-cache postgresql bash su-exec ca-certificates curl \ + && curl -sSL -o /docker-entrypoint.sh "https://raw.githubusercontent.com/docker-library/postgres/master/9.5/alpine/docker-entrypoint.sh" \ + && curl -sSL -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-armhf" \ + && apk del --purge -r ca-certificates curl \ + && chmod +x /usr/local/bin/gosu \ + && mkdir -p /docker-entrypoint-initdb.d /run/postgresql \ + && chmod a+x /docker-entrypoint.sh + +EXPOSE 5432 +ENTRYPOINT [ "/docker-entrypoint.sh" ] +CMD [ "postgres", "-c", "listen_addresses=0.0.0.0" ] diff --git a/result/Dockerfile.arm b/result/Dockerfile.arm new file mode 100644 index 0000000000..adec6ae991 --- /dev/null +++ b/result/Dockerfile.arm @@ -0,0 +1,16 @@ +FROM armhf/node:6.9.1-slim + +WORKDIR /app + +RUN npm install -g nodemon +COPY package.json /app/package.json +RUN npm config set registry http://registry.npmjs.org +RUN npm install && npm ls +RUN mv /app/node_modules /node_modules + +COPY . /app + +ENV PORT 80 +EXPOSE 80 + +CMD ["node", "server.js"] diff --git a/vote/Dockerfile.arm b/vote/Dockerfile.arm new file mode 100644 index 0000000000..adadf763b8 --- /dev/null +++ b/vote/Dockerfile.arm @@ -0,0 +1,18 @@ +# Using official python runtime base image +FROM armhf/python:2.7-alpine + +# Set the application directory +WORKDIR /app + +# Install our requirements.txt +COPY requirements.txt /app/requirements.txt +RUN pip install -r requirements.txt + +# Copy our code from the current folder to /app inside the container +COPY . /app + +# Make port 80 available for links and/or publish +EXPOSE 80 + +# Define our command to be run when launching the container +CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--log-file", "-", "--access-logfile", "-", "--workers", "4", "--keep-alive", "0"] diff --git a/worker/.gitignore b/worker/.gitignore new file mode 100644 index 0000000000..570fb46e56 --- /dev/null +++ b/worker/.gitignore @@ -0,0 +1 @@ +worker-jar-with-dependencies.jar diff --git a/worker/Dockerfile.j.arm b/worker/Dockerfile.j.arm new file mode 100644 index 0000000000..c48519fd46 --- /dev/null +++ b/worker/Dockerfile.j.arm @@ -0,0 +1,4 @@ +FROM armhf/openjdk:8-jre +WORKDIR /worker +COPY ./worker-jar-with-dependencies.jar /worker/worker.jar +CMD ["java", "-jar", "/worker/worker.jar"] diff --git a/worker/Dockerfile.j.builder.arm b/worker/Dockerfile.j.builder.arm new file mode 100644 index 0000000000..24b2fd70e6 --- /dev/null +++ b/worker/Dockerfile.j.builder.arm @@ -0,0 +1,11 @@ +FROM armhf/maven:jdk-8 + +WORKDIR /proj + +# cache dependencies +COPY pom.xml /proj/pom.xml +COPY src /proj/src + +RUN mvn package + +CMD [ "ls", "-lisah", "target" ] From 30952e7a8d8514f5c0415b89dc02be9ba6e9f530 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Fri, 27 Jan 2017 23:05:30 +0100 Subject: [PATCH 02/13] use images from the Docker Hub to enable the docker-stack demo to work --- docker-stack.arm.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-stack.arm.yml b/docker-stack.arm.yml index 8e2c4eefdb..39a0b0e6a3 100644 --- a/docker-stack.arm.yml +++ b/docker-stack.arm.yml @@ -16,7 +16,7 @@ services: condition: on-failure db: - image: postgres:9.5 + image: gesellix/postgres:9.5-rpi volumes: - db-data:/var/lib/postgresql/data networks: @@ -26,7 +26,7 @@ services: constraints: [node.role == manager] vote: - image: vote + image: gesellix/sample-vote ports: - 5000:80 networks: @@ -41,7 +41,7 @@ services: condition: on-failure result: - image: result + image: gesellix/sample-result ports: - 5001:80 networks: @@ -57,7 +57,7 @@ services: condition: on-failure worker: - image: worker + image: gesellix/sample-worker networks: # - frontend - backend From 9d629a1755b0c1aeb3c5ce26b7b9461f2bcd75a5 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Fri, 27 Jan 2017 23:21:23 +0100 Subject: [PATCH 03/13] use existing tags (rpi) --- docker-stack.arm.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-stack.arm.yml b/docker-stack.arm.yml index 39a0b0e6a3..c093345fd6 100644 --- a/docker-stack.arm.yml +++ b/docker-stack.arm.yml @@ -26,7 +26,7 @@ services: constraints: [node.role == manager] vote: - image: gesellix/sample-vote + image: gesellix/sample-vote:rpi ports: - 5000:80 networks: @@ -41,7 +41,7 @@ services: condition: on-failure result: - image: gesellix/sample-result + image: gesellix/sample-result:rpi ports: - 5001:80 networks: From cde8e706fec9d9d57406fa9e83b45d0c9c1445fe Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Sat, 28 Jan 2017 10:20:47 +0100 Subject: [PATCH 04/13] add the arm variant for the docker-swarm-visualizer --- docker-stack.arm.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docker-stack.arm.yml b/docker-stack.arm.yml index c093345fd6..a18cdd8130 100644 --- a/docker-stack.arm.yml +++ b/docker-stack.arm.yml @@ -73,16 +73,16 @@ services: placement: constraints: [node.role == manager] -# visualizer: -# image: dockersamples/visualizer:stable -# ports: -# - "8080:8080" -# stop_grace_period: 1m30s -# volumes: -# - "/var/run/docker.sock:/var/run/docker.sock" -# deploy: -# placement: -# constraints: [node.role == manager] + visualizer: + image: gesellix/sample-visualizer + ports: + - "8080:8080" + stop_grace_period: 1m30s + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + deploy: + placement: + constraints: [node.role == manager] networks: frontend: From b00fa273ffc3e1df356d81dfdee79b969b994fda Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Mon, 30 Jan 2017 21:27:25 +0100 Subject: [PATCH 05/13] rename armhf Dockerfiles to be consistent with the official docker/docker repo --- ...r-compose.arm.yml => docker-compose.armhf.yml | 16 ++++++++++++---- docker-stack.arm.yml => docker-stack.armhf.yml | 0 postgres/{Dockerfile.arm => Dockerfile.armhf} | 0 result/{Dockerfile.arm => Dockerfile.armhf} | 0 vote/{Dockerfile.arm => Dockerfile.armhf} | 0 worker/{Dockerfile.j.arm => Dockerfile.j.armhf} | 0 ....j.builder.arm => Dockerfile.j.builder.armhf} | 0 7 files changed, 12 insertions(+), 4 deletions(-) rename docker-compose.arm.yml => docker-compose.armhf.yml (66%) rename docker-stack.arm.yml => docker-stack.armhf.yml (100%) rename postgres/{Dockerfile.arm => Dockerfile.armhf} (100%) rename result/{Dockerfile.arm => Dockerfile.armhf} (100%) rename vote/{Dockerfile.arm => Dockerfile.armhf} (100%) rename worker/{Dockerfile.j.arm => Dockerfile.j.armhf} (100%) rename worker/{Dockerfile.j.builder.arm => Dockerfile.j.builder.armhf} (100%) diff --git a/docker-compose.arm.yml b/docker-compose.armhf.yml similarity index 66% rename from docker-compose.arm.yml rename to docker-compose.armhf.yml index ed51b064ec..85f201d3b6 100644 --- a/docker-compose.arm.yml +++ b/docker-compose.armhf.yml @@ -2,7 +2,9 @@ version: "2" services: vote: - image: vote + build: + context: ./vote + dockerfile: Dockerfile.armhf ports: - "5000:80" networks: @@ -10,7 +12,9 @@ services: - back-tier result: - image: result + build: + context: ./result + dockerfile: Dockerfile.armhf ports: - "5001:80" - "5858:5858" @@ -19,7 +23,9 @@ services: - back-tier worker: - image: worker + build: + context: ./worker + dockerfile: Dockerfile.jdk.armhf networks: - back-tier @@ -32,7 +38,9 @@ services: - back-tier db: - image: postgres:9.5 + build: + context: ./postgres + dockerfile: Dockerfile.armhf container_name: db volumes: - "db-data:/var/lib/postgresql/data" diff --git a/docker-stack.arm.yml b/docker-stack.armhf.yml similarity index 100% rename from docker-stack.arm.yml rename to docker-stack.armhf.yml diff --git a/postgres/Dockerfile.arm b/postgres/Dockerfile.armhf similarity index 100% rename from postgres/Dockerfile.arm rename to postgres/Dockerfile.armhf diff --git a/result/Dockerfile.arm b/result/Dockerfile.armhf similarity index 100% rename from result/Dockerfile.arm rename to result/Dockerfile.armhf diff --git a/vote/Dockerfile.arm b/vote/Dockerfile.armhf similarity index 100% rename from vote/Dockerfile.arm rename to vote/Dockerfile.armhf diff --git a/worker/Dockerfile.j.arm b/worker/Dockerfile.j.armhf similarity index 100% rename from worker/Dockerfile.j.arm rename to worker/Dockerfile.j.armhf diff --git a/worker/Dockerfile.j.builder.arm b/worker/Dockerfile.j.builder.armhf similarity index 100% rename from worker/Dockerfile.j.builder.arm rename to worker/Dockerfile.j.builder.armhf From 1091103add2c72fc8d4a4502a38a96d7b4f83577 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Mon, 30 Jan 2017 21:33:07 +0100 Subject: [PATCH 06/13] su-exec is used in favour of gosu --- postgres/Dockerfile.armhf | 2 -- 1 file changed, 2 deletions(-) diff --git a/postgres/Dockerfile.armhf b/postgres/Dockerfile.armhf index 0d766a9db2..fb20fafd31 100644 --- a/postgres/Dockerfile.armhf +++ b/postgres/Dockerfile.armhf @@ -5,9 +5,7 @@ ENV PGDATA /var/lib/postgresql/data RUN apk add -U --no-cache postgresql bash su-exec ca-certificates curl \ && curl -sSL -o /docker-entrypoint.sh "https://raw.githubusercontent.com/docker-library/postgres/master/9.5/alpine/docker-entrypoint.sh" \ - && curl -sSL -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-armhf" \ && apk del --purge -r ca-certificates curl \ - && chmod +x /usr/local/bin/gosu \ && mkdir -p /docker-entrypoint-initdb.d /run/postgresql \ && chmod a+x /docker-entrypoint.sh From 5dbfb5148909db6ecfc7407aa515991718a02739 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Mon, 30 Jan 2017 21:33:42 +0100 Subject: [PATCH 07/13] add a combined example Dockerfile of maven build + java runtime --- worker/Dockerfile.jdk.armhf | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 worker/Dockerfile.jdk.armhf diff --git a/worker/Dockerfile.jdk.armhf b/worker/Dockerfile.jdk.armhf new file mode 100644 index 0000000000..555f157083 --- /dev/null +++ b/worker/Dockerfile.jdk.armhf @@ -0,0 +1,11 @@ +FROM armhf/maven:jdk-8 + +WORKDIR /proj + +# cache dependencies +COPY pom.xml /proj/pom.xml +COPY src /proj/src + +RUN mvn package + +CMD ["java", "-jar", "target/worker-jar-with-dependencies.jar"] From f2cd3ac1e383e01cee8591e721a2f3b7267d9b09 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Mon, 30 Jan 2017 22:44:11 +0100 Subject: [PATCH 08/13] use `armhf` image tags for the armhf stack --- docker-stack.armhf.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-stack.armhf.yml b/docker-stack.armhf.yml index a18cdd8130..999b9e1e04 100644 --- a/docker-stack.armhf.yml +++ b/docker-stack.armhf.yml @@ -16,7 +16,7 @@ services: condition: on-failure db: - image: gesellix/postgres:9.5-rpi + image: gesellix/postgres:9.5-armhf volumes: - db-data:/var/lib/postgresql/data networks: @@ -26,7 +26,7 @@ services: constraints: [node.role == manager] vote: - image: gesellix/sample-vote:rpi + image: gesellix/sample-vote:armhf ports: - 5000:80 networks: @@ -41,7 +41,7 @@ services: condition: on-failure result: - image: gesellix/sample-result:rpi + image: gesellix/sample-result:armhf ports: - 5001:80 networks: @@ -57,9 +57,9 @@ services: condition: on-failure worker: - image: gesellix/sample-worker + image: gesellix/sample-worker:armhf networks: -# - frontend + - frontend - backend deploy: mode: replicated From 4d10e2ca6630254ddc2a4ab0cb85b6457d7133eb Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Thu, 2 Feb 2017 10:27:18 +0100 Subject: [PATCH 09/13] reduce redis replicas to 1 --- docker-stack.armhf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-stack.armhf.yml b/docker-stack.armhf.yml index 999b9e1e04..313396dde4 100644 --- a/docker-stack.armhf.yml +++ b/docker-stack.armhf.yml @@ -8,7 +8,7 @@ services: networks: - frontend deploy: - replicas: 2 + replicas: 1 update_config: parallelism: 2 delay: 10s From 0c62a9103d11a83a08dd937a67c132e2d29f7e9c Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Thu, 2 Feb 2017 10:36:27 +0100 Subject: [PATCH 10/13] add logging to vote app --- vote/app.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vote/app.py b/vote/app.py index 1d194b649b..44b8b77689 100644 --- a/vote/app.py +++ b/vote/app.py @@ -4,6 +4,9 @@ import socket import random import json +import logging + +logging.basicConfig(level=logging.INFO) option_a = os.getenv('OPTION_A', "Cats") option_b = os.getenv('OPTION_B', "Dogs") @@ -13,7 +16,9 @@ def get_redis(): if not hasattr(g, 'redis'): + logging.info('connecting to redis...') g.redis = Redis(host="redis", db=0, socket_timeout=5) + logging.info('connected to redis') return g.redis @app.route("/", methods=['POST','GET']) @@ -26,9 +31,11 @@ def hello(): if request.method == 'POST': redis = get_redis() + logging.info('writing to redis') vote = request.form['vote'] data = json.dumps({'voter_id': voter_id, 'vote': vote}) redis.rpush('votes', data) + logging.info('wrote to redis') resp = make_response(render_template( 'index.html', From 9da66f6983dffb911dc9c90a357cc9daa03172d2 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Thu, 2 Feb 2017 10:59:41 +0100 Subject: [PATCH 11/13] print cluster info when connected to redis --- worker/src/main/java/worker/Worker.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worker/src/main/java/worker/Worker.java b/worker/src/main/java/worker/Worker.java index 040c1a2628..9fade805d6 100644 --- a/worker/src/main/java/worker/Worker.java +++ b/worker/src/main/java/worker/Worker.java @@ -51,6 +51,7 @@ static Jedis connectToRedis(String host) { while (true) { try { conn.keys("*"); + System.err.println("Connected to redis"); break; } catch (JedisConnectionException e) { System.err.println("Waiting for redis"); @@ -58,7 +59,7 @@ static Jedis connectToRedis(String host) { } } - System.err.println("Connected to redis"); + System.out.println("Redis cluster info:\n" + conn.clusterInfo()); return conn; } From 8ad37e0063a0eab37ceeda4468d18dcf40bd6a6b Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Thu, 2 Feb 2017 11:10:55 +0100 Subject: [PATCH 12/13] actually cache maven dependencies --- worker/Dockerfile.jdk.armhf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/worker/Dockerfile.jdk.armhf b/worker/Dockerfile.jdk.armhf index 555f157083..b8d753bc4b 100644 --- a/worker/Dockerfile.jdk.armhf +++ b/worker/Dockerfile.jdk.armhf @@ -4,8 +4,10 @@ WORKDIR /proj # cache dependencies COPY pom.xml /proj/pom.xml -COPY src /proj/src +RUN mvn dependency:resolve +RUN mvn verify +COPY src /proj/src RUN mvn package CMD ["java", "-jar", "target/worker-jar-with-dependencies.jar"] From dfa9a3e1c8ce9ecb67456b7c949f55bf7f9f308e Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Thu, 2 Feb 2017 11:47:13 +0100 Subject: [PATCH 13/13] print server info (cluster support not enabled in our setup) --- worker/src/main/java/worker/Worker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worker/src/main/java/worker/Worker.java b/worker/src/main/java/worker/Worker.java index 9fade805d6..46ccbe9bfc 100644 --- a/worker/src/main/java/worker/Worker.java +++ b/worker/src/main/java/worker/Worker.java @@ -59,7 +59,7 @@ static Jedis connectToRedis(String host) { } } - System.out.println("Redis cluster info:\n" + conn.clusterInfo()); + System.out.println("Redis server info:\n" + conn.info()); return conn; }