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)監修のもと掲載しています。
元記事は、こちら