LoginSignup
16
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-19

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の起動スクリプト作成

起動スクリプト作成

/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

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

/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

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

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17