Dockerで複数プロセスを扱う場合

Docker入門 Immutable Infrastructureを実現するを読んでおくと、理解が早いかもしれません。電子書籍だとタブレット一つで沢山持ち歩けるので便利ですよねd(^ー゜*)

概要

ココでは、ubuntu で、supervisorを用いて、nginx + php-fpm + postgersql を一つのdockerコンテナで、起動する方法を残します。ついでにsshでログインできるようにもしておきます。
Postgresqlは、imageを作成する際には、/var/share/pgsqlがVOLUMEマウントされていない状態なので、あえてここでDBの初期化等行っていません。HOST上の(永続化データ)を復元してから起動する想定になっています。
なので、事前にpostgresql9.3のDBをどちらかで作成してHOST側で /data/docker-share/webapp/pgsql 以下に配備しなければ、このコンテナを起動した際に、コンテナにsshして、supervisorctl status するとpostgresqlがFAILDとなっています。

この辺り、運用との絡みも出てくるので、ココでは触れません。
postgresqlのユーザIDは、apt-get install する際に100から順にインクリメントされた値となるようで、HOST側でchownしてもダメかも。また、Dockerfileではまだマウントされていないので、chownできない。
まだまだ、課題がのこっていそう。

環境

項目 内容
OS Ubuntu 14.04.3 LTS
middle ware nginx/1.4.6 (Ubuntu)
PHP 5.5.9-1ubuntu4.11
postgres (PostgreSQL) 9.3.9
ssh
docker version 1.5.0
ボリューム共有 HOST: /data/docker-share/webapp/
DOCKER: /var/share/

ファイル構成

[tvoncmeta {animated: “fast”} ] ./

  • Dockerfile
  • setfiles/
    • default
    • fastcgi.conf
    • supervisor/
      • cron.conf
      • nginx.conf
      • pgsql.conf
      • php.conf
      • ssh.conf

 [/tvoncmeta]

手順概要

  1. Dockerfileを作成する
  2. nginxの設定ファイルを作成する
  3. php-fpmの設定ファイルを作成する
  4. nginxのsupervisorのconfファイルを作成する
  5. cronのsupervisorのconfファイルを作成する
  6. php-fpmのsupervisorのconfファイルを作成する
  7. postgresqlのsupervisorのconfファイルを作成する
  8. sshのsupervisorのconfファイルを作成する
  9. docker buildする
  10. docker run して確認する

詳細手順

  1. Dockerfileを作成する
  2. FROM ubuntu
    
    RUN ln -sf /usr/share/zoneinfo/Japan /etc/localtime
    RUN apt-get update -y
    RUN apt-get update --fix-missing
    RUN apt-get install -y \
             bash \
             git \
             whois
    RUN apt-get install -y \
             php5 \
             php5-gd \
             php5-pgsql \
             php5-fpm \
             nginx
    RUN apt-get install -y \
             postgresql \
             postgresql-contrib
    RUN apt-get install -y \
             supervisor \
             ssh \
             cron
    RUN git config --global user.name "gitprep"
    RUN git config --global user.email "user1@localhost"
    
    # suvervisor
    RUN sed -i \
            -e 's/\/var\/log\/supervisor/\/var\/share\/logs/' \
            /etc/supervisor/supervisord.conf
    # ssh
    RUN mkdir -p /var/run/sshd
    RUN useradd user1
    RUN p=`echo user1 | mkpasswd -s` \
      ; sed -i \
        -e "s/user1:\!:/user1:${p}:/" \
        /etc/shadow
    RUN echo 'user1 ALL=(ALL:ALL) ALL' > /etc/sudoers.d/user1 \
      ; chmod 400 /etc/sudoers.d/user1
    RUN sed -i \
            -e 's/PermitRootLogin without-password/PermitRootLogin yes/' \
            /etc/ssh/sshd_config
    
    # Nginx php-fpm
    ADD ./setfiles/default      /etc/nginx/sites-enabled/default
    ADD ./setfiles/fastcgi.conf /etc/nginx/conf.d/fastcgi.conf
    RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    RUN mkdir -p /var/share
    RUN sed -i \
            -e 's/^listen = \/var\/run\/php5-fpm\.sock/listen = 127.0.0.1:9000/' \
            /etc/php5/fpm/pool.d/www.conf
    
    # PostgreSQL
    RUN sed -i \
            -e 's/# USER\tGROUP\tVERSION\tCLUSTER\tDATABASE/postgres\tpostgres\t9.3\tmain\tpostgres/' \
            /etc/postgresql-common/user_clusters
    RUN sed -i \
            -e 's/local *all *postgres *peer/local\tall\tpostgres\ttrust/' \
            -e 's/local *all *all *peer/local\tall\tall\ttrust/' \
            -e 's/host *all *all *127.0.0.1\/32 *md5/host\tall\tall\t127.0.0.1\/32\ttrust/' \
            /etc/postgresql/9.3/main/pg_hba.conf
    RUN sed -i \
            -e "s/^data_directory = '\/var\/lib\/postgresql\/9.3\/main'/data_directory = '\/var\/share\/pgsql'/" \
            /etc/postgresql/9.3/main/postgresql.conf
    
    ADD ./setfiles/supervisor/ssh.conf   /etc/supervisor/conf.d/
    ADD ./setfiles/supervisor/cron.conf  /etc/supervisor/conf.d/
    ADD ./setfiles/supervisor/nginx.conf /etc/supervisor/conf.d/
    ADD ./setfiles/supervisor/php.conf   /etc/supervisor/conf.d/
    ADD ./setfiles/supervisor/postgresql.conf /etc/supervisor/conf.d/
    
    EXPOSE 80
    ENTRYPOINT /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
  3. nginxの設定ファイルを作成する
  4. # vi ./setfiles/default
    server {
      listen   80;
      server_name default_server;
      root   /var/share/html;
      index  index.php index.html index.htm;
      location ~ \.php$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME /var/share/html$fastcgi_script_name;
        include         fastcgi_params;
      }
    }
    
  5. php-fpmの設定ファイルを作成する
  6. # vi ./setfiles/fastcgi.conf
    ---
    setfiles/fastcgi.conf
    fastcgi_intercept_errors        on;
    fastcgi_ignore_client_abort     off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    ---
    
  7. nginxのsupervisorのconfファイルを作成する
  8. # vi ./setfiles/supervisor/nginx.conf
    [program:nginx]
    command=/usr/sbin/nginx
    autorestart=true
    logfile_maxbytes=50MB
    logfile_backup=10
    stdout_logfile=/var/share/logs/%(program_name)s.log
    stderr_logfile=/var/share/logs/%(program_name)s.log
  9. cronのsupervisorのconfファイルを作成する
  10. # vi ./setfiles/supervisor/cron.conf
    [program:cron]
    command = /usr/sbin/cron -f -L 8
    startsecs = 5
    stopwaitsecs = 3600
    stopasgroup = false
    killasgroup = true
    logfile_maxbytes=50MB
    logfile_backup=10
    stdout_logfile=/var/share/logs/%(program_name)s.log
    stderr_logfile=/var/share/logs/%(program_name)s.log
    
  11. php-fpmのsupervisorのconfファイルを作成する
  12. # vi ./setfiles/supervisor/php.conf
    [program:php5-fpm]
    command=/usr/sbin/php5-fpm --nodaemonize
    user=root
    autostart=true
    autorestart=true
    redirect_stderr=true
    exitcodes=0
    logfile_maxbytes=50MB
    logfile_backup=10
    stdout_logfile=/var/share/logs/%(program_name)s.log
    stderr_logfile=/var/share/logs/%(program_name)s.log
    
  13. postgresqlのsupervisorのconfファイルを作成する
  14. # vi ./setfiles/superovisor/postgresql.conf
    [program:postgresql]
    user=postgres
    command=/usr/lib/postgresql/9.3/bin/postgres --config-file=/etc/postgresql/9.3/main/postgresql.conf
    process_name=%(program_name)s
    autostart=true
    autorestart=true
    redirect_stderr=true
    stopsignal=INT
    logfile_maxbytes=50MB
    logfile_backup=10
    stdout_logfile=/var/share/logs/%(program_name)s.log
    stderr_logfile=/var/share/logs/%(program_name)s.log
    
  15. sshのsupervisorのconfファイルを作成する
  16. # vi ./setfiles/supervisor/ssh.conf
    [program:sshd]
    command = /usr/sbin/sshd -D
    logfile_maxbytes=50MB
    logfile_backup=10
    stdout_logfile=/var/share/logs/%(program_name)s.log
    stderr_logfile=/var/share/logs/%(program_name)s.log
    
  17. docker buildする
  18. # mkdir -p /data/docker-share/webapp/logs
    # mkdir -p /data/docker-share/webapp/html
    # mkdir -p /data/docker-share/webapp/pgsql
    # docker build -t webapp:v1.0 .
    

    htmlファイルが無ければ

    # echo '< ?php phpinfo() ?>' > /data/docker-share/webapp/html/index.php
    # chown www-data:www-data /data/docker-share/webapp/html/index.php
    

    postgresql9.3のデータベースのバックアップを戻しておく

    # chown postgres:postgres /data/docker-share/webapp/pgsql
    # cd /data/docker-share/webapp/pgsql
    # bzip2 -dc path/backup.tar.bz2 | tar xpf -
    
  19. docker run して確認する
  20. # docker run \
      -d \
      --privileged \
      -p 80:80 \
      -p 1022:22 \
      --name webapp \
      -v /data/docker-share/webapp:/var/share:rw \
      webapp:v1.0
    # docker ps
    # docker logs 
    # ssh -p 1022 user1@localhost
    % sudo su
    # supervisorctl status
     ← アカンやつです。
    # supervisorctl reload
    

雑記

「君は「これまで」と「これから」を心配しすぎなんです。
言うでしょう?
昨日とは過去のもの、
明日とは未知のもの、
今日の日はもうけもの。
それは天の贈り物。」
@カンフーパンダ ウーグウェイ導師

The clock is running. Make the most of today.
Time waits for no man.
Yesterday is history.
Tomorrow is a mystery.
Today is a gift.
That’s why it is called the present.
@Alice Morse Earle 「Sun Dials and Roses of Yesterday: Garden Delights.」