9.改善された開発環境を作成
こちらで公開しております。
前回の問題点
公開した「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