nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

Mac + DockerToolbox 環境の Centos6 で Supervisor を使って複数のサービスを起動する 〜 sshd と named を起動する例

はじめに

  • Docker のコンテナでは複数のサービスを同時に立ち上げられないので、任意のプログラムをデーモン化して起動や停止を管理する Supervisor を利用して、Supervisor 経由で複数サービスを管理する。
  • Supervisor のパッケージは epel にあるが、バージョンが古く、サービスの再起動時にやたら時間がかかるなど動作がおかしいので、python のインストールツール easy_install 経由で導入する。

Dockerfile の用意

FROM centos:6

### sshd のインストール
RUN yum -y install initscripts MAKEDEV
RUN yum check
RUN yum -y update
RUN yum -y install openssh-server passwd

### sshd の設定
RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config

### sshd の起動準備
RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop

### パスワードなしで接続
RUN passwd -d root

### named のインストール
RUN yum install -y bind
RUN /etc/init.d/named start
RUN /etc/init.d/named stop

### Supervisor のインストール
RUN yum install -y wget
RUN wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python
RUN easy_install supervisor
COPY supervisord.conf /etc/supervisord.conf

CMD /usr/bin/supervisord -c /etc/supervisord.conf

Supervisor の設定ファイルの用意

  • Dockerfile と同じディレクトリに supervisord.conf として用意
[inet_http_server]
port=127.0.0.1:9001

[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (logging level;default info; others: debug,warn)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=http://127.0.0.1:9001

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

[program:named]
command=/usr/sbin/named -u named -f
process_name=%(program_name)s
numprocs=1
directory=/var/named
priority=100
autostart=true
autorestart=true
startsecs=5
startretries=3
exitcodes=0,2
stopsignal=TERM
stopwaitsecs=10
redirect_stderr=false
stdout_logfile=/var/log/named_supervisord.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB

イメージの作成

$ docker build -t centos:supervisor .

コンテナの起動

$ docker run -p 20022:22 -p 20053:53 -d centos:supervisor

接続確認

$ ssh -p 20022 root@127.0.0.1

サービスの管理

  • コンテナ上で実行
$ supervisorctl status #=> サービスの確認
$ supervisorctl restart named #=> サービスの再起動