/dev/null

脳みそのL1キャッシュ

DockerでLaravelの開発環境を整える

はじめに

Laravelの開発環境を作らないといけなくなったんですけど、環境構築でPC内を汚したくない…

ということで、Dockerの勉強がてら、Laravelの環境構築をDockerでやってみました。

成果物はこちらです。

変更履歴

構成

とりあえず、docker-compose.ymlを見てもらった方がはやい。

version: '3'

services:
  web:
    image: nginx
    container_name: web
    ports:
      - 8080:80
    volumes:
      - ../app:/var/www/app
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

  app:
    build: ./php
    image: php-dev
    container_name: app
    volumes:
      - ../app:/var/www/app
    working_dir: /var/www/app
    depends_on:
      - db

  db:
    image: mysql:8
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: app_root_pass
      MYSQL_DATABASE: app
      MYSQL_USER: app_user
      MYSQL_PASSWORD: app_pass
      TZ: 'Asia/Tokyo'
    ports:
      - 13306:3306
    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf

  cache:
    image: redis
    container_name: cache

コンテナは4つあり、それぞれWebサーバ用、PHP用、データベース(MySQL)用、キャッシュ(Redis)用です。

PHP用のコンテナのみ、Dockerfileからビルドしたイメージを利用しています。Dockerfileの中身は以下の通り。

FROM php:7.4-fpm

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

RUN apt-get update \
  && apt-get install -y libzip-dev zlib1g-dev mariadb-client unzip git \
  && git clone -b 5.2.1 --depth 1 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis \
  && docker-php-ext-install zip pdo_mysql redis \
  && pecl install xdebug \
  && docker-php-ext-enable xdebug

ENV COMPOSER_ALLOW_SUPERUSER=1
ENV COMPOSER_NO_INTERACTION=1
ENV COMPOSER_HOME=/usr/local/share/composer
ENV PATH $PATH:$COMPOSER_HOME/vendor/bin

RUN mkdir -p /usr/local/share/composer \
  && curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer \
  && composer global require laravel/installer

EXPOSE 9001

composerlaravle/installerlaravel/lumen-installerをインストールしているので、コンテナを起動した直後から以下のコマンドを利用できます。

  • composer
  • laravel
  • lumen

また、リモートデバッグ用にPHPの拡張モジュールであるXdebugもインストールしてあります。

使い方

イメージのビルドとコンテナの起動

まずはプロジェクト用のディレクトリを用意します。appディレクトリ内にLaravelのコードが入ることになります。

$ mkdir project
$ mkdir project/app

次に、環境構築用のファイル一式をgit cloneします。

$ git clone https://github.com/d2verb/docker-php-template project/docker

この時点で、projectディレクトリ以下のこのようになっていると思います。

$ tree project
project
├── app
└── docker
    ├── README.md
    ├── db
    │   └── my.cnf
    ├── docker-compose.yml
    ├── php
    │   ├── Dockerfile
    │   └── php.ini
    └── web
        └── default.conf

5 directories, 6 files

次に、Dockerイメージをビルドし、コンテナを立ち上げます。

$ cd project/docker
$ docker-compose build
Creating network "docker_default" with the default driver
Creating cache ... done
Creating db    ... done
Creating app   ... done
Creating web   ... done
$ docker-compose up -d

以下のように、ちゃんとコンテナが起動できていたらOKです。

$ cd project/docker
$ docker-compose ps
Name               Command               State                 Ports               
-----------------------------------------------------------------------------------
app     docker-php-entrypoint php-fpm    Up      9000/tcp, 9001/tcp                
cache   docker-entrypoint.sh redis ...   Up      6379/tcp                          
db      docker-entrypoint.sh mysqld      Up      0.0.0.0:13306->3306/tcp, 33060/tcp
web     nginx -g daemon off;             Up      0.0.0.0:8080->80/tcp   

Laravelプロジェクトの生成と設定

コンテナを立ち上げた状態で以下のコマンドを実行します。

$ cd project/docker
$ docker-compose exec app laravel new

そうすると、projectディレクトリ以下はこのようになると思います。appディレクトリ以下にLaravelのコードが生成されていますね。

$ tree -L 2 ./project
./project
├── app
│   ├── app
│   ├── artisan
│   ├── bootstrap
│   ├── composer.json
│   ├── composer.lock
│   ├── config
│   ├── database
│   ├── package-lock.json
│   ├── package.json
│   ├── phpunit.xml
│   ├── public
│   ├── resources
│   ├── routes
│   ├── server.php
│   ├── storage
│   ├── tests
│   ├── vendor
│   └── webpack.mix.js
└── docker
    ├── README.md
    ├── db
    ├── docker-compose.yml
    ├── php
    └── web

15 directories, 11 files

次に、MySQLやRedisに接続できるように.envファイルを編集します。

diff --git a/.env.example b/.env
index ac74863..729519e 100644
--- a/.env.example
+++ b/.env
@@ -1,25 +1,25 @@
 APP_NAME=Laravel
 APP_ENV=local
-APP_KEY=
+APP_KEY=CENSORED(自身のAPP_KEYを設定してください)
 APP_DEBUG=true
 APP_URL=http://localhost
 
 LOG_CHANNEL=stack
 
 DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
+DB_HOST=db
 DB_PORT=3306
-DB_DATABASE=laravel
-DB_USERNAME=root
-DB_PASSWORD=
+DB_DATABASE=app
+DB_USERNAME=app_user
+DB_PASSWORD=app_pass
 
 BROADCAST_DRIVER=log
-CACHE_DRIVER=file
+CACHE_DRIVER=redis
 QUEUE_CONNECTION=sync
 SESSION_DRIVER=file
 SESSION_LIFETIME=120
 
-REDIS_HOST=127.0.0.1
+REDIS_HOST=cache
 REDIS_PASSWORD=null
 REDIS_PORT=6379

php artisan migrateを実行してみて、以下のようなメッセージが表示されたらデータベースへの接続ができている証拠です。

$ cd project/docker
$ docker-compose exec app php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

最後に、http://localhost:8080にアクセスしてみましょう。Laravelのデフォルトページが表示されたら成功です。

おわりに

これでホスト環境を汚さずにLaravelの開発環境を構築することができました。思う存分開発に集中できますね。

参考文献