dockerコンテナで複数サービスを起動させる


#Intro
dockerを使ってwebアプリの開発環境作ってますがサービス同時
起動ができないのでめんどくさいです。

supervisordを使ってやってみます。

docker runするときのコマンドに/sbin/init渡して複数起動させる
形式も試しましたがきちんと子プロセスを殺せず
defunctを量産したのでやめました。

#前提
* MaxOS + boot2docker上のDockerでやってます
* dockerの環境セットアップなどは割愛します
* コンテナ側osはcentos6.6

#手順

##1.適当なコンテナを立ち上げる
このコンテナはまっさらのcentos6イメージです。(何もインストールされてない）

```bash
docker run -itd --name devutil centos:centos6 /bin/bash
```

##2.関連するツールを入れる
```bash
#めんどくさいのでまとめて入れる
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の起動スクリプト作成

起動スクリプト作成

```bash:/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
```

```bash
chmod 755 /etc/init.d/supervisord
```

##4.supervisorの設定ファイルを書く

```bash:/etc/supervisord.conf
[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ポートでブラウザでアクセス
![スクリーンショット 2015-02-20 3.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/56598/402c1331-f84c-b3ce-5e08-104bb56d0279.png)

boot2dockerのip経由で5102ポートでsshログイン

```
ssh root@192.168.59.103 -p 51022
```

ができればOK

試しにコンテナ側のプロセス確認。ちゃんと動いてますね。

```bash
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

```


```bash
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