COMPANY SERVICE STAFF BLOG NEWS CONTACT

STAFF BLOG

スタッフブログ

TECHNICAL

テクログ

2022.08.22

DockerでLaravel開発環境を作る

テクログdevelopment

はじめに

Docker勉強しないといけないなとは思いつつ、何から手をつけていいか分からない。
本を買ったり、調べたりしてみたものの結局よく分からない。
そんな状態からDBコンテナとPHP/Apacheコンテナを連携させて
ローカル開発環境を作れるようになるための必要最低限のことを書いていきます。

まずはこれらのイメージだけ持っておいてください

これから実際にDockerで開発環境を作るわけですが、お話のメインとなるのはDockerfileとdocker-compose.ymlの2ファイルになります。

DockerfileはDockerイメージの設計図のようなもので、Dockerfileからイメージを作ることをbuildすると言います。
ここでbuildしたイメージをもとにコンテナを生成、プロセスを起動することをrunと言います。
ここで重要なのはDockerfileからイメージが作られ、イメージからコンテナが作られることです。

また、docker-compose.ymlにはdocker composeコマンドの実行をするときの設定やコンテナの生成方法が記載されています。

docker-compose up 

でdocker-compose.ymlに沿って複数のコンテナを全部起動し、

docker-compose down

でdocker-compose.ymlに沿って複数のコンテナ全部停止・破棄します。

ここで注意が必要です。
docker-compose updocker-compose downは全部起動したり全部停止・破棄したりするだけですので、
起動中にdocker-compose.ymlを書き換えた場合、停止・破棄の段階で全部停止・破棄されなかったり、
誤って他のコンテナを削除してしまったりする恐れがあります。

実際にやってみる

こちらの記事を参考にさせていただきました。
Dockerで環境構築することを目的にできるだけ記述を少なくしました。

ディレクトリ構成

laravel_docker        
├─┬ apache/
│    └── default.conf
├─┬ php/
│    └── Dockerfile
├── mysql/
├── src/
└── docker-compose.yml

まずはこのディレクトリ構成と同じようにファイルやディレクトリを作ってください。

Dockerfile

Dockerfileにこのように書きます。

FROM php:8.0-apache

RUN apt update \
        && apt install -y \
            g++ \
            libicu-dev \
            libpq-dev \
            libzip-dev \
            libonig-dev \
            zip \
            zlib1g-dev \
        && docker-php-ext-install \
            intl \
            opcache \
            pdo \
            pdo_mysql \
            mysqli

WORKDIR /var/www/laravel_docker
RUN a2enmod rewrite

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

FROMでDockerHubからベースイメージをとってきます。
このイメージにさまざまなコマンドで変更を加えたものをDockerfileで定義することで、buildするイメージをカスタムできます。
続くRUNではDocker内でコマンドを実行します。コンテナに依存するライブラリやパッケージをインストールします。
ここではLaravelが依存するPHP拡張機能をインストールします。
WORKDIRでコンテナの作業ディレクトリを/var/www/laravel_dockerに移動します。
デフォルトでは/が設定されています。
次のRUNでmod_rewriteというパッケージを有効化しています。
これによって、URLの書き換えやリダイレクトが可能になります。
最後にRUNでComposer(PHPのパッケージ管理システム)をインストールします。

docker-comose.yml

次にdocker-compose.ymlにこのように書きます。

version: '3.8'

services:
  database:
    image: mysql:8
    container_name: database
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: laravel_docker
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - '4306:3306'
  php-apache:
    container_name: php-apache
    build:
      context: ./php
    ports:
      - '8080:80'
    volumes:
      - ./src:/var/www/laravel_docker
      - ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
    depends_on:
      - database

versionはスキーマバージョンを参照します。
servicesはサービスのリストを定義します。上に書いたものではdatebaseサービスとphp-apacheサービスが入っています。
サービス名はどのような名前でも良いです。 この名前は自動的にネットワークエイリアスとなります。
これらのサービスはdocker-compose upでコンテナとして立ち上がります。

上のファイルではphp-apacheサービスとdatabaseサービスは異なる定義になっています。
databaseコンテナではimageを指定していますが、php-apacheコンテナではビルドコンテキストにDockerfileを指定しています。

database

imageはコンテナのビルド元をDockerに認識させます。
この場合、DockerHubからmysqlをダウンロードしてきます。
:の横の数字はタグというものでバージョンを表記するために利用されることが多いです。
今回データベースとしてMySQLを使用します。
environmentには環境変数のリストを指定します。
volumesでコンピュータのディレクトリやファイルをコンテナのディレクトリやファイルにマウントできます。
portsはコンピュータのポートをコンテナのポートにマウントします。
マウントする場合、{コンピュータ側}:{コンテナ側}の形で指定します。
今回の場合、コンピュータ側の./mysqlはDBコンテナの/var/lib/mysqlにマウントされ、
コンピュータの4306番ポートはDBコンテナの3306番ポートにマウントされます。

php-apache

buildcontextに利用したいDockerfileが直下にあるディレクトリを指定します。
今回はphpディレクトリ直下にDockerfileがありますので、そこを指定しています。
portsに指定のあるようにコンピュータ側の8080番ポートが80番ポートにマウントされます。
今回、コンテナ側の/var/www/laravel_dockerディレクトリにLaravelアプリケーションを作ります。
なのでvolumesにあるように、この内容はコンピュータのsrcディレクトリに保存されます。
また、Apacheによってデフォルトで有効化されている000-default.conf
次に書くdefault.confをマウントすることでアプリケーションの仮想ホストの設定を同期します。
depends_onでサービス間の依存関係を示します。
これでphp-apacheコンテナより前にdatabaseコンテナを起動する必要があることをDockerに認識させます。

default.conf

最後にdefault.confを書きます。

<VirtualHost *:80>
    ServerName laravel_docker
    DocumentRoot /var/www/laravel_docker/public

    <Directory /var/www/laravel_docker>
        AllowOverride All
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>の部分で80番ポートへのアクセスについての設定であることを示しています。
docker-compose.ymlのphp-apacheコンテナのportsで指定のあるように
ホスト側で8080番にアクセスすると、コンテナの80につながります。
そこでこの<VirtualHost *:80></VirtualHost>の中に書かれた設定が適用されます。

サーバのホスト名はlaravel_dockerでWeb上に公開するのは/var/www/laravel_docker/publicです。
ディレクトリ/var/www/laravel_docker配下全てで.htaccessによる変更を許可しています。
エラーログは\${APACHE_LOG_DIR}/error.log、
アクセスログはnicknameがcombinedの書式で\${APACHE_LOG_DIR}/access.logに書き出されます。

これでファイルへの記述は終わりです。

Laravelアプリケーションの設定

ファイルの記述は終わりましたので、いよいよdocker composeコマンドを使って、php-apacheコンテナとDBコンテナを立ち上げましょう。
まずはdocker-compose.ymlのおいてあるディレクトリに移動します。
次に二つのコンテナを起動します。今回は初回の起動なので–buildオプションをつけてイメージの構築からコンテナの起動まで行います。
(–buildをつけない場合、キャッシュされたイメージからコンテナを起動します。なので1回目のbuildの後で起動する場合は速く起動できます。)
-dオプションはデタッチモード(バックグラウンド)で実行します。

cd laravel_docker
docker-compose up -d --build

コンテナを立ち上げたら、次はコンテナのなかに入って作業します。
以下のコマンドでphp-apacheコンテナに入ります。

docker-compose exec php-apache /bin/bash

execの後のphp-apacheはdocker-compose.ymlのサービス名に対応しています。
なのでDBコンテナに入りたい時は今回の場合php-apacheの部分をdatabaseとすれば良いです。
※入った後はexitで抜けれます。

php-apacheコンテナのなかに入ったら、作業ディレクトリがdocker-compose.ymlの./srcのマウント先と合っているか確認します。
確認できたらLaravelのプロジェクトを作成しましょう。

composer create-project laravel/laravel .



完了するとhttp://localhost:8080/を開いてみてください。
Laravelが動いているのを確認できると思います。
また、コンピュータ側のsrcディレクトリにLaravelのプロジェクトが作成されていることと思います。

src/.envの中のデータベースに関する部分を書き換えます。

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=laravel_docker
DB_USERNAME=root
DB_PASSWORD=secret

DB_PORTはdocker-compose.ymlのports、DB_DATABASEとDB_PASSWORDはenvironmentsに記載したものを書きます。
DB_USERNAMEにはrootと入れておきます。
これで開発環境ができました。
後はモデルやコントローラを作成し、好きなように開発してください。

まだコンテナから抜けていない場合、

exit

で抜けれます。

docker-compose down

でコンテナを全て停止・破棄します。

これでDockerとLaravelを使って環境を作れたと思います。

この記事を書いた人

だいすけ

入社年2021年

出身地大阪府

業務内容WEB開発

特技・趣味ゲーム、読書

テクログに関する記事一覧

TOP