クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

9.改善された開発環境を作成

こちらで公開しております。

https://bitbucket.org/FattyRabbit/docker-local-server/src/44ef00fc746dd683f8e42827300a533b2b3ad751/?at=releases%2Fphp-fpm_out_centos

bitbucket.org

前回の問題点

公開した「8.開発環境の完成」で複数のphp-fpmが一個のCentosに入ることで以下の問題点がありました。

  • 複数のphp-fpmのphpenvを利用したBuildが時間が掛かるし、Build設定などを調査して対応しないと行けない
  • 複数のphp-fpmをインストールするために色んなライブラリーやモジュールをインストールが必要でCentosが重くなる
  • 複数のphp-fpmで必要なライブラリーやモジュールのバージョンの違いでエラーが出る場合があって対応する必要がある
  • 必要がなくなったバージョンや新しくバージョンのインストールでウェブサーバーのDockerfileを修正・ビルドする場合がある

解決案

複数のphp-fpmを各自コンテイナーで動かしてサービスをしてCentosのbuild時間や負荷を減らしました。

ウェブ(Centos

php-fpmを複数インストールするためにanyenvやライブラリー部分を全部削除して最小限でDockerfileを作りました。

FROM centos:7
MAINTAINER kugyon.i <fatty.rabbit.75@gmail.com>

# Declare Arguments
ARG SERVER_NAME=local

# TimeZoneの設定
RUN rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo "LC_ALL=ja_JP.UTF-8" >> /etc/environment && \
    echo "LC_CTYPE=ja_JP.UTF-8" >> /etc/environment && \
    echo "LANG=ja_JP.UTF-8" >> /etc/environment
RUN localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP

# yumアップデート
RUN yum -y update
RUN yum -y remove httpd httpd.x86_64 httpd-tools.x86_64

# install leatest apache2.4.*
RUN yum install -y epel-release && \
    yum -y install https://repo.ius.io/ius-release-el7.rpm && \
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/ius.repo && \
    sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/epel.repo
RUN yum --enablerepo=epel -y install nghttp2 && \
    yum -y install epel-release && \
    yum -y install mailcap system-logos && \
    yum -y install openssl wget && \
    # Installing packages required for httpd 2.4.41
    wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/b/brotli-1.0.7-5.el7.x86_64.rpm && \
    rpm -Uvh brotli-1.0.7-5.el7.x86_64.rpm && \
    yum -y install brotli && \
    yum -y --disablerepo=base,extras,updates --enablerepo=ius install httpd mod_ssl && \
    yum clean all
RUN sed -i -e "s|LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|" /etc/httpd/conf.modules.d/00-mpm.conf && \
    sed -i -e "s|#LoadModule mpm_event_module modules/mod_mpm_event.so|LoadModule mpm_event_module modules/mod_mpm_event.so|" /etc/httpd/conf.modules.d/00-mpm.conf
RUN sed -i -e "s|LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so|" /etc/httpd/conf/httpd.conf && \
    sed -i -e "s|#LoadModule mpm_event_module modules/mod_mpm_event.so|LoadModule mpm_event_module modules/mod_mpm_event.so|" /etc/httpd/conf/httpd.conf
# make SSL server certificate
RUN mkdir -p /etc/ssl/private && \
    openssl req -new -newkey rsa:2048 -nodes -out /etc/ssl/private/server.csr -keyout /etc/ssl/private/server.key -subj "/C=JP/ST=TOKYO/L=SHIBUYA/O=Wiz Inc./OU=/CN=*.${SERVER_NAME}" && \
    openssl x509 -days 36500 -req -signkey /etc/ssl/private/server.key -in /etc/ssl/private/server.csr -out /etc/ssl/private/server.crt

COPY conf.d/vhosts.conf /etc/httpd/conf.d/vhosts.conf

RUN systemctl enable httpd

追加コンテイナー

複数php-fpm

出来ればdockerhubであるイメージをそのまま利用したかったですが、使用するモジュールによって設定が必要なのでDockerfileを作成しました。以下の7.1のDockerfileです。

FROM php:7.1-fpm

ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes

RUN apt-get update
RUN apt-get install -y wget libjpeg-dev libfreetype6-dev
RUN apt-get install -y gcc make libjpeg-dev zlib1g-dev mariadb-client libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev libzip-dev \
  && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install -j$(nproc) gd zip mysqli pdo_mysql bcmath

RUN pecl install xdebug \
  && docker-php-ext-enable xdebug

#Composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

COPY php.ini /usr/local/etc/php/

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

busybox

速度の改善で入れました。実際どのくらい影響されているかは計測しておりません。

mailhog

メールsmtpのコンテイナーです。テスト環境でテストメールの確認で便利です。

完成docker-compose.yml

version: "3"
services:
  datastore:
    image: busybox
    container_name: datastore
    volumes:
      - ../web_root:/var/www:rw
      - ./dba/mysql:/var/lib/mysql
  web:
    image: web
    build:
      context: ./web
      dockerfile: Dockerfile
    container_name: web
    ports:
      - "80:80"
      - "443:443"
    command: /sbin/init
    volumes:
      - ../web_root:/var/www:rw
      - ./web/conf.d/extra:/etc/httpd/conf.d/extra:ro
    tty: true
    stdin_open: true
    privileged: true
    restart: always
    external_links:
      - "php7.1-fpm"
      - "php7.2-fpm"
      - "php7.3-fpm"
      - "php7.4-fpm"
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.2

  dba:
    image: dba-mariadb
    build:
      context: ./dba
      dockerfile: Dockerfile
    container_name: dba
    ports:
      - "3306:3306"
    volumes:
      - ./dba/my.cnf:/etc/my.cnf
      - ./dba/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_ROOT_HOST: "172.16.0.%"
      TZ: Asia/Tokyo
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.3

  dns:
    image: andyshinn/dnsmasq
    container_name: dns
    ports:
      - "53:53/udp"
      - "53:53/tcp"
    volumes:
      - ./dns/dnsmasq.conf:/etc/dnsmasq.conf
      - ./dns/hosts-dnsmasq:/etc/hosts-dnsmasq
    restart: always
    cap_add:
      - NET_ADMIN
    networks:
      local-server-net:
        ipv4_address: 172.16.0.4

  mailhog:
    image: mailhog/mailhog:latest
    container_name: mailhog
    ports:
      - "1025:1025"
      - "8025:8025"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.5

  php7.1:
    image: fpm-php:7.1
    build:
      context: ./php-fpm
      dockerfile: 7.1_Dockerfile
    container_name: php7.1-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.6

  php7.2:
    image: fpm-php:7.2
    build:
      context: ./php-fpm
      dockerfile: 7.2_Dockerfile
    container_name: php7.2-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.7

  php7.3:
    image: fpm-php:7.3
    build:
      context: ./php-fpm
      dockerfile: 7.3_Dockerfile
    container_name: php7.3-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.8

  php7.4:
    image: fpm-php:7.4
    build:
      context: ./php-fpm
      dockerfile: 7.4_Dockerfile
    container_name: php7.4-fpm
    volumes:
      - ../web_root:/var/www
    external_links:
      - "dba"
    ports:
      - '9000'
    networks:
      local-server-net:
        ipv4_address: 172.16.0.9

networks:
  local-server-net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.0.0/24