DockerFileでDockerイメージを作成してみる

| コメントをどうぞ

アプリケーションの動作環境をコンテナ化するために、ベースとなるubuntuやcentosのイメージに必要なアプリケーションを一つずつ手動でインストールして作成していく方法もありますが、インストール手順を記述したDockerFileを使って作成する方法もあります。
インストール手順をDockerFileでスクリプト化しておくことで再利用性も高まります。
今回はDockerFileによりinfoScoopを稼働させるサーバーのイメージを作成し、コンテナを起動するところまでの手順をご紹介したいと思います。

Dockerのインストール

DockerはLinuxで動作しますので、Linuxマシンを用意します。
今回はubuntuを用意したのでapt-getでDockerをインストールします。

sudo apt-get install docker.io

WindowsやMacの場合はboot2dockerを使って仮想マシン上でDockerを動かす方法があります。
boot2dockerの使い方については、AKNISHIさんのブログを参照してください。
Windows環境で手早くDockerを試してみるメモ

DockerFileの作成

Dockerがインストールできましたら、Dockerfileを用意します。
今回はtomcat+mysqlでinfoScoopが動作する環境を作成しますので任意のディレクトリに以下のファイルを用意します。

任意のディレクトリ
├── DockerFile
├── my.cfg
├── mysql-connector-java-5.1.12-bin.jar
└── infoscoop.xml

各ファイルの内容は以下となります。

■DockerFile

FROM ubuntu:trusty

RUN apt-get update && apt-get -y upgrade

# javaインストール
RUN apt-get -y install openjdk-7-jdk wget
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64

# tomcatインストール
RUN apt-get -y install tomcat7

# mysqlインストール
RUN apt-get -yq install mysql-server 

# WARの作成と配備
RUN apt-get -y install ant unzip
ENV ANT_HOME /usr/share/ant
RUN cd /usr/local/src \
  && wget http://www.infoscoop.org/download-modules/infoscoop-opensource-340-zip \
  && unzip infoscoop-opensource-340-zip \
  && cd infoscoop-opensource-3.4.0/infoscoop \
  && chmod 700 remakewar.sh \
  && ./remakewar.sh \
  && cp ./dist/infoscoop.war /var/lib/tomcat7/webapps

# コンテキスト設定ファイルの配備
ADD infoscoop.xml /var/lib/tomcat7/conf/Catalina/localhost/infoscoop.xml

# mysql connectorの配備
RUN cd ~
ADD mysql-connector-java-5.1.12-bin.jar ./mysql-connector-java-5.1.12-bin.jar
RUN chmod 777 mysql-connector-java-5.1.12-bin.jar \
 && cp mysql-connector-java-5.1.12-bin.jar /usr/share/tomcat7/lib \
 && cp mysql-connector-java-5.1.12-bin.jar /usr/local/src/infoscoop-opensource-3.4.0/tools/initdb/lib

# my.cfgの配備
ADD my.cfg /etc/mysql/my.cnf

# データベース作成
# 初期データのロード
RUN /etc/init.d/mysql start \
 && sleep 5s \
 && mysql -u root -e "create database iscoop character set utf8;" \
 && mysql -u root iscoop < /usr/local/src/infoscoop-opensource-3.4.0/tools/initdb/schema/mysql/mysqlinit.sql \
 && cd /usr/local/src/infoscoop-opensource-3.4.0/tools/initdb \
 && chmod 700 import.sh \
 && sleep 5s \
 && ./import.sh

■infoscoop.xml(Tomcatのコンテキスト設定ファイル)

<Context path="/infoscoop" reloadable="false" >
        <Resource name="jdbc/infoscoop"
                  auth="Container"
                  type="javax.sql.DataSource"
                  driverClassName="com.mysql.jdbc.Driver"
                  url="jdbc:mysql://localhost:3306/iscoop?useUnicode=true&amp;characterEncoding=UTF-8"
                  username="root"
                  password=""
                  validationQuery="select 1" />
</Context>

■my.cfg

[mysqld]
lower_case_table_names=1

Dockerイメージの作成

各ファイルが用意できたらDockerFileのあるフォルダに移動して以下のコマンドを実行します。

docker build .

DockerFileに記述したスクリプトが実行されイメージが作成されます。

以下のコマンドでイメージ一覧が確認できます。

docker images

■ローカルリポジトリ内のイメージ一覧

REPOSITORY      TAG          IMAGE ID         CREATED         VIRTUAL SIZE
<none>          <none>       858b026870a8     4 hours ago     988.7 MB

以下のコマンドを実行して作成したイメージに名前とタグをつけます。

docker tag trial/infoscoop:1.0

イメージ一覧を確認すると以下のようになります。

REPOSITORY       TAG       IMAGE ID        CREATED         VIRTUAL SIZE
trial/infoscoop  1.0       858b026870a8    4 hours ago     988.7 MB

コンテナの起動

以下のコマンドを実行してコンテナを起動します。

docker run -i -t -p 8080:8080 trial/infoscoop:1.0 /bin/bash

起動したコンテナの中でコマンド操作するために、-i と -t オプションと実行コマンドとして/bin/bashを指定しています。
docker runのコマンドオプションについての詳細は以下のページをご参照ください。
https://docs.docker.com/reference/commandline/cli/#run

コンテナが起動しましたら、以下のコマンドでMySQLを起動します。

/etc/init.d/mysql start

続けて以下のコマンドでTomcatを起動します。

/etc/init.d/tomcat7 start

ブラウザを開いて以下のURLにアクセスして動作確認します。

http://[server name]:8080/infoscoop

以下のようにログイン画面が表示されれば成功です。

infoscoop-login

本番環境として利用するにはデータの永続化やスケールアウトなどを考慮する必要はありますが、
手軽にinfoScoopを試してみたいという方は上記手順にてお試しいただけたらと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>