Supervisordを使って複数のサービスを単一コンテナで起動する

Jul 8, 2015   #docker  #supervisord 

担当している案件で1コンテナで2サービスを動かす可能性があるので検証してみます。 本当は1コンテナ1サービスが理想ですが、無理に分解した結果わかりづらくなって人間が苦しむようじゃ本末転倒ですので、Supervisordを使って2サービス起動します。

※CentOS6.6で試してます。

コンテナを起動してsshdとhttpdを入れる

普通にコンテナを起動します。 ベースイメージはcentos:6を使いました。

また、sshdとhttpdの動作確認をしたいので、あらかじめポートを開放しておきます。

docker run -it -p 10022:22 -p 8080:80 --name svd-base centos:6

コンテナにsshdとhttpdを入れます。

yum install -y openssh openssh-server httpd

rootのパスワードを設定してsshdの設定、サービスの起動をします。

passwd root
sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
service sshd start
service httpd start

これで、<HOST>:10022にsshでログインできるはずです。 ブラウザでも<HOST>:8080アクセスしてみるとテストページが出ます。

supervisordを入れる

supervisordはeasy_installから入れられますが、epelリポジトリからも入れられます。 今回はepelから入れます。

yum install epel-release
yum install supervisor

設定ファイルである/etc/supervisord.confを編集します。 nodaemonをtrueにすることで、supervisordがフォアグラウンドで起動します。

[supervisord]
nodaemon=true

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

[program:httpd]
command=/usr/sbin/httpd -DFOREGROUND

コミットして再度コンテナを立ち上げる

一旦コミットしてイメージにしてから、起動時のコマンドでsupervisordを指定します。 また、動作確認時のポート開放を一旦閉じたいので、コミットしたらコンテナを停止しておきます。

docker commit svd-base tanksuzuki/svd-base
docker stop svd-base

それでは、superisordを指定してコンテナを立ち上げます。

docker run -it -p 10022:22 -p 8080:80 --name svd-run tanksuzuki/svd-base /usr/bin/supervisord

2015-07-08 01:09:28,853 CRIT Supervisor running as root (no user in config file)
2015-07-08 01:09:28,874 INFO /var/tmp/supervisor.sock:Medusa (V1.1.1.1) started at Tue Jul  8 01:09:28 2015
	Hostname: <unix domain socket>
	Port:/var/tmp/supervisor.sock
2015-07-08 01:09:28,938 CRIT Running without any HTTP authentication checking
2015-07-08 01:09:28,939 INFO supervisord started with pid 1
2015-07-08 01:09:28,944 INFO spawned: 'httpd' with pid 6
2015-07-08 01:09:28,957 INFO spawned: 'sshd' with pid 7
2015-07-08 01:09:30,040 INFO success: httpd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2015-07-08 01:09:30,040 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

なんかsshdとhttpdが起動した感がある出力がされていますね。 先ほどの動作確認時と同様、コンテナにSSHとHTTPでアクセスしてみてください。

おわりに

今回お試しでsshdとhttpdを単一コンテナで動かしてみました。

ですが、冒頭にも書いた通り基本は1コンテナ1サービスが理想なので使いすぎ注意です。 特にsshdをコンテナ内で動かすのはイマイチ感満載なのでおすすめはできません。

参考:Dockerコンテナ内でsshdを実行してはいけない理由