Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

Dockerで複数プロセスを起動する

一つのコンテナの中で、sshdを動かして、nginxを動かして、mysqlを動かして…みたいなことってやりたくなると思います。でも、Dockerでは、プロセスを起動させるコマンドを一つしか選択出来ない訳です。

CMD ["service","nginx","start"]
CMD ["/usr/sbin/sshd","-D"]

とか

RUN service nginx start
RUN /usr/sbin/sshd -D

みたいなことは出来ない訳です。ということで、Python製のプロセス管理ツールであるSupervisorを使って同時に起動させることが可能なコンテナを作りたいと思います。

ソースコードはこちらです

https://github.com/yss44/docker_supervisord

MacからSSH接続可能なDockerコンテナを作る。とかDockerでnginxサーバー立ててみた。あとDockerの使い方とか。で作成したコンテナをベースに作ってますので、そちらも参照してみてはいかがでしょうか。

環境:

Host: Ubuntu 12.04 Docker7.2

Container: CentOS6.4

Dockerfileはこんな感じ

# DOCKER-SUPERVISORD
#
# VERSION       1

FROM centos

MAINTAINER yoshiso

RUN yum -y update

#Dev tools for all Docker
RUN yum -y install git vim
RUN yum -y install passwd openssh openssh-server openssh-clients sudo

########################################## sshd ##############################################

# create user
RUN useradd yoshiso
RUN passwd -f -u yoshiso
RUN mkdir -p /home/yoshiso/.ssh;chown yoshiso /home/yoshiso/.ssh; chmod 700 /home/yoshiso/.ssh
ADD sshd/authorized_keys /home/yoshiso/.ssh/authorized_keys
RUN chown yoshiso /home/yoshiso/.ssh/authorized_keys;chmod 600 /home/yoshiso/.ssh/authorized_keys
# setup sudoers
RUN echo "yoshiso ALL=(ALL) ALL" >> /etc/sudoers.d/yoshiso

# setup sshd
ADD sshd/sshd_config /etc/ssh/sshd_config
RUN /etc/init.d/sshd start;/etc/init.d/sshd stop

########################################## Nginx ##############################################


# make sure the package repository is up to date
ADD nginx/nginx.repo /etc/yum.repos.d/nginx.repo
RUN chmod 0644 /etc/yum.repos.d/nginx.repo

# install memcached
RUN yum install -y nginx

ADD nginx/nginx.conf /etc/nginx/nginx.conf
Add nginx/default.conf /etc/nginx/conf.d/default.conf

# Nginx public directory

ADD nginx/src /var/www

#######################################  Supervisord  ########################################

RUN wget http://peak.telecommunity.com/dist/ez_setup.py;python ez_setup.py;easy_install distribute;
RUN wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py;python get-pip.py;
RUN pip install supervisor

ADD supervisor/supervisord.conf /etc/supervisord.conf

###################################### Docker config #########################################


# expose for sshd, nginx

EXPOSE 2222 80

CMD ["/usr/bin/supervisord"]

ADDしているファイルは、設定ファイルがメインですね。Dockerコンテナを作る前にテンプレートで作成しちゃって上書きする戦略を取ってます。ソースを見て頂くと、具体的に何かいてるか分かります。

そして今回の肝のSupervisordの設定。公式サイトのサンプルを見ながら設定。

/etc/supervisord.conf

[supervisord]
nodaemon=true

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

[program:nginx]
command=service nginx start

あとはコンテナをビルドすればイメージが完成しているはずです!

docker build -t yoshiso/supervisord .
docker run -p 80 -p 2222 -d yoshiso/supervisord
>XXXXXXXXXXXXXXXX

無事、コンテナが起動しました。ちゃんとサービスが動いているかテストしてみます。

docker inspect -format="{{ .NetworkSettings.IPAddress }}" XXXXXXXX
> XXX.XXX.XXX.XXX

ssh -p 2222 -i path/to/identifyfile yoshiso@XXX.XXX.XXX.XXX
>[yoshiso@f661560c7996 ~]$ 

curl http://XXX.XXX.XXX.XXX:80
>Hello,Nginx!

無事、サービスが動いていることが確認できました。 次は、Rails X Nginx X Unicorn でしっかり動かせるかどうかを確認してみようかと思います。徐々に開発環境を構築出来そうになって来た。。。