Resin の Docker を作成する。

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

レシピ

  1. ベースイメージの作成
  2. Resin の 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. Resin の Docker イメージを作成します

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

Dockerfile
FROM mycentos:6.9

EXPOSE 22 6800 8080 9009 5200 5701 40608

ENV DEBIAN_FRONTEND noninteractive

# yum
RUN yum -y update && yum clean all
RUN yum -y upgrade && yum -y update && yum clean all
RUN yum install -y --setopt=protected_multilib=false ld-linux.so.2 libstdc++.so.6 libpng12

# 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

# Resin
COPY setup_resin.sh /setup_resin.sh
RUN chmod u+x /setup_resin.sh
RUN /setup_resin.sh
RUN rm -f /setup_resin.sh

COPY run.sh /run.sh
RUN chmod +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

Resin のセットアップスクリプトです。

setup_resin.sh
#!/bin/sh

curl -L -C - -O http://caucho.com/download/resin-pro-4.0.56.zip
unzip resin-pro-4.0.56.zip
rm resin-pro-4.0.56.zip

cd resin-pro-4.0.56
./configure
make
make install

cd ..
rm -rf resin-pro-4.0.56

echo "app.https         : 8443" >> /etc/resin/resin.properties
echo "elastic_cloud_enable : true" >> /etc/resin/resin.properties
echo "jvm_args  : -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Tokyo -Xmx2048m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=30 -XX:NewSize=256m -XX:MaxNewSize=256m -XX:+CMSClassUnloadingEnabled -Xdebug -Xrunjdwp:transport=dt_socket,address=9009,server=y,suspend=n" >> /etc/resin/resin.properties
echo "admin_user : admin" >> /etc/resin/resin.properties
echo "admin_password : {SSHA}bTLnpGjSarNFd/EQe8W4d/IjAxfQdGe8" >> /etc/resin/resin.properties
echo "admin_external : true" >> /etc/resin/resin.properties
echo "admin_secure : true" >> /etc/resin/resin.properties

mkdir /var/resin/storage
mkdir /var/resin/tmp

mv /var/resin/webapp-jars/hibernate-validator-4.3.0.Final.jar /var/resin/webapp-jars/hibernate-validator-4.3.0.Final.jar.bak
mv /usr/local/share/resin-4.0.56/lib/validation-api-1.0.0.GA.jar /usr/local/share/resin-4.0.56/lib/validation-api-1.0.0.GA.jar.bak

以下の変更を加えています。

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

run.sh
#!/bin/bash

/etc/init.d/sshd restart

IP=$(ip addr show eth0 | perl -n -e 'if (m/inet ([\d\.]+)/g) { print $1 }')

resinctl -server app-0 start -Djgroups.bind_addr=${IP}
touch /var/log/resin/jvm-app-0.log
tail -F /var/log/resin/jvm-app-0.log

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

myresin というタグでビルドします。

docker build -t myresin:4.0.56 .

3. 実行します

docker run -it -p 2222:22 -p 6800:6800 -p 8080:8080 -p 9009:9009 -p 5200:5200 -p 5701:5701 -p 40608:40608 myresin

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

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