[sheepdog] [PATCH] Add docker container support
Christopher Durkin
cjdurkin at gmail.com
Fri Jul 24 06:20:34 CEST 2015
From: Chris Durkin <chris.durkin at nimboxx.com>
Adds Dockerfile and scripts for creating clusters of containers.
For details see docker/README.md.
Signed-off-by: Chris Durkin <chris.durkin at nimboxx.com>
---
Dockerfile | 20 +++++++++++++
docker/README.md | 76 +++++++++++++++++++++++++++++++++++++++++++++++++
docker/build.sh | 7 +++++
docker/cdog | 6 ++++
docker/corosync.conf | 74 +++++++++++++++++++++++++++++++++++++++++++++++
docker/run.sh | 9 ++++++
docker/start_cluster.sh | 18 ++++++++++++
7 files changed, 210 insertions(+)
create mode 100644 Dockerfile
create mode 100644 docker/README.md
create mode 100755 docker/build.sh
create mode 100755 docker/cdog
create mode 100644 docker/corosync.conf
create mode 100644 docker/run.sh
create mode 100755 docker/start_cluster.sh
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..14e8816
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,20 @@
+FROM ubuntu:14.04
+RUN apt-get -qq update
+RUN apt-get -qq install -y gcc autoconf yasm pkg-config libtool make
+RUN apt-get -qq install -y corosync libcorosync-dev crmsh
+RUN apt-get -qq install -y liburcu-dev libqb-dev
+ENV SHEEPSRC /usr/src/sheepdog
+ENV SHEEPPORT 7000
+ENV SHEEPSTORE /store
+ADD ./docker/corosync.conf /etc/corosync/corosync.conf
+ADD ./docker/run.sh /root/run.sh
+
+WORKDIR $SHEEPSRC
+ADD . $SHEEPSRC
+RUN ./autogen.sh
+RUN ./configure && make && make check && make install
+
+RUN mkdir $SHEEPSTORE
+
+EXPOSE $SHEEPPORT
+CMD /bin/bash /root/run.sh
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 0000000..40df3b2
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,76 @@
+Installing docker
+=================
+
+For complete info, visit the [Docker
+site](https://docs.docker.com/installation/). For quick start, see
+sections below.
+
+On Ubuntu
+---------
+
+Install the docker daemon using apt. Note the package name.
+
+ apt-get install docker.io
+
+
+On Mac
+------
+
+Using homebrew, boot2docker, and virtualbox is easiest.
+
+ brew install boot2docker
+ boot2docker init
+ boot2docker up
+
+
+Building container image
+==============
+
+Use `docker build .` from the source root directory, or use
+`docker/build.sh` to automatically tag the image. Alternatively,
+download an image from docker.io and specify the image name in the
+next step.
+
+After building or pulling the image, it should be visible when running
+`docker images`.
+
+
+Running a cluster
+=================
+
+All scripts are controlled using environment variables (all caps).
+
+ IMAGE - docker image name, for building or starting containers
+ NODE - for running commands on containers, the name of the node
+ DOCKER - the docker command (try DOCKER="sudo docker" on linux)
+
+Use `docker/start_cluster.sh` to start a 3 node corosync cluster with
+sheep running on each one. You can specify the node names with NODES,
+or default to "n1 n2 n3". If any of the nodes already exist they will
+be killed and removed. You can specify the image with IMAGE, or
+default to sheepdog:latest.
+
+Use `docker/cdog` to run dog commands on the cluster nodes. You can
+specify the target node with NODE=nodename, or default to n1.
+
+A full example:
+
+ ./docker/build.sh
+ ./docker/start_cluster.sh
+ ./docker/cdog cluster format
+ ./docker/cdog cluster info
+
+Running an image from docker.io:
+
+ export IMAGE=cjdnxx/sheepdog
+ docker pull $IMAGE
+ ./docker/start_cluster.sh # uses IMAGE env var
+
+After starting the cluster, use `docker ps` to see the running
+containers.
+
+Pause containers with `docker pause`, then unpause with `docker
+unpause` to simulate machines temporarily leaving the cluster. Use
+`docker kill` to nuke a container. Note that IP addresses are assigned
+dynamically so a killed container will appear as a new node, even if
+it has the same host name.
diff --git a/docker/build.sh b/docker/build.sh
new file mode 100755
index 0000000..18c77f8
--- /dev/null
+++ b/docker/build.sh
@@ -0,0 +1,7 @@
+#!/bin/bash -x
+
+srcdir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+image=${IMAGE:-sheepdog:latest}
+docker=${DOCKER:-docker}
+
+$docker build -t $image $srcdir/..
diff --git a/docker/cdog b/docker/cdog
new file mode 100755
index 0000000..62d2679
--- /dev/null
+++ b/docker/cdog
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+node=${NODE:-n1}
+docker=${DOCKER:-docker}
+
+$docker exec -t $node /usr/sbin/dog $*
diff --git a/docker/corosync.conf b/docker/corosync.conf
new file mode 100644
index 0000000..b87488a
--- /dev/null
+++ b/docker/corosync.conf
@@ -0,0 +1,74 @@
+# Please read the openais.conf.5 manual page
+
+totem {
+ version: 2
+
+ # How long before declaring a token lost (ms)
+ token: 3000
+
+ # How many token retransmits before forming a new configuration
+ token_retransmits_before_loss_const: 10
+
+ # How long to wait for join messages in the membership protocol (ms)
+ join: 60
+
+ # How long to wait for consensus to be achieved before starting a new round of membership configuration (ms)
+ consensus: 3600
+
+ # Turn off the virtual synchrony filter
+ vsftype: none
+
+ # Number of messages that may be sent by one processor on receipt of the token
+ max_messages: 20
+
+ # Limit generated nodeids to 31-bits (positive signed integers)
+ clear_node_high_bit: yes
+
+ # Disable encryption
+ secauth: off
+
+ # How many threads to use for encryption/decryption
+ threads: 0
+
+ # Optionally assign a fixed node id (integer)
+ # nodeid: 1234
+
+ # This specifies the mode of redundant ring, which may be none, active, or passive.
+ rrp_mode: none
+
+ interface {
+ # The following values need to be set based on your environment
+ ringnumber: 0
+ #bindnetaddr: 127.0.0.1
+ bindnetaddr: 172.17.0.0
+ #mcastaddr: 226.94.1.1
+ mcastaddr: 224.0.55.55
+ mcastport: 5405
+ }
+}
+
+amf {
+ mode: disabled
+}
+
+quorum {
+ # Quorum for the Pacemaker Cluster Resource Manager
+ provider: corosync_votequorum
+ expected_votes: 1
+}
+
+aisexec {
+ user: root
+ group: root
+}
+
+logging {
+ fileline: off
+ to_stderr: no
+ to_logfile: yes
+ to_syslog: no
+ logfile: /var/log/corosync/corosync.log
+ syslog_facility: daemon
+ debug: on
+ timestamp: on
+}
diff --git a/docker/run.sh b/docker/run.sh
new file mode 100644
index 0000000..fac9a37
--- /dev/null
+++ b/docker/run.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+# cmd run on container creation (only call within a container)
+# leave a bash shell as the foreground process
+
+env
+/usr/sbin/corosync
+service pacemaker start
+/usr/sbin/sheep -c corosync $SHEEPSTORE -p $SHEEPPORT
+/bin/bash
diff --git a/docker/start_cluster.sh b/docker/start_cluster.sh
new file mode 100755
index 0000000..6664845
--- /dev/null
+++ b/docker/start_cluster.sh
@@ -0,0 +1,18 @@
+#!/bin/bash -x
+
+image=${IMAGE:-sheepdog:latest}
+nodes=${NODES:-"n1 n2 n3"}
+docker=${DOCKER:-docker}
+
+echo "Killing old cluster..."
+for node in $nodes; do
+ $docker kill $node
+ $docker rm $node
+done
+
+sleep 1
+
+echo "Starting new cluster..."
+for node in $nodes; do
+ $docker run -h $node -d --name=$node -t $image
+done
--
2.3.2 (Apple Git-55)
More information about the sheepdog
mailing list