BackEnd

Laravelの開発環境をdocker-composeで一から構築してみる

投稿日:

はじめに

こんにちは。以前、LaradockでLaravelの開発環境を作っていました。ひとまずLaravelを触ってみたい時はそれで十分ですが、ほとんどチュートリアルのコピペで環境構築が終わってしまうので、dockerやdocker-composeが何をしているのかよく分からないままでした。

Laravel以外の環境構築もDockerで行えるようになっておきたいですし、今回は自力でdocker-composeを書いてローカル環境を構築してみます。

環境はmacOS High Sierra 10.13.6、Docker Desktop 2.0.0.2がインストール済みであることを前提とします。

nginxでwebサーバを立てる

適当なディレクトリを決めて、その中で作業します。どこでも構いませんが、今回は~/testとして、必要なコンテナを構築する情報をdocker-compose.ymlに記述していきます。

  • image: nginx:latestで、DockerHub上にあるnginxの最新版のDockerイメージを指定できます。ローカルにイメージがあればそれを使い、無ければダウンロードされます。
  • portsはそのままポート番号です。左側がホスト側、右側がコンテナ側です。上記の場合はいずれもhttp通信のデフォルトである80番を指定しています。
    例えば8000:80と記述した場合、ブラウザからアクセスする際はhttp://ホスト名:8000となります。
  • volumesでコンテナと共有したいパスを指定します。ホスト側で作成したdefault.confを、コンテナ側の同ファイルと置き換えます。
    ポートと同じくホスト側パス:コンテナ側パスの順で記述します。

default.conf作成

nginxの設定ファイルです。ひとまず最低限の設定のみ記述し、PHP関連の設定は後で追記します。

index.html作成

nginxの動作を確認できればよいので、htmlの中身は1行で構いません。

nginxコンテナ起動

ブラウザでhttp://localhostにアクセスしてHello nginx.の文字が出てくればOKです。

nginxでPHP-FPMを動作させる

docker-compose.yml編集

静的コンテンツが見れるようになりましたので、次はPHP-FPMです。docker-compose.ymlにPHP-FPMコンテナの情報を記述していきます。
また、nginxにもPHP-FPMとの関連性を追記します。

  • image: php:7.3-fpm-alpineで、nginxと同様にdockerhub上のイメージを指定します。PHP-FPMのイメージはたくさんあるのですが、ここでは軽量なalpine Linuxのイメージを使っています。
  • depends_on:はコンテナの依存関係を示します。上記のように記述することで「php-fpmコンテナが起動したらwebコンテナを起動する」という意味になり、起動の順番を制御できます。

default.conf編集

nginxの設定ファイルdefault.confにもPHP-FPMの設定を追記します。
fastcgi_passの項にPHP-FPMへの接続情報を記述します。docker-compose.ymlでPHP-FPMの名前として指定しているphp-fpmを記述し、PHP-FPMのデフォルトポートである9000番を指定します。

index.php作成

index.htmlと同様に、起動を確認できれば充分です。

コンテナ起動

初回起動ではイメージのダウンロードが実行されます。最後2行のdoneが表示されたら起動OKです。再度http://loalhostにアクセスしてみましょう。

MariaDBを立ち上げる

データベースはMariaDBを使用します。MySQLでも問題ありませんが、設定や接続方法はほとんど一緒(らしい)なので、試しに使ってみようという程度のチョイスです。

docker-compose.yml編集

db:以下がMariaDBに関する記述です。また、php-fpmにも上述のdepends_onを追記しています。

environment以下にMariaDBの情報を設定しています。MariaDB最新の10系はMySQL5.7がベースとなっており、MySQL用の設定がそのまま使えるようです。

  • MYSQL_ROOT_PASSWORD:rootユーザーの初期パスワードです。
  • MYSQL_USERroot以外の初期ユーザーを設定できます。
  • MYSQL_PASSWORD↑で設定した初期ユーザーのパスワードです。
  • MYSQL_DATABASEを指定することで、MariaDBコンテナに接続する際のデータベース名を定義できます。データベースが無い場合は作成されます。

コンテナ起動

docker-compose up -dでMariaDBコンテナも起動するようになります。

接続確認

PHPからMariaDBへの接続はLaravelインストール後に設定しますので、まずはMariaDBが立ち上がっていることの確認のみです。

Laravelインストール

ようやくLaravelです。ComposerやPHP拡張など、Laravelのインストールと動作に必要なパッケージを用意します。php-fpmコンテナの中でコマンドを実行してもよいのですが、docker-composeコマンド実行時に自動でよしなにやってくれるように、docker-compose.ymlを編集します。

php:7.3-fpm-alpineイメージには上述のパッケージが含まれていませんので、別途Dockerfileを作成し、そこにインストールコマンドを記述します。

build:に記述したパスにDockerfileを作成します。
$ mkdir ./docker/php && vi ./docker/php/Dockerfile

  • RUN以降をシェルコマンドとして、コンテナ起動時に実行します。
  • apk addでパッケージインストールを行います。alpine以外のイメージだと大抵はapt-getで、CentOSなどのRedHat系で言うyumですね。
  • $PHPIZE_DEPSを指定することで、phpizeに必要なパッケージが自動でインストールされます。phpizeはPHP拡張モジュールを動的にビルドするのに必要で、これがないとPHP拡張を導入する際、いちいちPHP本体をビルドし直すことになってしまいます。
  • pecl install xdebugはdockerとは関係なく、peclライブラリを入れる時のコマンドそのままですね。必要に応じてimagickやredisなどお好きなものを。
  • docker-php-ext-installでPHP拡張をインストールし、docker-php-ext-enableで有効化します。意味こそコマンド名そのままですが、dockerコンテナ上ではこういう書き方になるんですね。
    MariaDBはMySQL用のライブラリで接続可能ですのでpdo_mysqlを入れます。その他mbstringなど最低限必要そうなものを入れていますが、ここもお好みで。
  • RUN composerの行はLaravelのインストールを実行するコマンドです。testappはプロジェクト名ですので、ここは自由にどうぞ。

コンテナ再構築

docker-compose up -dを実行しましょう。パッケージのダウンロード/インストール/ビルドが一斉に走りますので、結構かかります。
上述のDockerfileの最後にLaravelインストールのコマンドを記述すればコンテナ構築と同時にインストールも実行されますが、Dockerfileに書くとコンテナ起動時に毎回Laravelのインストールが走ってしまうので、あとでコンテナに入って実行します。

Laravelインストール

ここでもLaravelが依存するComposerのパッケージ群がモリモリ入りますので、数分お待ち下さい。

Laravelのwelcomeページを表示する

Laravelの公開ディレクトリをドキュメントルートにするため、default.confを編集します。locationの中に下記の1行を追記し、docker-compose restartで変更を反映してください。

LaravelからMariaDBに接続する

Laravelプロジェクト内の.envファイルに、docker-compose.ymlで設定した接続情報を記述します。DB_HOSTにはMariaDBのコンテナ名が入ります。この場合はdbですね。

マイグレーション実行

php-fpmコンテナ内で実行します。DB接続に成功すれば、最初から入っているマイグレーションファイルが実行されます。

上記のようなメッセージが表示されればOKです。お疲れ様でした。

さいごに

Laradockはチュートリアルが充実していたおかげで、docker-composeについてはほぼ知識ゼロでも構築ができてしまっていました。今回docker-compose.ymlを調べながら一項目ずつ書くことで、それぞれがどのような意味で何が実行されているのか、多少は把握することができるようになりました。

おすすめ書籍

Docker/Kubernetes 実践コンテナ開発入門 PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

         

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


  1. YAT より:

    Laravelインストールの項目で用意する ./docker/php/Dockerfile の5行目にある
    curl-devel
    でエラーが出て、これは正しくは
    curl-dev
    でしょうか?

    調べると teratail の記述のアンサーで解決できたのでお知らせさせていただきました。
    https://teratail.com/questions/310977

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

laravel logo

Laravel SailでDocker環境構築

1 はじめに2 Laravel Sailの基本2.1 Dockerの構成2.2 コンテナの起動・停止2.3 sailで使用できるコマンド3 Laravel Sailの設定3.1 ポートフォワードの設定 ...

PHPerだけどKotlinを勉強したって良いよね その1〜クラス編〜

1 はじめに2 インターフェース2.1 基本2.2 デフォルト実装付メソッド2.3 同じメソッド名を持つ複数のインターフェース3 修飾子3.1 open3.2 abstract4 可視性修飾子5 さい ...

Go言語

GoのWeb Application Framework

1 はじめに2 代表的なGoのWAF2.1 軽量なWAF2.2 フルスタックなWAF3 Ginを使ってみる3.1 クエリパラメータ+ポストパラメータ3.2 ファイルアップロード3.3 URLのグループ ...

Vue.js+TypeScriptな環境整備

1 はじめに2 vue-cliのインストール3 プロジェクトの作成3.1 機能の選択3.2 シンタックスの選択3.3 CSSプリプロセッサの設定3.4 Unit test3.5 E2E test3.6 ...

js

TypeScriptでJavaScriptのライブラリを使用するには?

1 はじめに2 対応方法2.1 npmで@typesからインストールする2.2 自分で型定義ファイルを作る3 Declaration Space3.1 Type Declaration Space3. ...

フォロー

follow us in feedly

blog-page_side_responsive

2019年3月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。