m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Dockerfileでsupervisordを使用してhttpdやmysqlなどを自動起動する

Dockerでは1つのプロセスしか動かない

とか言われているのでsupervisordを使用してまとめてプロセスを動かそうとしてるらしい

上記を元に作成

Dockerfile
# centos
FROM mshige1979/centos:centos6
MAINTAINER mshige1979

# pacakge install
RUN yum install -y \
  openssh-server \
  httpd \
  supervisor

# mysql
RUN yum install -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
RUN yum install -y mysql-community-*

# php
RUN yum install -y --enablerepo=remi-php56 \
  php \
  php-opcache \
  php-devel \
  php-mbstring \
  php-mcrypt \
  php-mysqlnd \
  php-phpunit-PHPUnit \
  php-pecl-xdebug \
  php-pecl-xhprof

# sshd init
RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo 'root:root' | chpasswd
RUN ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key

# php
RUN echo '<?php phpinfo(); ?>' > /var/www/html/info.php

# mysql init
RUN /etc/init.d/mysqld start \
  && mysqladmin -u root password 'password' \
  && (echo 'grant all privileges on *.* to root@"%" identified by "password" with grant option;' | mysql -u root -ppassword) \
  && /etc/init.d/mysqld stop

# supervisord init
RUN echo '' >> /etc/supervisord.conf && \
    echo '[program:httpd]' >> /etc/supervisord.conf && \
    echo 'command=/usr/sbin/httpd -D FOREGROUND' >> /etc/supervisord.conf && \
    echo '' >> /etc/supervisord.conf && \
    echo '[program:sshd]' >> /etc/supervisord.conf && \
    echo 'command=/usr/sbin/sshd -D' >> /etc/supervisord.conf && \
    echo '' >> /etc/supervisord.conf && \
    echo '[program:mysqld]' >> /etc/supervisord.conf && \
    echo 'command=/usr/bin/mysqld_safe' >> /etc/supervisord.conf && \
    echo '' >> /etc/supervisord.conf

# port
EXPOSE 22 80 3306

# run
CMD ["/usr/bin/supervisord", "-n"]

起動

supervosrpd
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                   NAMES
869f3f87b74d        mshige1979/lamp     "/usr/bin/supervisord"   2 seconds ago       Up 2 seconds        0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp, 0.0.0.0:13306->3306/tcp   stupefied_mccarthy
$

※起動しています

httpd(php)
$ curl -LI http://192.168.99.100:10080/info.php -o /dev/null -w '%{http_code}\n' -s
200
$

※アクセスできる

mysql
$ mysql -uroot -h 192.168.99.100 -P 13306 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> quit
Bye
$
sshd
$ ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  root@192.168.99.100 -p 10022
Warning: Permanently added '[192.168.99.100]:10022' (RSA) to the list of known hosts.
root@192.168.99.100's password:
Last login: Thu Nov 12 12:42:41 2015 from 192.168.99.1
[root@869f3f87b74d ~]# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 /usr/bin/python /usr/bin/supervisord -n
    7 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
    8 ?        S      0:00 /usr/sbin/sshd -D
    9 ?        S      0:00 /bin/sh /usr/bin/mysqld_safe
   55 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   56 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   57 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   58 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   59 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   71 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   72 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
   73 ?        S      0:00 /usr/sbin/httpd -D FOREGROUND
  155 ?        Sl     0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mys
  192 ?        Ss     0:00 sshd: root@pts/0
  194 pts/0    Ss     0:00 -bash
  205 pts/0    R+     0:00 ps ax
[root@869f3f87b74d ~]#
[root@869f3f87b74d ~]# exit
logout
Connection to 192.168.99.100 closed.
$

※hostに覚えさせないようにオプションを指定してログインしています、まあdocker execでもいいかもしれませんけど。

所感

結構ここまでいくのにいろいろ試して結構面倒でした。
supervisordを経由して起動できそうなものなら動かせそうです。
デプロイなどではある程度のベースの環境を用意してやるのでcentosなどのベースから毎回1つずつでもいいような気がします。

まあ、もう少し検討してみよう