Docker でJavaEE環境をつくる – Supervisor を使って WildFly と MySQLを起動させる

Docker で 実際に Java EE 環境をつくりながらコマンドを覚える

で、Dockerコンテナ上にJDKのインストールとWildFlyのインストールをコマンドを覚えることを意識しながらおこなった。

つぎは、MySQLをインストールし、Dockerコンテナ上でWildFlyとMySQLが起動する状態にしたい。

1.サーバープロセスの監視ツール

Dockerコンテナを起動するにあたり、プロセスを一つしか指定できない。

ここまでは、bash を起動して環境を構築してきたが、サーバープロセス監視ツールを利用して、その上で複数プロセスを起動させる。

これから始める「DockerでかんたんLAMP環境 for CentOS」

Dockerfile の書き方「私的」なベストプラクティス(3)〜サービスの起動について〜

上記サイトから、サーバー監視ツール monit を利用した図を引用させてもらう。

docker_monit

最初は、自分も上記にならい、monit で同様の環境を構築しようとトライしたのだが、WildFly の monit 用の設定ファイルを作成するが意外と面倒だった。

http://mmonit.com/monit/

同様の機能をもつ、python 製の監視ツール supervisor を使用することにする。こちらの方が、設定がかんたんだった。

http://supervisord.org/

このような試行錯誤を行うときに、思うようにいかなかったら、コンテナをコミットしなければ作業前の状態に戻るのでDocker非常に便利。

2.supervisor のインストール

supervisor は、RedHat の エンタープライズ用拡張パッケージリポジトリ EPEL(Extra Packages for Enterprise Linux) にあるので、EPEL をまずインストールする。

2.1 EPEL のインストール

2.1.1 EPEL ダウンロード

Docker コンテナに接続し、EPELを適当なディレクトリにダウンロード。Docker コンテナに接続し、EPELを適当なディレクトリにダウンロード。

bash-4.2# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/e/epel-release-7-2.noarch.rpm

2.1.2 EPEL インストール

rpm でインストールを行う。

bash-4.2# rpm -Uvh epel-release-7-2.noarch.rpm

一旦適当なタグをつけてコンテナをコミットする

[root@localhost ~]# docker commit c84c05e2982d centos:epel
e7156fab636d916ced4cb85ea478f2dbfedc5d097bd55182274cb8833423343a

2.2 supervisor インストール

http://qiita.com/yushin/items/15f4f90c5663710dbd56

http://docs.docker.com/articles/using_supervisord/

http://yss44.hatenablog.com/entry/2014/01/05/031736

上記あたりを参考に、supervisor をインストールする。

2.2.1 supervisor のインストール

実行に必要なPythonも併せてインストールされる。

bash-4.2# yum install -y supervisor
                 :
Installed:
  supervisor.noarch 0:3.0-1.el7                                                                                                           

Dependency Installed:
  python-backports.noarch 0:1.0-6.el7     python-backports-ssl_match_hostname.noarch 0:3.4.0.2-4.el7  python-meld3.x86_64 0:0.6.10-1.el7 
  python-setuptools.noarch 0:0.9.8-3.el7  systemd-sysv.x86_64 0:208-11.el7_0.2                       

Complete!

2.2.2 supervisor の設定

/etc/supervisor.conf を開き、以下の設定を行う。

nodaemon=false を nodaemon=trueに。

デーモンとして起動すると、Dockerから、プロセスを開始したときにすぐに終了してしまうので、フォアグラウンドで起動させる。

[supervisord]
nodaemon=true              ; (start in foreground if true;default false)  

http://ascii.jp/elem/000/000/619/619693/

以下の様にコメントアウトを外し、

リッスンするホストを、127.0.0.1 –> 0.0.0.0 に変更する。

127.0.0.1 は、ループバックアドレス。ループバックというのは、宛先にこのIPアドレスを指定してデータを送信すると、自身に宛てたものとして戻ってくる。

0.0.0.0 は、「この」ネットワークのこのホストを表す、特殊なIPアドレス。

ループバックアドレスをリッスンしていると、Docker のホスト側からアクセス出来ない。

[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)
[supervisorctl]                                                                                                                           
;serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL  for a unix socket                                                          
serverurl=http://0.0.0.0:9001 ; use an http:// url to specify an inet socket                                                            

2.3 supervisor の起動

起動してみる。

bash-4.2# supervisord

管理用のWeb画面の動作確認。9001 ポートでHTMLが返ってくる。

bash-4.2# curl http://localhost:9001
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <title>Supervisor Status</title>
  <link href="stylesheets/supervisor.css" rel="stylesheet" type="text/css" />
  <link href="images/icon.png" rel="icon" type="image/png" />
</head>
    :

コマンドラインでの管理インターフェース(CLI) supervisorctl で管理プロセスの状況などを確認出来る。

bash-4.2# supervisorctl
supervisor> help

default commands (type help ):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

一旦コミットしておく。

[root@localhost ~]# docker commit 2cfe6a341721 centos:supervisor                                                                          
a176faf3c4e847f88cd1f171197e6c6127edc8fbf5e489c1e9e7db4efdd3b9f2

2.4 supervisor でプロセス管理

/etc/supervisor.conf を見ると、管理対象プロセスに対して、以下の様な設定が出来るようだ。

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;events=EVENT                  ; event notif. types to subscribe to (req'd)
;buffer_size=10                ; event buffer queue size (default 10)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=-1                   ; the relative start priority (default -1)
;autostart=true                ; start at supervisord start (default: true)
;autorestart=unexpected        ; restart at unexpected quit (default: unexpected)
;startsecs=10                  ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups        ; # of stderr logfile backups (default 10)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)

2.4.1 WildFly 用の supervisor 設定ファイルを記述する

kindle版、安くてまとまっていておすすめ。Webで情報探す時間を短縮できる。

/etc/supervisor.d ディレクトリに、.ini という拡張子のファイルを置いておくと、supervisor が自動で設定をロードするため、WildFly用の設定ファイルを記述する。

bash-4.2# vi /etc/supervisord.d/wildfly.ini  
[program:wildfly]
command=/opt/wildfly-8.1.0.Final/bin/standalone.sh
stdout_logfile=/var/log/supervisor/wildfly-supervisor.log
stdout_logfile_maxbytes=5MB                                                                                                               
stdout_logfile_backups=5

supervisor を起動し、CLI を確認する。WildFly が起動していることが確認できる。

bash-4.2# supervisorctl
wildfly                          RUNNING    pid 15, uptime 0:04:18

一旦コミット

[root@localhost ~]# docker commit 2975ec747585 centos:supervisor                                                                          
fc81dd9524fb10c023cd9005a0bd67580cd94b218f11d1fe1505d295c71c87c6

Web管理画面が、Docker ホスト、コンテナ 以外のリモートホストからアクセス出来るか確認。

supervisor のWeb管理画面用 ポート 9001 を公開するようにして、Docker コンテナを起動する。

[root@localhost ~]# docker run -d -p 9001:9001 -p 8080:8080 -p 9990:9990 centos:supervisor /usr/bin/supervisord                          
e7615bac82650854429766061afb38fc8813f86f02b95f6462ac3cd0b5dc5c09

起動確認OK

supervisord_running

3. MySQLのインストール

非常にわかりやすい。

supervisor の準備が出来たので、MySQLをインストールする。

3.1 MySQLリポジトリのインストール

http://www.kakiro-web.com/linux/mysql-install.html

http://www.kakiro-web.com/linux/mysql-yum-repository-install.html

CentOS7になり標準リポジトリからMySQLはインストールできなくなっているため、RPMはMySQLの公式サイトからダウンロードできるものを利用します。

だそうなので、MySQLからRMPをダウンロードする。

公式サイト(http://www.mysql.com/) からダウンロードページ

Login ボタンを押下して、Oracle アカウントでログインするとダウンロード出来るのだが、できれば、wget で直接ダウンロードしたい。

No thanks, just start my download.

というコメントのリンクから、直接ダウンロードできるURLが取得できる。

http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

mysql_rpm_download

取得したURLで適当なディレクトリに wget し、RPMでインストールする。

bash-4.2# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
bash-4.2# rpm -Uvh mysql-community-release-el7-5.noarch.rpm 

3.2 MySQLのインストール

上記でリポジトリのインストールができたので、yum を使って、MySQLのクライアントとサーバーをダウンロードする。

bash-4.2# yum install -y mysql mysql-server

とりあえずコミットしておく。

[root@localhost ~]# docker commit 11e48ffcc94e centos:mysql                                                                               
8eb3d1e53bf496f2fa72ac6022a4f3e9b3eeb4ada2ae4c538020180e9bab6ade

3.3 MySQLの動作確認

MySQLのポートを公開し、Dockerを起動後、mysqld_safe でMySQLサーバーを起動。

[root@localhost ~]# docker -it -p 3306:3306 centos:mysql /bin/bash
bash-4.2# /usr/bin/mysqld_safe
141010 14:04:11 mysqld_safe Logging to '/var/log/mysqld.log'.
141010 14:04:12 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
141010 14:04:28 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

以下のようなエラーになった。

2014-10-10 14:30:03 673 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

http://qiita.com/840_/items/06f32fecbe57c3fdf5ec

上記サイトを参考に解決を試みる。

bash-4.2# mysql_install_db --datadir=/var/lib/mysql --user=mysql

再度起動。

bash-4.2# mysqld_safe &

クライアントから接続。動作確認OK

bash-4.2# mysql        
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.21 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql
Database changed
mysql> select user,password from user;
+------+----------+
| user | password |
+------+----------+
| root |          |
| root |          |
| root |          |
| root |          |
|      |          |
|      |          |
+------+----------+
6 rows in set (0.00 sec)

3.4 外部からの接続確認

外部から接続確認するために、テスト環境(ユーザー、データベース)を作成する。

3.4.1 テストデータベースの作成

データベースを作成する

mysql> create database test_db default character set utf8;
Query OK, 1 row affected (0.10 sec)

結果を確認。

mysql>  show create database test_db;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| test_db  | CREATE DATABASE `test_db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.04 sec)

3.4.2 テストユーザーの作成

mysql>  create user test_user@localhost;
Query OK, 0 rows affected (0.06 sec)

外部からの接続を許可し、パスワードを設定する。

mysql> grant all privileges on *.* to test_user@'%' identified by 'test' with grant option;
Query OK, 0 rows affected (0.05 sec)

3.4.3 接続確認

MySQL Workbench から、作成したテストデータベースに接続できることを確認。

mysql_connected

確認出来たので、この作業は、Docker でコミットせずに破棄する。

この手の確認作業がゴミを残さずに確認出来るところもDocker便利。

3.5 MySQL の supervisor 設定

WildFly 同様にMySQL用のsupervisor用設定ファイルを記述する。

bash-4.2# vi /etc/supervisord.d/mysqld.ini

ざっとこんな感じ

[program:mysqld]
command=/usr/bin/mysqld_safe
stdout_logfile=/var/log/supervisor/mysqld.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=5

4.動作確認

ということで、supervisor を起動プロセスに指定し、 Docker をバックグラウンドで起動してみる。

[root@localhost ~]# docker run -d -p 9001:9001 -p 8080:8080 -p 9990:9990 -p 3306:3306 centos:web_db /usr/bin/supervisord
14da18250d43e5b9100bce441f9e40789d9a3bcec36e4940e610ec9479a4060d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                                                                            NAMES
14da18250d43        centos:web_db       /usr/bin/supervisord   16 seconds ago      Up 13 seconds       0.0.0.0:3306->3306/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9990->9990/tcp   mad_sammet          

OK!

MySQLとWildFlyの起動状況がモニタできている。開始、停止も機能することを確認。

supervisord_running_web_db

結局、ここまでで、どんな環境で、何の動作確認ができたかというと、Widows8.1 上の Hyper-V にインストールしたCentOS7 にDockerをインストールして、Docker上にCentOS7 のイメージを作成し

て起動、その中に WildFly、MySQLをインストールして、supervisor で管理したうえで、一番

外側のWindows8.1上で起動したブラウザから、一番内側のWildFly、supervisor、MySQL workbenchから、MySQLサーバーのインスタンスに接続する。ことが確認できたと。

docker_success

Follow me!

コメントを残す

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