[sheepdog] [PATCH] Add docker container support

Hitoshi Mitake mitake.hitoshi at gmail.com
Fri Jul 24 06:27:42 CEST 2015


At Fri, 24 Jul 2015 00:20:34 -0400,
Christopher Durkin wrote:
> 
> 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

Applied, thanks.
Hitoshi

> 
> 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)
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> https://lists.wpkg.org/mailman/listinfo/sheepdog


More information about the sheepdog mailing list