私は、今までLaravelを触る時、開発環境はLaradockを選択していました。
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に変更しました。
以下、参考にさせていただきました。
あと、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のネットワークとボリュームもキレイになりました。(めでたし、めでたし)