From 81d5cc2864be8fca7676abc044d974e8481d1d06 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Sun, 17 Apr 2016 22:00:18 +0500 Subject: [PATCH 01/10] Add an official image for Apache Storm --- storm/README-short.txt | 1 + storm/content.md | 29 +++++++++++++++++++++++++++++ storm/license.md | 1 + storm/logo.png | Bin 0 -> 34490 bytes 4 files changed, 31 insertions(+) create mode 100644 storm/README-short.txt create mode 100644 storm/content.md create mode 100644 storm/license.md create mode 100644 storm/logo.png diff --git a/storm/README-short.txt b/storm/README-short.txt new file mode 100644 index 000000000..a6affe216 --- /dev/null +++ b/storm/README-short.txt @@ -0,0 +1 @@ +Apache Storm is a free and open source distributed realtime computation system. diff --git a/storm/content.md b/storm/content.md new file mode 100644 index 000000000..e4e11d1d0 --- /dev/null +++ b/storm/content.md @@ -0,0 +1,29 @@ +# What is Apache Storm? + +Apache Storm is a distributed computation framework written predominantly in the Clojure programming language. Originally created by Nathan Marz and team at BackType, the project was open sourced after being acquired by Twitter. It uses custom created "spouts" and "bolts" to define information sources and manipulations to allow batch, distributed processing of streaming data. The initial release was on 17 September 2011. + +> [wikipedia.org/wiki/Storm_(event_processor)](https://en.wikipedia.org/wiki/Storm_(event_processor)) + +%%LOGO%% + +# How to use this image + +## Setting up a Storm Cluster + +1. Start Zookeeper + + $ docker run -d --name zookeeper jplock/zookeeper:3.4.8 + +2. Start Nimbus + + $ docker run -d --name nimbus --net container:zookeeper 31z4/storm:1.0.0 nimbus + +3. Start Supervisor + + $ docker run -d --name supervisor --net container:nimbus 31z4/storm:1.0.0 supervisor + +## Running Topologies + +Assuming you set up a Storm cluster as written above and have `storm-starter-topologies-1.0.0.jar` in your current directory. + + $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology diff --git a/storm/license.md b/storm/license.md new file mode 100644 index 000000000..995b917aa --- /dev/null +++ b/storm/license.md @@ -0,0 +1 @@ +View [license information](http://storm.apache.org/about/free-and-open-source.html) for the software contained in this image. diff --git a/storm/logo.png b/storm/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9478c7c6b125e6789e0f08dafea5444cdff369ae GIT binary patch literal 34490 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 Date: Sun, 17 Apr 2016 22:10:54 +0500 Subject: [PATCH 02/10] Fixed markdownfmt issues --- storm/content.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/storm/content.md b/storm/content.md index e4e11d1d0..9d3b8218e 100644 --- a/storm/content.md +++ b/storm/content.md @@ -10,20 +10,20 @@ Apache Storm is a distributed computation framework written predominantly in the ## Setting up a Storm Cluster -1. Start Zookeeper +1. Start Zookeeper - $ docker run -d --name zookeeper jplock/zookeeper:3.4.8 + $ docker run -d --name zookeeper jplock/zookeeper:3.4.8 -2. Start Nimbus +2. Start Nimbus - $ docker run -d --name nimbus --net container:zookeeper 31z4/storm:1.0.0 nimbus + $ docker run -d --name nimbus --net container:zookeeper 31z4/storm:1.0.0 nimbus -3. Start Supervisor +3. Start Supervisor - $ docker run -d --name supervisor --net container:nimbus 31z4/storm:1.0.0 supervisor + $ docker run -d --name supervisor --net container:nimbus 31z4/storm:1.0.0 supervisor ## Running Topologies Assuming you set up a Storm cluster as written above and have `storm-starter-topologies-1.0.0.jar` in your current directory. - $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology + $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology From a65f571914fcba694c84058d9b172aee335c17c5 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Mon, 2 May 2016 17:56:02 +0500 Subject: [PATCH 03/10] Better documentation --- storm/content.md | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/storm/content.md b/storm/content.md index 9d3b8218e..6e6086a1f 100644 --- a/storm/content.md +++ b/storm/content.md @@ -8,22 +8,48 @@ Apache Storm is a distributed computation framework written predominantly in the # How to use this image -## Setting up a Storm Cluster +This image entry point is a [Storm command line client](http://storm.apache.org/releases/1.0.0/Command-line-client.html). See couple of usage examples below. -1. Start Zookeeper +## Running topologies in local mode - $ docker run -d --name zookeeper jplock/zookeeper:3.4.8 +Assuming you have `storm-starter-topologies-1.0.0.jar` in the current directory. -2. Start Nimbus + $ docker run -it -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar 31z4/storm:1.0.0 jar /topology.jar org.apache.storm.starter.ExclamationTopology - $ docker run -d --name nimbus --net container:zookeeper 31z4/storm:1.0.0 nimbus +## Setting up a minimal Storm cluster -3. Start Supervisor +1. [Apache Zookeeper](https://zookeeper.apache.org/) is a must for running a Storm cluster. Start it first. Since the Zookeeper "fails fast" it's better to always restart it. - $ docker run -d --name supervisor --net container:nimbus 31z4/storm:1.0.0 supervisor + $ docker run -d --restart always --name zookeeper jplock/zookeeper:3.4.8 -## Running Topologies +2. The Nimbus daemon has to be connected with the Zookeeper. It's also a "fail fast" system. -Assuming you set up a Storm cluster as written above and have `storm-starter-topologies-1.0.0.jar` in your current directory. + $ docker run -d --restart always --name nimbus --net container:zookeeper 31z4/storm:1.0.0 nimbus - $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology +3. Finally start a single Supervisor node. It will talk to the Nimbus and Zookeeper. + + $ docker run -d --restart always --name supervisor --net container:nimbus --net container:zookeeper 31z4/storm:1.0.0 supervisor + +4. Now we can submit a topology to our cluster. + + $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar 31z4/storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology + +## Configuration + +This image uses [default configuration](https://github.com/apache/storm/blob/v1.0.0/conf/defaults.yaml) of the Apache Storm. There are two main ways to change it. + +1. Using command line arguments. + + $ docker run -d --restart always --name nimbus 31z4/storm:1.0.0 nimbus -c storm.log.dir="/logs" -c storm.zookeeper.servers="[\"zookeeper\"]" + +2. Assuming you have `storm.yaml` in the current directory you can mount it as a volume. + + $ docker run -it -v $(pwd)/storm.yaml:/apache-storm-1.0.0/conf/storm.yaml 31z4/storm:1.0.0 nimbus + +## Data persistence + +No data are persisted by default. For convenience there are `/data` and `/logs` directories in the image owned by `storm` user. Use them accordingly to persist data and logs using volumes. + + $ docker run -it -v /logs -v /data 31z4/storm:1.0.0 nimbus -c storm.log.dir="/logs" -c storm.local.dir="/data" + +*Please be noticed that using paths other than those predefined is likely to cause permission denied errors. It's because for [security reasons](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#user) the Storm is running under the non-root `storm` user.* From 32a1b5dc480fe02ddf14930060e7c39e765987b3 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Tue, 3 May 2016 22:38:28 +0500 Subject: [PATCH 04/10] Added docker-compose.yml --- storm/content.md | 4 ++++ storm/docker-compose.yml | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 storm/docker-compose.yml diff --git a/storm/content.md b/storm/content.md index 6e6086a1f..9f9a10077 100644 --- a/storm/content.md +++ b/storm/content.md @@ -34,6 +34,10 @@ Assuming you have `storm-starter-topologies-1.0.0.jar` in the current directory. $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar 31z4/storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology +## %%COMPOSE%% + +Run `docker-compose up` and wait for it to initialize completely. The Nimbus will be available at your host and port `6627`. + ## Configuration This image uses [default configuration](https://github.com/apache/storm/blob/v1.0.0/conf/defaults.yaml) of the Apache Storm. There are two main ways to change it. diff --git a/storm/docker-compose.yml b/storm/docker-compose.yml new file mode 100644 index 000000000..01ff8f00e --- /dev/null +++ b/storm/docker-compose.yml @@ -0,0 +1,21 @@ +version: '2' +services: + zookeeper: + image: jplock/zookeeper:3.4.8 + restart: always + + nimbus: + image: 31z4/storm:1.0.0 + command: nimbus -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" + depends_on: + - zookeeper + restart: always + ports: + - 6627:6627 + + supervisor: + image: 31z4/storm:1.0.0 + command: supervisor -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" + depends_on: + - nimbus + restart: always From 7a97916b1f0fa46de687c75ff90a662e74be3872 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Fri, 6 May 2016 01:35:48 +0500 Subject: [PATCH 05/10] Bump Storm version --- storm/content.md | 18 +++++++++--------- storm/docker-compose.yml | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/storm/content.md b/storm/content.md index 9f9a10077..c3f5159dc 100644 --- a/storm/content.md +++ b/storm/content.md @@ -12,9 +12,9 @@ This image entry point is a [Storm command line client](http://storm.apache.org/ ## Running topologies in local mode -Assuming you have `storm-starter-topologies-1.0.0.jar` in the current directory. +Assuming you have `storm-starter-topologies-1.0.1.jar` in the current directory. - $ docker run -it -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar 31z4/storm:1.0.0 jar /topology.jar org.apache.storm.starter.ExclamationTopology + $ docker run -it -v $(pwd)/storm-starter-topologies-1.0.1.jar:/topology.jar 31z4/storm:1.0.1 storm jar /topology.jar org.apache.storm.starter.ExclamationTopology ## Setting up a minimal Storm cluster @@ -24,15 +24,15 @@ Assuming you have `storm-starter-topologies-1.0.0.jar` in the current directory. 2. The Nimbus daemon has to be connected with the Zookeeper. It's also a "fail fast" system. - $ docker run -d --restart always --name nimbus --net container:zookeeper 31z4/storm:1.0.0 nimbus + $ docker run -d --restart always --name nimbus --net container:zookeeper 31z4/storm:1.0.1 storm nimbus 3. Finally start a single Supervisor node. It will talk to the Nimbus and Zookeeper. - $ docker run -d --restart always --name supervisor --net container:nimbus --net container:zookeeper 31z4/storm:1.0.0 supervisor + $ docker run -d --restart always --name supervisor --net container:nimbus --net container:zookeeper 31z4/storm:1.0.1 storm supervisor 4. Now we can submit a topology to our cluster. - $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.0.jar:/topology.jar 31z4/storm:1.0.0 jar /topology.jar org.apache.storm.starter.WordCountTopology topology + $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.1.jar:/topology.jar 31z4/storm:1.0.1 storm jar /topology.jar org.apache.storm.starter.WordCountTopology topology ## %%COMPOSE%% @@ -40,20 +40,20 @@ Run `docker-compose up` and wait for it to initialize completely. The Nimbus wil ## Configuration -This image uses [default configuration](https://github.com/apache/storm/blob/v1.0.0/conf/defaults.yaml) of the Apache Storm. There are two main ways to change it. +This image uses [default configuration](https://github.com/apache/storm/blob/v1.0.1/conf/defaults.yaml) of the Apache Storm. There are two main ways to change it. 1. Using command line arguments. - $ docker run -d --restart always --name nimbus 31z4/storm:1.0.0 nimbus -c storm.log.dir="/logs" -c storm.zookeeper.servers="[\"zookeeper\"]" + $ docker run -d --restart always --name nimbus 31z4/storm:1.0.1 storm nimbus -c storm.log.dir="/logs" -c storm.zookeeper.servers="[\"zookeeper\"]" 2. Assuming you have `storm.yaml` in the current directory you can mount it as a volume. - $ docker run -it -v $(pwd)/storm.yaml:/apache-storm-1.0.0/conf/storm.yaml 31z4/storm:1.0.0 nimbus + $ docker run -it -v $(pwd)/storm.yaml:/apache-storm-1.0.1/conf/storm.yaml 31z4/storm:1.0.1 storm nimbus ## Data persistence No data are persisted by default. For convenience there are `/data` and `/logs` directories in the image owned by `storm` user. Use them accordingly to persist data and logs using volumes. - $ docker run -it -v /logs -v /data 31z4/storm:1.0.0 nimbus -c storm.log.dir="/logs" -c storm.local.dir="/data" + $ docker run -it -v /logs -v /data 31z4/storm:1.0.1 storm nimbus -c storm.log.dir="/logs" -c storm.local.dir="/data" *Please be noticed that using paths other than those predefined is likely to cause permission denied errors. It's because for [security reasons](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#user) the Storm is running under the non-root `storm` user.* diff --git a/storm/docker-compose.yml b/storm/docker-compose.yml index 01ff8f00e..b75fc1036 100644 --- a/storm/docker-compose.yml +++ b/storm/docker-compose.yml @@ -5,8 +5,8 @@ services: restart: always nimbus: - image: 31z4/storm:1.0.0 - command: nimbus -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" + image: 31z4/storm:1.0.1 + command: storm nimbus -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" depends_on: - zookeeper restart: always @@ -14,8 +14,8 @@ services: - 6627:6627 supervisor: - image: 31z4/storm:1.0.0 - command: supervisor -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" + image: 31z4/storm:1.0.1 + command: storm supervisor -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" depends_on: - nimbus restart: always From bd80606e7a03d54354e2ed2ca55f7ec8fab981c2 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Tue, 24 May 2016 23:47:21 +0500 Subject: [PATCH 06/10] Refer to own Zookeeper image * Removed obsolete line --- storm/content.md | 4 +--- storm/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/storm/content.md b/storm/content.md index c3f5159dc..0cf78693c 100644 --- a/storm/content.md +++ b/storm/content.md @@ -8,8 +8,6 @@ Apache Storm is a distributed computation framework written predominantly in the # How to use this image -This image entry point is a [Storm command line client](http://storm.apache.org/releases/1.0.0/Command-line-client.html). See couple of usage examples below. - ## Running topologies in local mode Assuming you have `storm-starter-topologies-1.0.1.jar` in the current directory. @@ -20,7 +18,7 @@ Assuming you have `storm-starter-topologies-1.0.1.jar` in the current directory. 1. [Apache Zookeeper](https://zookeeper.apache.org/) is a must for running a Storm cluster. Start it first. Since the Zookeeper "fails fast" it's better to always restart it. - $ docker run -d --restart always --name zookeeper jplock/zookeeper:3.4.8 + $ docker run -d --restart always --name zookeeper 31z4/zookeeper:3.4.8 2. The Nimbus daemon has to be connected with the Zookeeper. It's also a "fail fast" system. diff --git a/storm/docker-compose.yml b/storm/docker-compose.yml index b75fc1036..104849503 100644 --- a/storm/docker-compose.yml +++ b/storm/docker-compose.yml @@ -1,7 +1,7 @@ version: '2' services: zookeeper: - image: jplock/zookeeper:3.4.8 + image: 31z4/zookeeper:3.4.8 restart: always nimbus: From 7139af661bbd3133442daba01ad9dc8b3a31bbc9 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Wed, 25 May 2016 00:25:25 +0500 Subject: [PATCH 07/10] Add github-repo file --- storm/github-repo | 1 + 1 file changed, 1 insertion(+) create mode 100644 storm/github-repo diff --git a/storm/github-repo b/storm/github-repo new file mode 100644 index 000000000..a8b88815d --- /dev/null +++ b/storm/github-repo @@ -0,0 +1 @@ +https://github.com/31z4/storm-docker From e163b8fb17c495f600a5607f83acb1f40ade9bf5 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Sat, 8 Oct 2016 23:03:00 +0500 Subject: [PATCH 08/10] Changes after review --- storm/content.md | 20 ++++++++++---------- storm/docker-compose.yml | 19 ++++++++++++++----- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/storm/content.md b/storm/content.md index 0cf78693c..cdfa1079c 100644 --- a/storm/content.md +++ b/storm/content.md @@ -10,27 +10,27 @@ Apache Storm is a distributed computation framework written predominantly in the ## Running topologies in local mode -Assuming you have `storm-starter-topologies-1.0.1.jar` in the current directory. +Assuming you have `storm-starter-topologies-1.0.2.jar` in the current directory. - $ docker run -it -v $(pwd)/storm-starter-topologies-1.0.1.jar:/topology.jar 31z4/storm:1.0.1 storm jar /topology.jar org.apache.storm.starter.ExclamationTopology + $ docker run -it -v $(pwd)/storm-starter-topologies-1.0.2.jar:/topology.jar storm:1.0.2 storm jar /topology.jar org.apache.storm.starter.ExclamationTopology ## Setting up a minimal Storm cluster 1. [Apache Zookeeper](https://zookeeper.apache.org/) is a must for running a Storm cluster. Start it first. Since the Zookeeper "fails fast" it's better to always restart it. - $ docker run -d --restart always --name zookeeper 31z4/zookeeper:3.4.8 + $ docker run -d --restart always --name some-zookeeper zookeeper:3.4 2. The Nimbus daemon has to be connected with the Zookeeper. It's also a "fail fast" system. - $ docker run -d --restart always --name nimbus --net container:zookeeper 31z4/storm:1.0.1 storm nimbus + $ docker run -d --restart always --name some-nimbus --link some-zookeeper:zookeeper storm:1.0.2 storm nimbus 3. Finally start a single Supervisor node. It will talk to the Nimbus and Zookeeper. - $ docker run -d --restart always --name supervisor --net container:nimbus --net container:zookeeper 31z4/storm:1.0.1 storm supervisor + $ docker run -d --restart always --name supervisor --link some-zookeeper:zookeeper --link some-nimbus:nimbus storm:1.0.2 storm supervisor 4. Now we can submit a topology to our cluster. - $ docker run -it --net container:nimbus -v $(pwd)/storm-starter-topologies-1.0.1.jar:/topology.jar 31z4/storm:1.0.1 storm jar /topology.jar org.apache.storm.starter.WordCountTopology topology + $ docker run --link some-nimbus:nimbus -it --rm -v $(pwd)/storm-starter-topologies-1.0.2.jar:/topology.jar storm:1.0.2 storm jar /topology.jar org.apache.storm.starter.WordCountTopology topology ## %%COMPOSE%% @@ -38,20 +38,20 @@ Run `docker-compose up` and wait for it to initialize completely. The Nimbus wil ## Configuration -This image uses [default configuration](https://github.com/apache/storm/blob/v1.0.1/conf/defaults.yaml) of the Apache Storm. There are two main ways to change it. +This image uses [default configuration](https://github.com/apache/storm/blob/v1.0.2/conf/defaults.yaml) of the Apache Storm. There are two main ways to change it. 1. Using command line arguments. - $ docker run -d --restart always --name nimbus 31z4/storm:1.0.1 storm nimbus -c storm.log.dir="/logs" -c storm.zookeeper.servers="[\"zookeeper\"]" + $ docker run -d --restart always --name nimbus storm:1.0.2 storm nimbus -c storm.log.dir="/logs" -c storm.zookeeper.servers="[zookeeper]" 2. Assuming you have `storm.yaml` in the current directory you can mount it as a volume. - $ docker run -it -v $(pwd)/storm.yaml:/apache-storm-1.0.1/conf/storm.yaml 31z4/storm:1.0.1 storm nimbus + $ docker run -it -v $(pwd)/storm.yaml:/apache-storm-1.0.2/conf/storm.yaml storm:1.0.2 storm nimbus ## Data persistence No data are persisted by default. For convenience there are `/data` and `/logs` directories in the image owned by `storm` user. Use them accordingly to persist data and logs using volumes. - $ docker run -it -v /logs -v /data 31z4/storm:1.0.1 storm nimbus -c storm.log.dir="/logs" -c storm.local.dir="/data" + $ docker run -it -v /logs -v /data storm:1.0.2 storm nimbus -c storm.log.dir="/logs" -c storm.local.dir="/data" *Please be noticed that using paths other than those predefined is likely to cause permission denied errors. It's because for [security reasons](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#user) the Storm is running under the non-root `storm` user.* diff --git a/storm/docker-compose.yml b/storm/docker-compose.yml index 104849503..489b1cf68 100644 --- a/storm/docker-compose.yml +++ b/storm/docker-compose.yml @@ -1,21 +1,30 @@ version: '2' services: zookeeper: - image: 31z4/zookeeper:3.4.8 + image: zookeeper:3.4 + container_name: zookeeper restart: always nimbus: - image: 31z4/storm:1.0.1 - command: storm nimbus -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" + image: storm:1.0.2 + container_name: nimbus + command: storm nimbus depends_on: - zookeeper + links: + - zookeeper restart: always ports: - 6627:6627 supervisor: - image: 31z4/storm:1.0.1 - command: storm supervisor -c storm.zookeeper.servers="[\"zookeeper\"]" -c nimbus.host="nimbus" + image: storm:1.0.2 + container_name: supervisor + command: storm supervisor depends_on: - nimbus + - zookeeper + links: + - nimbus + - zookeeper restart: always From f0bb352cc00b044f47287f8e002452d38b302b80 Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Tue, 11 Oct 2016 11:28:06 +0500 Subject: [PATCH 09/10] Add Storm UI example --- storm/content.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/storm/content.md b/storm/content.md index cdfa1079c..c0f5d09ba 100644 --- a/storm/content.md +++ b/storm/content.md @@ -28,10 +28,14 @@ Assuming you have `storm-starter-topologies-1.0.2.jar` in the current directory. $ docker run -d --restart always --name supervisor --link some-zookeeper:zookeeper --link some-nimbus:nimbus storm:1.0.2 storm supervisor -4. Now we can submit a topology to our cluster. +4. Now you can submit a topology to our cluster. $ docker run --link some-nimbus:nimbus -it --rm -v $(pwd)/storm-starter-topologies-1.0.2.jar:/topology.jar storm:1.0.2 storm jar /topology.jar org.apache.storm.starter.WordCountTopology topology +5. Optionally, you can start the Storm UI. + + $ docker run -d -p 8080:8080 --restart always --name ui --link some-nimbus:nimbus storm:1.0.2 storm ui + ## %%COMPOSE%% Run `docker-compose up` and wait for it to initialize completely. The Nimbus will be available at your host and port `6627`. From de18f53b30186deed0e3d870b132928c3e7ba15b Mon Sep 17 00:00:00 2001 From: Elisey Zanko Date: Wed, 12 Oct 2016 12:59:21 +0500 Subject: [PATCH 10/10] Note on logging --- storm/content.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/storm/content.md b/storm/content.md index c0f5d09ba..0fc5c164e 100644 --- a/storm/content.md +++ b/storm/content.md @@ -46,16 +46,20 @@ This image uses [default configuration](https://github.com/apache/storm/blob/v1. 1. Using command line arguments. - $ docker run -d --restart always --name nimbus storm:1.0.2 storm nimbus -c storm.log.dir="/logs" -c storm.zookeeper.servers="[zookeeper]" + $ docker run -d --restart always --name nimbus storm:1.0.2 storm nimbus -c storm.zookeeper.servers="[zookeeper]" 2. Assuming you have `storm.yaml` in the current directory you can mount it as a volume. - $ docker run -it -v $(pwd)/storm.yaml:/apache-storm-1.0.2/conf/storm.yaml storm:1.0.2 storm nimbus + $ docker run -it -v $(pwd)/storm.yaml:/conf/storm.yaml storm:1.0.2 storm nimbus + +## Logging + +This image uses [default logging configuration](https://github.com/apache/storm/tree/v1.0.2/log4j2). All logs go to the `/logs` directory by default. ## Data persistence No data are persisted by default. For convenience there are `/data` and `/logs` directories in the image owned by `storm` user. Use them accordingly to persist data and logs using volumes. - $ docker run -it -v /logs -v /data storm:1.0.2 storm nimbus -c storm.log.dir="/logs" -c storm.local.dir="/data" + $ docker run -it -v /logs -v /data storm:1.0.2 storm nimbus *Please be noticed that using paths other than those predefined is likely to cause permission denied errors. It's because for [security reasons](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#user) the Storm is running under the non-root `storm` user.*