Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って初めたブログ

(Laravel第7回目)Laradockを使うのを辞めた話

私は、今までLaravelを触る時、開発環境はLaradockを選択していました。

github.com

Laradockはとても便利です。
最初からLaravelの環境構築用のDockerfileやdocker-compose.yamlが用意されており、Dockerの動かし方さえ知っていればすぐにLaravelの環境を構築する事できます。
あまりに便利なので、私はLaravelを触る時は常にLaradockを使用していました。

しかし、あるタイミングで以下2点に不満を感じ始め、Laradockを使うのを辞めて自分自身でDockerfileやdocker-compose.yamlを作ることにしました。

  • Laradockのdocker-compose.yamlに対して、少し修正を加えようとするだけで大変。
  • Laradockで作られるDockerのネットワークやボリュームが多く、ローカル環境が汚くなるのが嫌。

Laradockは、様々なLaravelの環境構築パターンに対応できる様、Dockerfileとdocker-compose.yamlに多くのアプリケーションが記載されています。
そのため、docker-compose.yamlに対して、ちょっと修正を加えようとするだけで大変だったり、Docker実行時に作られるネットワークやボリュームが多く、あとで見返した時に「あれ?これいつ作ったっけ?」となります。

ちなみにLaradockで作られるボリュームはこんな感じ・・・(うーん、キレイにしたい・・・)

$ docker volume ls
DRIVER              VOLUME NAME
local               laradock_adminer
local               laradock_aerospike
local               laradock_caddy
local               laradock_elasticsearch
local               laradock_mariadb
local               laradock_memcached
local               laradock_minio
local               laradock_mongo
local               laradock_mosquitto
local               laradock_mssql
local               laradock_mysql
local               laradock_neo4j
local               laradock_percona
local               laradock_phpmyadmin
local               laradock_postgres
local               laradock_redis
local               laradock_rethinkdb
local               laradock_sonarqube

というわけで、結局は自分でDockerfileやdocker-compose.yamlを作るのが一番良いのでは?と思い、作ることにしました。
作ったものは以下の通りです。

php-fpm + Nginx + PostgreSQLのシンプルな構成。"/tmp"やPHPとNginxの各種ログを"/logs"で参照できるようにしました。

■ docker-compose.yaml

version: "3.5"
services:
  app:
    build:
      context: .
    container_name: app
    volumes:
      - ./html:/var/www/html
      - ./tmp:/tmp
      - ./logs/php:/var/log/php
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    env_file: .env
    networks:
      - bridge-network

  web:
    image: nginx:1.17-alpine
    container_name: httpd
    depends_on:
      - app
    ports:
      - 80:80
    volumes:
      - ./html:/var/www/html
      - ./tmp:/tmp
      - ./logs/nginx:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - bridge-network

  db:
    image: postgres:9.6
    container_name: db
    volumes:
      - postgres-data-volume:/var/lib/postgresql/data:rw
      - ./postgres_init/:/docker-entrypoint-initdb.d
    ports:
      - 5432:5432
    env_file: .env
    networks:
      - bridge-network

networks:
  default:
    external:
      name: bridge
  bridge-network:
    name: container-link
    driver: bridge

volumes:
  postgres-data-volume:
    name: postgres-data
    driver: local

Dockerfileでは、php-fpmの設定を記載。
alpineベースのDockerイメージを使うとタイムゾーンがデフォルトUTCになっているとのことで、Asia/Tokyoに変更しました。
以下、参考にさせていただきました。

qiita.com

あと、composerとpostgresql-clientのインストールは忘れずに・・・

■ Dockerfile

FROM php:7.3-fpm-alpine

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_NO_INTERACTION 1

RUN set -eux && \
  apk add --update-cache --no-cache --virtual=.build-dependencies tzdata && \
  cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
  apk del .build-dependencies && \
  apk --no-cache add bash postgresql-dev && \
  docker-php-ext-install pdo pdo_pgsql pgsql mbstring && \
  curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && \
  apk add postgresql-client

.envでは、環境変数を定義。
Laravelの"/storage"フォルダの場所は変更できるようにしておくきました。HerokuやGAE等のPaaSへのデプロイ時に便利です。

■ .env
POSTGRES_DB=laravel
POSTGRES_USER=laravel
POSTGRES_PASSWORD=laravel
POSTGRES_ROOT_PASSWORD=root

APP_STORAGE=/tmp

あとは参考までに、php.iniファイルとNginxのdefault.confをのせておきます。

■ php.ini

error_reporting = E_ERROR | E_WARNING | E_PARSE | E_NOTICE
display_errors = stdout
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
upload_max_filesize = -1
memory_limit = -1
post_max_size = 100M
max_execution_time = 900
max_input_vars = 100000
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mbstring]
mbstring.language = Japanese
■ default.conf

server {
    listen 80;
    root /var/www/html/public;
    index index.php;
    charset utf-8;
    server_name localhost;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        root /var/www/html/public;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

シンプルな構成ですが、Laradockを使用していた時よりも動作が軽くなり、Dockerのネットワークとボリュームもキレイになりました。(めでたし、めでたし)