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です。
マッピングされたポートをつかってブラウザアクセスしてみます。
おお!確認できました!
これで複数のサービスが起動したコンテナを作れます。
今回は、以上です。