#Intro
dockerを使ってwebアプリの開発環境作ってますがサービス同時
起動ができないのでめんどくさいです。
supervisordを使ってやってみます。
docker runするときのコマンドに/sbin/init渡して複数起動させる
形式も試しましたがきちんと子プロセスを殺せず
defunctを量産したのでやめました。
#前提
- MaxOS + boot2docker上のDockerでやってます
- dockerの環境セットアップなどは割愛します
- コンテナ側osはcentos6.6
#手順
##1.適当なコンテナを立ち上げる
このコンテナはまっさらのcentos6イメージです。(何もインストールされてない)
docker run -itd --name devutil centos:centos6 /bin/bash
##2.関連するツールを入れる
#めんどくさいのでまとめて入れる
yum -y groupinstall "Development Tools"
#pythonツールたちとsshとhttpd
yum -y install openssh openssh-clients openssh-server httpd vim python-setuptools
#rootのパスワード変えておく
passwd
##3.supervisordのインストール
easy_install supervisor
##4.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
##4.supervisorの設定ファイルを書く
[supervisord]
nodaemon=true
[program:sshd]
#command=/usr/sbin/sshd -D
command=/sbin/service sshd start
[program:httpd]
command=/sbin/service httpd start
##5.sshのPAM設定
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
##6.一旦コンテナから抜けてcommitする
Ctrl + p + qで抜ける。
commitしてイメージを保存する
docker commit 457dc5419f1a takaito/devutil
docker images
さっき立ち上げたコンテナはstopして削除する。
docker stop {コンテナID}
docker rm {コンテナID}
##7.イメージからポートマッピングして再度コンテナ立ち上げ
docker run -itd -p 51080:80 -p 51022:22 --name devutil takaito/devutil /usr/bin/supervisord
##8.確認
Mac側から
boot2dockerのip経由で51080ポートでブラウザでアクセス
boot2dockerのip経由で5102ポートでsshログイン
ssh root@192.168.59.103 -p 51022
ができればOK
試しにコンテナ側のプロセス確認。ちゃんと動いてますね。
ps ax
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
PID TTY STAT TIME COMMAND
1 pts/0 Ss+ 0:00 /usr/bin/python /usr/bin/supervisord
35 ? Ss 0:00 /usr/sbin/httpd
37 ? S 0:00 /usr/sbin/httpd
38 ? Ss 0:00 /usr/sbin/sshd
39 ? S 0:00 /usr/sbin/httpd
40 ? S 0:00 /usr/sbin/httpd
42 ? S 0:00 /usr/sbin/httpd
43 ? S 0:00 /usr/sbin/httpd
44 ? S 0:00 /usr/sbin/httpd
45 ? S 0:00 /usr/sbin/httpd
46 ? S 0:00 /usr/sbin/httpd
130 ? Ss 0:00 sshd: root@pts/0
132 pts/0 Ss 0:00 -bash
145 pts/0 R+ 0:00 ps -ax
pstree
supervisord─┬─httpd───8*[httpd]
└─sshd───sshd───bash───pstree
#感想
めんどくさいです。。がしょうがない。
あとコンテナがrootで動くのはきついですね。
今後改善されるとうれしいですね。
#参考URL
http://memocra.blogspot.jp/2014/02/dockersupervisor.html
http://yss44.hatenablog.com/entry/2014/01/05/031736