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 を利用した図を引用させてもらう。
最初は、自分も上記にならい、monit で同様の環境を構築しようとトライしたのだが、WildFly の monit 用の設定ファイルを作成するが意外と面倒だった。
同様の機能をもつ、python 製の監視ツール supervisor を使用することにする。こちらの方が、設定がかんたんだった。
このような試行錯誤を行うときに、思うようにいかなかったら、コンテナをコミットしなければ作業前の状態に戻るので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
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
取得した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 から、作成したテストデータベースに接続できることを確認。
確認出来たので、この作業は、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の起動状況がモニタできている。開始、停止も機能することを確認。
結局、ここまでで、どんな環境で、何の動作確認ができたかというと、Widows8.1 上の Hyper-V にインストールしたCentOS7 にDockerをインストールして、Docker上にCentOS7 のイメージを作成し
て起動、その中に WildFly、MySQLをインストールして、supervisor で管理したうえで、一番
外側のWindows8.1上で起動したブラウザから、一番内側のWildFly、supervisor、MySQL workbenchから、MySQLサーバーのインスタンスに接続する。ことが確認できたと。