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 でしっかり動かせるかどうかを確認してみようかと思います。徐々に開発環境を構築出来そうになって来た。。。