2015.04.16
M.clacla 開発

Docker触ってみた~ その3

今回も、前回の Docker触ってみた~ その2 に続き、しつこく続編です。

前回、Dockerのコンテナの中にApache HTTPDなどのサービスを入れて
# chkconfig httpd on
のようにしても、コンテナを立ち上げてもサービスを開始してくれない、というところで止まっていました。

今回は、Supervisorを使って簡単に起動する方法を調べたので、まとめてみます。
Supervisorっていうのは、pythonで作られたプロセス管理システムなので、pythonを入れる必要があるので、それも含めて手順をまとめていきます。

おおまかな設定としては、
[コンテナ側]
・python-setuptools、supervisorをインストール
・supervisorのサービス起動のスクリプトを作成
・supervisorの設定ファイルを作成
[ホスト側]
・コンテナをもとにイメージを作成
・コンテナを一旦削除
・先ほど作ったイメージでコンテナを再度作成

こんな流れで進めていきます。
コンテナを作りなおすのは、起動時に走らせる処理を変えるためです。

まずコンテナ側から。

コンテナを起動してrootで操作します。

■python-setuptools、supervisorをインストール

# yum install python-setuptools
# easy_install supervisor

■supervisorのサービス起動のスクリプトを作成

まずvi等のエディタでファイルを新規作成します。
# vi /etc/init.d/supervisord

以下の内容で保存します。

#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: – 64 36
# description: Supervisor Server
# processname: supervisord

# Source init functions
. /etc/init.d/functions

RETVAL=0
prog=”supervisord”
pidfile=”/tmp/supervisord.pid”
lockfile=”/var/lock/subsys/supervisord”

start()
{
   echo -n $”Starting $prog: ”
   daemon –pidfile $pidfile supervisord
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop()
{
   echo -n $”Shutting down $prog: ”
   killproc -p ${pidfile} /usr/bin/supervisord
   RETVAL=$?
   echo
   if [ $RETVAL -eq 0 ] ; then
      rm -f ${lockfile} ${pidfile}
   fi
}
case “$1” in
  start)
    start
  ;;
  stop)
    stop
  ;;
  status)
    status $prog
  ;;
  restart)
    stop
    start
  ;;
  *)
    echo “Usage: $0 {start|stop|restart|status}”
  ;;
esac

作ったsupervisordのファイルに実行権限を与えます。
# chmod 755 /etc/init.d/supervisord

■supervisorの設定ファイルを作成

まず、設定ファイルのひな形を作成します。
# echo_supervisord_conf > /etc/supervisord.conf

次に、作ったひな形をエディタで開きます。
# vi /etc/supervisord.conf

ファイルの末尾に以下の2行を加えます。

[include]
files = supervisord/conf/*.conf

次に、具体的にサービスを起動する設定のファイルをvi等のエディタで新規作成します。
※先に設定ファイルを入れるディレクトリを作成します。
# mkdir -p /etc/supervisord/conf/
# vim /etc/supervisord/conf/service.conf

以下の内容で保存します。

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D
autostart=true
autorestart=true

[program:httpd]
command=/usr/sbin/httpd -c “ErrorLog /dev/stdout” -DFOREGROUND
redirect_stderr=true

[program:mysqld]
command=/usr/bin/mysqld_safe
autostart=true
autorestart=true

ここまで行ったら、コンテナを終了しておきます。

続いてホスト側。

■コンテナをもとにイメージを作成

まず、コンテナのID を取得します。
# docker ps -a
→一覧に表示されたコンテナから、今回使っているコンテナのIDとイメージ名を取得します。

続いて、先ほど取得したコンテナのIDを使って、イメージを作ります。
# docker commit [コンテナID] [イメージ名]
※イメージ名は任意に決めて問題ありません。

イメージ作成には時間がかかる場合があります。(大きなコンテナで作ると時間がかかります)
作成後、
# docker images
で、イメージが作成されていることを確認し、先へ進みます。

■コンテナを一旦削除

イメージが既に作成されているので、コンテナを一旦削除します。
# docker rm [コンテナ名]

■先ほど作ったイメージでコンテナを再度作成

先ほどイメージを作ったので、コンテナを改めて同じ名前で作成し、起動します。
その際、コンテナ起動時にSupervisorを起動するよう、以下のように実行します。
# docker run -it -p [httpポート]:80 -p [httpsポート]:443 -p [sshポート]:22 –name “[コンテナ名]” [イメージ名] /usr/bin/supervisord
※http、https、sshの転送ポートは、コンテナごとに決定してください。

これで、コンテナを起動した際に、SSH、Apache HTTPD、MySQLが起動するようになるはずです。

今回もDockerネタを引っ張りましたが、そろそろ終わりかな。。。
うーん、、、もしかしたら次回まで引っ張るかもしれません。

(M.clacla)

一覧に戻る