memorycraftです。

Dockerネタです。
前回の記事で、DockerでSSHサーバとして起動しましたが、通常いろいろなサービスを起動したコンテナを使うことの方が多いと思います。

Dockerでは起動時に1つのCMDしか指定できないようで、前回のやり方では1つのサービスしか起動できません。 このような場合は、Supervisorを利用するといいようです。 

たとえば、sshdとhttpdをサービス起動したコンテナの場合、コンテナ内のsupervisordがsshdとhttpdを管理し、dockerがsupervisordを使ってサービス起動するというイメージです。

それでは早速試してみます。
コンテナは前回と同じcentosをつかいます。

コンテナの起動

コンテナを立ちあげてコンソールにアクセスします。

# docker run -t -i centos /bin/bash

sshとhttpdのインストール

コンテナに入ったらまず、必要なsshdやhttpd、supervisorインストール用のeasy?installなどのプログラムを準備します。

-bash-4.1# yum install passwd openssh openssh-clients openssh-server httpd vim python-setuptools -y

sshdの設定をします。

-bash-4.1# vim /etc/ssh/sshd_config
#UsePAM no
UsePAM yes

UsePAM no
#UsePAM yes

rootユーザのパスワードを設定します。

-bash-4.1# passwd

httpdのインデックスページを用意します。

-bash-4.1# -bash-4.1# echo moge > /var/www/html/index.html

Supervisorのインストール

supervisorをインストールします。

-bash-4.1# easy_install supervisor

supervisorの起動スクリプトを用意します。

-bash-4.1# vim /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
# chmod 755 /etc/init.d/supervisord

Supervisorの設定

supervisorの設定ファイルを用意します。

-bash-4.1#  echo_supervisord_conf > /etc/supervisord.conf
-bash-4.1# echo "[include]" >> /etc/supervisord.conf
-bash-4.1# echo "files = supervisord/conf/*.conf" >> /etc/supervisord.conf
-bash-4.1# mkdir -p /etc/supervisord/conf/

設定を記載します。 ここでポイントは、supervisord自身のnodaemon=trueという項目です。
これによって、supervisordがフォアグラウンド起動します。

-bash-4.1#  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

ここで、コンテナを抜けます。

-bash-4.1# exit

コンテナイメージの作成

ホスト側で、一度コミットします。

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c118bcc97b1e centos:6.4 /bin/bash 3 hours ago Exit 0

# docker commit c118bcc97b1e memorycraft/centos

コンテナの起動

それでは、コミットしたイメージで新しいコンテナを起動してみます。
このとき、起動するコマンドに/usr/bin/supervisordを指定し、開放ポートに22と80を2つ指定します。

# docker run -d -p 22 -p 80 memorycraft/centos /usr/bin/supervisord

確認

それではコンテナに対してsshとhttpでアクセスしてみます。
docker ps -aで、ポートマッピングの状況がわかります。

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
337f5660c4d0 memorycraft/centos:latest /usr/bin/supervisord 47 minutes ago Up 47 minutes 0.0.0.0:49173->22/tcp, 0.0.0.0:49174->80/tcp stoic_bell
c118bcc97b1e centos:6.4 /bin/bash 3 hours ago Exit 0 sad_torvalds

マッピングされたポートをつかってsshアクセスしてみます。

# ssh root@127.0.0.1 -p 49173
The authenticity of host '[127.0.0.1]:49173 ([127.0.0.1]:49173)' can't be established.
RSA key fingerprint is 59:de:98:f5:21:15:bc:40:c1:29:8d:76:84:eb:59:05.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:49173' (RSA) to the list of known hosts.
root@127.0.0.1's password:

アクセスできました!

続けて、httpです。
マッピングされたポートをつかってブラウザアクセスしてみます。

おお!確認できました!

これで複数のサービスが起動したコンテナを作れます。
今回は、以上です。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら