diff --git a/.gitignore b/.gitignore
index 531255d..415d93b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,5 @@
.idea/
# name of executable when built using command 'go build'
elektron
+# test log directory name.
+Elektron-Test-Run*
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..d8bc0ff
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,62 @@
+# Copyright (C) 2018 spdfg
+#
+# This file is part of Elektron.
+#
+# Elektron is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Elektron is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Elektron. If not, see .
+#
+
+FROM ubuntu:xenial
+
+RUN apt-get update && apt-get -y install \
+ apt-transport-https \
+ ca-certificates \
+ curl \
+ software-properties-common && \
+ apt-get install -yq ssh git
+
+RUN add-apt-repository ppa:deadsnakes/ppa && \
+ apt-get update && \
+ apt-get install -y python3.7
+
+# Installing performance co-pilot.
+RUN apt-get install -y pcp pcp-gui
+
+# The name of the elektron executable.
+ARG elektronexecutablename=elektron
+ENV ELEKTRON_EXECUTABLE_NAME=$elektronexecutablename
+
+# HOST:PORT of the mesos master.
+ARG elektronmesosmasterlocation=localhost:5050
+ENV ELEKTRON_MESOS_MASTER_LOCATION=$elektronmesosmasterlocation
+
+# Workload to be scheduled.
+ARG elektronworkload=workload_sample.json
+ENV ELEKTRON_WORKLOAD=$elektronworkload
+
+# Prefix of the log directory.
+ARG elektronlogdirprefix=Elektron-Test-Run
+ENV ELEKTRON_LOGDIR_PREFIX=$elektronlogdirprefix
+
+# Hostname/IP Address of the physical machine on which the docker containers are being run.
+# This is used to create the pcp config file.
+ARG hostip=""
+ENV HOST_IP=$hostip
+
+# Creating directory into which the current directory is going to be mounted.
+RUN mkdir /elektron
+ADD ./ /elektron
+WORKDIR /elektron
+RUN chmod 777 /elektron/entrypoint.sh
+
+ENTRYPOINT ["/elektron/entrypoint.sh"]
diff --git a/README.md b/README.md
index f166bdd..2b7284d 100644
--- a/README.md
+++ b/README.md
@@ -55,14 +55,64 @@ If vendoring dependencies, then use the below commands after cloning _elektron_.
An alternative is to clone _elektron_ using the command `git clone --recurse-submodules git@github.com:spdfg/elektron.git`.
-
-## Build and Run
+## Build
Compile the source code using the `go build` tool as shown below.
```commandline
go build -o elektron
```
Use the `-h` option to get information about other command-line options.
+## Run
+Elektron can be run on bare-metal or using a docker-compose environment.
+### Bare-Metal
+Follow instructions [here](http://mesos.apache.org/documentation/latest/building/) to setup a Mesos cluster.
+In addition, the following software should be installed.
+
+| Software | Target Machines |
+|-----------------------|---------------------------|
+| [Performance Co-Pilot](http://pcp.io/) | Mesos master nodes + agent nodes |
+| [Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/) | Mesos agent nodes |
+
+If power consumption needs to be monitored, install the perfevent PMDA by following the instructions [here](https://pcp.io/man/man1/pmdaperfevent.1.html).
+_Note: You might need to update the exposed event names for RAPL depending on the architecture_.
+For example, update _perfevent.conf_ with the following events if measuring both CPU and DRAM power.
+```
+rapl::RAPL_ENERGY_PKG node
+rapl::RAPL_ENERGY_DRAM node
+```
+
+**_Detail document on the bare-metal setup coming up soon!_**
+
+### Docker-Compose
+For local testing purposes, the docker-compose setup can be used. Follow instructions [here](https://docs.docker.com/compose/install/) to install docker-compose.
+
+The [entrypoint](./entrypoint.sh) script requires the IP address of the host machine to generate the [PCP config](./config).
+On a linux machine, the below command can be used to set it.
+```commandline
+export HOST_IP=$(curl ifconfig.me)
+```
+
+#### Environment Variables
+The following are the environment variables required to run _elektron_.
+
+| Environment Variable | Description | Commandline Option (if any) |
+|--------------------------------|-------------------------------|-----------------------------|
+| ELEKTRON_EXECUTABLE_NAME | Name of the elektron executable. Default = elektron |
+| ELEKTRON_MESOS_MASTER_LOCATION | HOST:PORT of the mesos master. Default = localhost:5050 | `-master` |
+| ELEKTRON_WORKLOAD | Filename of workload json to be scheduled. Default = workload_sample.json | `-workload` |
+| ELEKLTRON_LOGDIR_PREFIX | Prefix of the log directory generated. Default = Elektron-Test-Run | `-logPrefix` |
+
+Use the below command to run elektron using the docker-compose setup.
+```commandline
+ docker-compose run elektron
+```
+The Mesos master UI can be viewed from the host machine using _http://localhost:5050_.
+
+If any other commandline options need to be specified, for example using the [bin-packing](./schedulers/bin-packing.go) scheduling policy, use the below command.
+```commandline
+docker-compose run elektron -schedPolicy bin-packing
+```
+
### Workload
Use the `-workload` option to specify the location of the workload json file. Below is an example workload.
```json
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..80b6e06
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,103 @@
+# Copyright (C) 2018 spdfg
+#
+# This file is part of Elektron.
+#
+# Elektron is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Elektron is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Elektron. If not, see .
+#
+version: "2"
+
+services:
+ zk:
+ image: rdelvalle/zookeeper
+ restart: on-failure
+ ports:
+ - "2181:2181"
+ environment:
+ ZK_CONFIG: tickTime=2000,initLimit=10,syncLimit=5,maxClientCnxns=128,forceSync=no,clientPort=2181
+ ZK_ID: 1
+ networks:
+ elektron-cluster:
+ ipv4_address: 19.16.4.3
+ logging:
+ driver: none
+
+ mesos-master:
+ image: rdelvalle/mesos-master:1.5.1
+ restart: on-failure
+ ports:
+ - "5050:5050"
+ environment:
+ MESOS_ZK: zk://19.16.4.3:2181/mesos
+ MESOS_QUORUM: 1
+ MESOS_HOSTNAME: localhost
+ MESOS_CLUSTER: test-cluster
+ MESOS_REGISTRY: replicated_log
+ MESOS_WORK_DIR: /tmp/mesos
+ networks:
+ elektron-cluster:
+ ipv4_address: 19.16.4.4
+ logging:
+ driver: none
+ depends_on:
+ - zk
+
+ mesos-agent:
+ image: spdf/mesos-agent-elektron:1.5.1
+ pid: host
+ restart: on-failure
+ ports:
+ - "5051:5051"
+ environment:
+ MESOS_MASTER: zk://19.16.4.3:2181/mesos
+ MESOS_CONTAINERIZERS: mesos,docker
+ MESOS_ISOLATION: cgroups/cpu
+ MESOS_PORT: 5051
+ MESOS_HOSTNAME: localhost
+ MESOS_RESOURCES: ports(*):[11000-11999]
+ MESOS_SYSTEMD_ENABLE_SUPPORT: 'false'
+ MESOS_WORK_DIR: /tmp/mesos
+ networks:
+ elektron-cluster:
+ ipv4_address: 19.16.4.5
+ logging:
+ driver: none
+ volumes:
+ - /sys/fs/cgroup:/sys/fs/cgroup
+ - /var/run/docker.sock:/var/run/docker.sock
+ depends_on:
+ - mesos-master
+
+ elektron:
+ image: spdf/elektron:v1
+ restart: on-failure
+ environment:
+ ELEKTRON_EXECUTABLE_NAME: elektron
+ ELEKTRON_WORKLOAD: workload_sample.json
+ ELEKTRON_MESOS_MASTER_LOCATION: 19.16.4.4:5050
+ ELEKTRON_LOGDIR_PREFIX: Elektron-Test-Run
+ HOST_IP: ${HOST_IP}
+ networks:
+ elektron-cluster:
+ ipv4_address: 19.16.4.6
+ volumes:
+ - ./:/elektron
+ depends_on:
+ - mesos-agent
+
+networks:
+ elektron-cluster:
+ ipam:
+ config:
+ - subnet: 19.16.4.0/16
+ gateway: 19.16.4.1
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100755
index 0000000..84fd691
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# Copyright (C) 2018 spdfg
+#
+# This file is part of Elektron.
+#
+# Elektron is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Elektron is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Elektron. If not, see .
+#
+
+# Accessing host machine's ip address.
+hostip=$HOST_IP
+
+# setting up metrics to be monitored.
+# creating PCP config with the cpu and memory usage metrics to be monitored.
+cat >config <