Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした