Cassandra の Docker を作成する。

この CookBook では、Cassandra の Docker の作成手順について紹介しています。

レシピ

  1. ベースイメージの作成
  2. Cassandra の Docker イメージを作成します
  3. 実行します

1. ベースイメージの作成

CentOS 6.9 を使用します。

Dockerfile
FROM centos:centos6.9

EXPOSE 22

ENV DEBIAN_FRONTEND noninteractive

# yum
RUN yum -y update && yum clean all

# locale
RUN yum reinstall -y glibc-common
RUN localedef -i ja_JP -f UTF-8 ja_JP.utf8
RUN touch /etc/sysconfig/i18n
RUN echo 'LANG="ja_JP.UTF-8"' >> /etc/sysconfig/i18n
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja

# timezone
RUN yum install -y tzdata
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
RUN echo 'UTC=false' >> /etc/sysconfig/clock
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# tools
RUN yum groupinstall -y 'Development Tools'
RUN yum install -y --enablerepo centosplus wget curl vim emacs tar unzip mlocate perl ssh openssh-server openssl-devel

# root passwd
RUN bash -c 'echo "root:password" | chpasswd'

# ssh
RUN sed -i -e "s/#PasswordAuthentication yes/PasswordAuthentication yes/g" /etc/ssh/sshd_config
RUN sed -i -e "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
RUN sed -i -e "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config

RUN updatedb

CMD /etc/init.d/sshd restart && /bin/bash

ロケールを ja_JP, タイムゾーンを Asia/Tokyo に変更し、root/password で ssh 接続ができるように設定します。

mycentos:6.9 というタグでビルドします。

docker build -t mycentos:6.9 .

2. Cassandra の Docker イメージを作成します

先ほど作成したベースイメージを利用します。
jdk-8u172-linux-x64.tar.gz を事前にダウンロードしておきます。

Dockerfile
FROM mycentos:6.9

EXPOSE 22 9160

ENV DEBIAN_FRONTEND noninteractive

# yum
RUN yum -y update && yum clean all
RUN yum -y upgrade && yum -y update && yum clean all

# JDK
COPY jdk-8u172-linux-x64.tar.gz /jdk-8u172-linux-x64.tar.gz
COPY setup_jdk.sh /setup_jdk.sh
RUN chmod u+x /setup_jdk.sh
RUN /setup_jdk.sh
RUN rm -f /setup_jdk.sh
ENV JAVA_HOME /usr/local/java/jdk
ENV PATH /usr/local/java/jdk/bin:$PATH
RUN echo 'JAVA_HOME=/usr/local/java/jdk' >> /root/.bashrc
RUN echo 'PATH=$PATH:/usr/local/java/jdk/bin' >> /root/.bashrc
RUN rm -f /jdk-8u172-linux-x64.tar.gz

# Cassandra
COPY setup_cassandra.sh /setup_cassandra.sh
RUN chmod u+x /setup_cassandra.sh
RUN /setup_cassandra.sh
RUN rm -f /setup_cassandra.sh
ENV PATH $PATH:/usr/local/apache-cassandra/apache-cassandra/bin
RUN echo 'PATH=$PATH:/usr/local/apache-cassandra/apache-cassandra/bin' >> /root/.bashrc

COPY run.sh /run.sh
RUN chmod u+x /run.sh

RUN updatedb

CMD /run.sh

細かいセットアップはシェルスクリプトに逃がし、Dockerfile からはそれを実行するようにします。
これにより、Dockerfile をシンプルにでき、かつイメージ容量の削減にもつながります。

setup_jdk.sh
#!/bin/sh

tar zxvf /jdk-8u172-linux-x64.tar.gz
mkdir -p /usr/local/java
mv jdk1.8.0_172 /usr/local/java/jdk1.8.0_172
ln -s /usr/local/java/jdk1.8.0_172 /usr/local/java/jdk
setup_cassandra.sh
#!/bin/sh

curl -L -C - -O https://archive.apache.org/dist/cassandra/1.1.12/apache-cassandra-1.1.12-bin.tar.gz
tar -zxvf apache-cassandra-1.1.12-bin.tar.gz
rm apache-cassandra-1.1.12-bin.tar.gz

mkdir -p /usr/local/apache-cassandra
mv apache-cassandra-1.1.12 /usr/local/apache-cassandra/apache-cassandra-1.1.12
ln -s /usr/local/apache-cassandra/apache-cassandra-1.1.12 /usr/local/apache-cassandra/apache-cassandra

sed -i -e "s/Xss180k/Xss228k/g" /usr/local/apache-cassandra/apache-cassandra/conf/cassandra-env.sh
sed -i -e "s/listen_address: localhost/listen_address:/g" /usr/local/apache-cassandra/apache-cassandra/conf/cassandra.yaml
sed -i -e "s/rpc_address: localhost/rpc_address:/g" /usr/local/apache-cassandra/apache-cassandra/conf/cassandra.yaml

以下の設定を変更しています。

  • Xss180k -> Xss228k
  • listen_address: localhost -> listen_address:
  • rpc_address: localhost -> rpc_address:

docker run 時に実行するスクリプトです。

run.sh
#!/bin/bash

/etc/init.d/sshd restart
cassandra &

touch /var/log/cassandra/system.log
tail -F /var/log/cassandra/system.log

sshd と Cassandra を起動しています。

mycassandra:1.1.12 というタグでビルドします。

docker build -t mycassandra:1.1.12 .

3. 実行します

docker run -it -p 2222:22 -p 9160:9160 mycassandra:1.1.12

root/password で ssh 接続ができるようになっています。
あくまで検証用の Docker としてこのように設定しているため、セキュリティにはご注意ください。

このように、Docker イメージ化するだけで、検証用の Cassandra をすぐに準備できます。
是非ご活用ください。